关于Java内部类的初始化

Java类的位置

1、在同个Java文件中,但不是内部类

public class Test {

}
class T{

}
  • 这里的T不是内部类,只是在Test.java文件的内部而已。
  • T 的修饰符只允许使用“public”、“abstract”和“final”。
  • T的实例化过程和主类没有区别
T t = new T();

就可以,在本Java文件和其他Java文件都是这样实例化。但是要注意,由于没有权限修饰符是默认包访问权限,所以只能在包内实例化。

2、常规内部类

public class Outter{
    class Inner {}
    public void fun(){
        Inner in = new Inner();
    }
    public void fun2(){
        Outter out = new Outter();
        Outter.Inner in = out.new Inner();
        Outter.Inner in2 = new Outter().new Inner();
    }
}

要实例化内部类对象,必须先有外部类对象,通过外部类对象.new 内部类();来实例化内部类对象,在其他文件或者其他包内都是这样,只是要能在其他包实例化的话,内部类Inner还得加上修饰符public。

3、静态内部类

class Outter {
    private static int age = 12;
    static class Inner {
        public void print() {
            System.out.println(age);
        }
    }
}

public class test1 {
    public static void main(String[] args) {
        Outter.Inner in = new Outter.Inner();
        in.print();
    }
}

实例化静态内部类和实例化常规内部类有类似的地方,而不同之处在与静态内部类由于是静态的,所以不需要外部类对象就可以实例化,如上例Outter.Inner in = new Outter.Inner();
在其他Java文件也是这么实例化的。

4、局部内部类

    public class A {  
        class B {  

        }  

        public void pint() {  
            class C {  
            }  
            new C();  
        }  

        public void pint(boolean b) {  
            if (b) {  
                class D {  
                }  
                new D();  
            }  
        }  
    }  

局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内,所以只能在方法或者该作用域内实例化。

5、匿名内部类

new ClassOrInterfaceName(){
    /*类体*/ }

匿名内部类可以继承一个类或实现一个接口,这里的ClassOrInterfaceName是匿名内部类所继承的类名或实现的接口名。但匿名内部类不能同时实现一个接口和继承一个类,也不能实现多个接口。如果实现了一个接口,该类是Object类的直接子类,匿名类继承一个类或实现一个接口,不需要extends和implements关键字。

上一篇:Hybrid assembly with long and short reads improves discovery of gene family expansions


下一篇:JVM笔记5-对象的访问定位。