内部类的共性内部类分为:成员内部类、静态嵌套类、匿名内部类(直接new抽象类,直接new接口类)。
如果是函数式接口,可以使用lambda表达,这样可以避免new接口产生内部匿名类
(1)、内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但还是前面冠以外部类的类名和$符号。
(2)、内部类不能用普通的方式访问。内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,无论是否是private的。
(3)、外部类不能直接访问其内部类,想要访问内部类,需要实例化内部类 示例如下
public class Outter {
//Inner为成员内部类
class Inner {
}
public void show() {
Inner in = new Inner();
}
}
(4)、内部类声明成静态的,就不能随便的访问外部类的成员变量了,此时内部类只能访问外部类的静态成员变量。
(5)、其他类想要直接访问内部类,可直接实例化内部类,方法如下:
外部类名.内部类 对象名 = new 外部类().new 内部类名();
例如:Outter.Inner ins = new Outter().new Inner();
如果内部类是静态的,当其他类调用内部类可直接通过类名调用,格式如下:
外部类名.内部类名 对象名 = new 外部类名.内部类名();
例如:Outter.Inner ins2 = new Outter.Inner();
当内部类是静态的,切方法也是静态的,此时可不需要实例化对象
外部类名.内部类名.静态方法名();
Outter.Inner.fun();
public class Outter {
//Inner为非静态成员内部类
class Inner {
public static void fun(){
}
}
//静态内部类
static class Inner2 {
}
public static void main(String[] args) {
//静态方法里无法直接new非静态内部类 需要通过以下方法new
Outter.Inner ins = new Outter().new Inner();
//静态内部类可以直接在静态方法里面new
Inner2 ins3 = new Inner2();
Outter.Inner2 ins4 = new Outter.Inner2();
//嵌套内部类
class A {
}
A a = new A();
interface B {
}
//实例化接口和实例化抽象类会产生匿名内部类
B b = new B() {
};
//直接调用内部类的静态方法
Outter.Inner.fun();
}
//非静态方法可以直接new内部类
public void show() {
Inner in = new Inner();
}
}