内部类:
成员内部类:不太常用
- 类中套类,外面的叫外部类,里面的叫内部类
- 内部类通常只服务于外部类,对外不具备可见性
- 内部类对象通常是在外部类中创建的
- 内部类中可以直接访问外部类的成员(包括私有的)
内部类中有个隐式的引用,指向创建它的外部类对象
语法: 外部类名.this.
public class InnerClassDemo {
public static void main(String[] args) {
Mama m=new Mama();
//Baby b=new Baby(); 编译错误,Baby是内部类,内部类对外不具备可见性
}
}
class Mama{//外部类
private String name;
Baby createBaby(){
return new Baby();//内部类对象通常是在外部类中创建的
}
class Baby{//内部类
public void showMamaName(){
System.out.println(name);
System.out.println(Mama.this.name);//等价于System.out.println(name);
//System.out.println(this.name); 编译错误
}
}
}
匿名内部类:比较常用
- 如果想创建一个类的对象,并且该类只被创建一次,此时该类不必命名,称为匿名内部类
- 在匿名内部类中访问外部的数据,该数据必须是final的
- 问:内部类有独立的.class吗 答:有
public class NstInnerClassDemo {
public static void main(String[] args) {
//Inter2 o1=new Inter2(); 编译错误,接口不能被实例化
/*1.创建了Inter2的一个子类,没有名字
*2.为该子类创建了一个对象,叫o2
*3.大括号中的为子类的类体
*/
Inter2 o2=new Inter2() {
};
final int num=5;
/*1.创建了Inter3的一个子类,没有名字
*2.为该子类创建了一个对象,引用叫o3
*3.大括号中的为子类的类体 Inner3的子类必须重写show
*/
Inter3 o3=new Inter3(){
public void show(){//必须重写show方法,不然就会报错
System.out.println("showshow");
System.out.println(num);
}
};
o3.show();//调用show方法
}
}
interface Inter3{
public void show();
}
interface Inter2{
}