一.成员内部类

成员内部类也是最普通的内部类,它是外围类的一个成员。

在成员内部类中要注意两点,第一:成员内部类中不能存在任何static的变量和方法;第二:成员内部类是依附于外围类的,所以只有先创建了外围类才能够创建内部类。

public class TestInnerClass {
    public static void main(String[] args) {
        //创建非静态内部类的对象
        Person p = new Person();
        Person.Computer pc = p.new Computer();
        pc.setName(\"IBM\");
        //System.out.println(pc.getName());
    }
}
 class Person {
    private String name = \"张三\";
    private int age;
    
    public Person() {
        super();
    }

    public Person(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    
    public class Computer{
        private String name = \"lenovo\";

        public String getName() {
            return name;
        }

        public void setName(String name) {
            System.out.println(\"setName 方法局部变量name: \" + name);
            System.out.println(\"Computer 的属性name:\" + this.name);
            System.out.println(\"外部内Person 属性的name:\" + Person.this.name);
            this.name = name;
        }
        
    }
    
}

二.局部内部类

有这样一种内部类,它是嵌套在方法和作用于内的,对于这个类的使用主要是应用与解决比较复杂的问题,想创建一个类来辅助我们的解决方案,到那时又不希望这个类是公共可用的,所以就产生了局部内部类,局部内部类和成员内部类一样被编译,只是它的作用域发生了改变,它只能在该方法和属性中被使用,出了该方法和属性就会失效。(做Java后端 用法极少见 本人三年开发 从没见过有人用过)

public class TestInnerClass2 {
    
    //局部内部类:如下方式使用非常的少
    private void show(){
        
        class Inner{
            
        }
    }

    //如果一个类仅适用于当前方法时,可以声明如下方式
    public static Comparator getComparator(){
        
        class MyComparator implements Comparator{

            @Override
            public int compare(  o1,   o2) {
                return 0;
            }
            
        }
        return new MyComparator();
    }

    
    public static void main(String[] args) {
        Comparator comparator = TestInnerClass2.getComparator();
    }
}

三.匿名内部类

注意:

  • 1.匿名内部类是没有访问修饰符的
  • 2.想使用外部的一个变量 该变量要用final修饰 -java8开始不需要
public class TestInnerClass2 {
    
    public static Comparator getComparator1(){
        
        Comparator com = new Comparator(){ //匿名内部类实现的Comparator接口,new的是匿名内部类的构造器

            @Override
            public int compare(  o1,   o2) {
                // TODO Auto-generated method stub
                return 0;
            }
            
        };
        
        return com;
    }
    
    public static void main(String[] args) {
        Comparator comparator = TestInnerClass2.getComparator1();
        /*  comparator.compare(o1, o2);*/
    }
}

四.静态内部类

在java提高篇-----关键字static中提到Static可以修饰成员变量、方法、代码块,其他它还可以修饰内部类,使用static修饰的内部类我们称之为静态内部类,不过我们更喜欢称之为嵌套内部类。静态内部类与非静态内部类之间存在一个最大的区别,它是属于类本身,而不是某个对象。

public class TestInnerClass {
    public static void main(String[] args) {
        //创建静态内部类的实例
        Person.Mobile pm = new Person.Mobile();
        pm.show();
    
    }
}

class Person {
    
    //静态内部类
    static class Mobile{
        public void show(){
            System.out.println(\"这是静态内部类的方法\");
        }
    }
    
}

五.内部类标识符

由于每个类都会产生一个.class文件,其中包含了如何创建该类型的对象的全部信息。您可能猜到了,内部类也必须生成一个.class文件以包含它们的Class对象信息。这些类文件的命名有严格的规则:外围类的名字,加上$,再加上内部类的名字。
如果内部类是匿名的,编译器会简单地产生一个数字作为其标识符。

收藏 打印