类的内部成员之五:内部类
内部类:把类定义在其他类的内部
内部类特点:
A:内部类可以直接访问外部类的成员,包括私有
B:外部类要访问内部类的成员,必须创建对象
内部类的位置
成员位置:定义在成员位置的类,称为成员内部类
局部位置:定义在局部位置的类,称为局部内部类
格式:外部类名.内部类名 对象名 = 外部类对象.内部类对象
举例
class Outer { private int s; public class Inner { public void mb() { s = 100; System.out.println("在内部类Inner中s=" + s); } } public void ma() { Inner i = new Inner(); i.mb(); } } public class InnerTest { public static void main(String args[]) { Outer o = new Outer(); o.ma(); } } public class Outer { private int s = 111; public class Inner { private int s = 222; public void mb(int s) { System.out.println(s); // 局部变量s System.out.println(this.s); // 内部类对象的属性s System.out.println(Outer.this.s); // 外部类对象属性s } } public static void main(String args[]) { Outer a = new Outer(); Outer.Inner b = a.new Inner(); b.mb(333); } }
局部内部类访问局部变量必须用final 修饰 ?
局部变量会随方法结束而消失,但对象可能还需要使用这个变量,堆内存不会因此而消失
匿名内部类
就是内部类的简化写法
前提:存在一个类或者接口
格式:new 类名或者接口名(){
重写方法;
}
本质:是一个继承了该类或者实现了该接口的子类匿名对象
举例
interface A{ public abstract void fun1(); } public class Outer{ public static void main(String[] args) { new Outer().callInner(new A(){ //接口是不能new但此处比较特殊是子类对象实现接口,只不过没有为对象取名 public void fun1() { System.out.println(“implement for fun1"); } });// 两步写成一步了 } public void callInner(A a) { a.fun1(); } }