java基础——java的四种内部类

1.成员内部类

1.1 拥有类的所有访问权限

成员内部类可以无条件访问外部类所有的成员属性和成员方法(包括private成员和静态成员

1.2 访问同名成员要用this

说过要访问外部类的同名成员,要用以下新式访问

  • 外部类.this.成员变量
  • 外部类.this.成员方法

1.3 外部类访问要先创建对象

在外部类中如果要访问成员内部类的成员,必须先创建一个成员内部类的对象,再通过指向这个对象的引用来访问

1.4 创建成员内部类要有外部类对象

Outter outter = new Outter();
Outter inner inner = outter.new inner()

1.5 内部类可以有所有访问权限

内部类可以拥有private,protected,public,包权限

1.6 总体实践代码

public class Test {
    public String a = "aa";
    private String b;

    public class PublicClass{
        public PublicClass() {
        }
        public String a = "bb";
        public void test(){
            System.out.println(this.a);
            System.out.println(Test.this.a);
        }
    }
    private class privateClass{

    }
    protected class protectedClass{

    }

    public static void main(String[] args) {
        Test test = new Test();
        Test.PublicClass aa = test.new PublicClass();
        aa.test();
    }
}

2.局部内部类

局部内部类就像是方法里面的一个局部变量,不能有public,protected,private以及static修饰符

 //测试局部内部类
    public void test() {
//        编译报错
//        public class jubuClass{
//
//        }
        class jubuClass {
            public void test() {
                System.out.println(Test.this.a);
            }
        }
    }

3.匿名内部类

  • 匿名内部类不能有修饰符和static修饰符
  • 匿名内部类没有构造器
  • 匿名内部类不能定义任何静态成员、方法
  • 匿名内部类必须实现接口或抽象父类的所有抽象方法
    interface HelloWorld {
        public void greet();
        public void greetSomeone(String someone);
    }
    //测试匿名类
    HelloWorld helloWorld = new HelloWorld() {
        @Override
        public void greet() {
        }
        @Override
        public void greetSomeone(String someone) {
        }
    };

4.静态内部类

  • 静态内部类不需要依赖外部类
  • 不能使用外部类非静态的成员变量和方法
    public String a = "aa";
    public static String c = "cc";
    private String b;

    static class staticTest{
        public void test(){
            c = "aaa";
            //编译不通过
            a = "ccc";
        }
    }