什么是内部类
一个类可以放在另一个类的内部,称之为内部类,相对而言,包含它的类称之为外部类。
内部类可以实现对外部完全隐藏(声明为private),可以有更好的封装性
内部类只是JAVA编译器的概念,对于JAVA虚拟机而言,它是不知道内部类这回事的,每个内部类最后都会被编译为一个独立的类
都哪几种
- 静态内部类
- 成员内部类
- 方法内部类
- 匿名内部类
成员和静态如果不被声明为private是可以被外部使用的。
方法和匿名不可以
静态内部类
可以访问外部类的静态变量和方法。也可以被外部直接访问,具体看访问控制符
public class Outer {
public static String a;
public class Sta0 {
}
public static void Say() {
System.out.println("insist");
}
public static class Inner {
public static String b;
public void HAHA() {
Say();
a = "A";
}
public static void HEHE() {
Say();
a = "A";
}
}
public static void main(String[] args) {
Outer A = new Outer();
Outer.Inner.b = "A"; //通过这种方式访问静态内部类的静态变量和静态方法
Outer.Inner s=new Outer.Inner();//如果要访问静态内部类的普通方法需要先new一个静态内部类
s.HAHA();
Outer.Inner.HEHE();
}
}
成员内部类
他除了静态方法和变量还可以直接访问外部的实例变量和方法。如果方法重名,则可以通过外部类.this.方法名
来调用
只有静态内部类可以定义静态变量和静态方法。其他三种都不行
public class Outer {
public String a;
public int b;
public void Say(){
System.out.println("insist and experience pain");
}
public class Inner{
public void HAHA(){
System.out.println("stay focus,be present"+b);
Say();
}
}
public static void main(String[] args) {
Inner b=new Outer().new Inner(); //定义成员内部类需要先定义一个外部类
b.HAHA();
}
}
方法内部类
方法内部类只能在定义的方法内被使用。
如果方法是实例方法,则除了静态变量和方法,也可以访问外部类的实例变量和方法。
如果方法是静态方法,则方法内部类只能访问外部类的静态变量和方法。
方法内部类还可以直接访问方法的参数和方法中的局部变量。不过,这些变量必须被声明为final。因为方法内部类引用外部变量的本质是:
将外部变量通过构造方法传参的形式传进了内部类中。所以方法内部类操作的并不是外部的变量,而是它自己的实例变量。所以操作这些值并不会改变外部的值。同时**方法内部类并不会随着方法的执行完毕而跟随着一起被销毁。**所以为了保证外部的引用变量不会丢失所以需要定义为final。
所以究其根源变量被声明为final是为了解决:局部变量的生命周期和方法内部类的对象的生命周期的冲突问题
匿名内部类
匿名内部类只能被使用一次,它没有名字和构造方法,并且不能接收参数
匿名内部类能做的,方法内部类都能做。但如果对象只会创建一次,且不需要构造哦方法来接受参数,则可以使用匿名内部类,这样代码书写上更为简洁