-内部类
1)什么是内部类
在一个类中,又编写了另一个类。我们将内部类称为inner,外部类称为outer
2)成员内部类
在类的成员位置,编写的内部类称为成员内部类
1、成员内部类可以使用全部4种访问修饰符修饰
2、成员内部类中的方法可以访问外部类中的私有成员
3、外部类可以在方法中实例化内部类对象,并访问内部类的私有成员
4、方外部类和内部类有重名成员时,内部类中调用外部类重名成员前加
<外部类名>.this.<外部类成员名> outer.this.n;
class Outer1 {
int num = 10;
class Inter{
int num = 20;
public void show() {
int num = 30;
System.out.println(num);//局部变量,就近原则30
System.out.println(this.num);//当前类的成员变量20
System.out.println(Outer1.this.num);//外部类的成员变量10
}
}
}
5、内部类要想在其他类中实例化,需要先导包到内部类,然后实例化
Inner inn = new Outer().new Inner();
6、所有内部类在编译后都会产生自己独立的class文件
3)匿名内部类
匿名内部类就是在类中通过就地实现父类(接口)而编写的一个没有名字的内部类
Aoo a = new Aoo(){
};
3.1)匿名内部类 必须通过继承一个父类或实现一个接口才能编写
3.2)匿名内部类编写在方法中
3.3)匿名内部类也可以使用外部类中的私有成员,并且成员重名时的处理方式和成员内部类一致
3.4)特别需要注意, 匿名内部类的对象是向上造型
的,所以只能调用到继承的父类的可访问成员
3.5)匿名内部类的方法中,是 不能修改该内部类所在方法中局部变量的值!
public class Coo {
public void coo(){
int n = 30;//不能修改,并只能赋值一次
Fruit f= new Fruit(){
public void eat(){
System.out.println(n);
}
};
}
}
3.6)匿名内部类的方法中,要获取改内部类所在方法中的局部变量,需要保证 局部变量只能被赋值一次
3.7)jdk1.6之前,所有匿名内部类使用的局部变量都必须使用final修饰(1.6之后还是final修饰,隐藏了)