活动地址:CSDN21天学习挑战赛
目录
什么是内部类
将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。
内部类的定义
内部类在程序中可以看出外部类的一个成员,通过实例化,我们可以操作内部类,使用它的变量和方法
public class A {
private String Name="a";
private static String str1="我是静态的";
private final String str2="我是final的";
/**
* 外部类无法直接访问内部类的成员,需要实例华内部类对象
*/
private B b = new B();
public void show(){
System.out.print(b.name+"\n");
b.show();
}
/**
* 内部类
*/
class B{
private String name="b";
// TODO 这个是个特殊
private static final String s="";
public void show(){
// 可以直接访问外部类的成员
System.out.print(Name+"\n");
System.out.print(str1+"\n");
System.out.print(str2+"\n");
}
}
public static void main(String[] args){
A a = new A();
a.show();
// 实例化内部类
A.B b2 = A.new B();
b2.show();
}
}
内部类的使用
- 内部类可以无条件访问外部类的所有成员属性和成员方法(包括private成员和静态成员)。
- 当内部类拥有和外部类同名的成员变量或者方法时,会发生隐藏现象,即默认情况下访问的是内部类的成员。
- 内部类可以看成是外部类的一个成员,在内部类中无法声明静态成员,但static final(两个一起使用)字段是个例外。
- 我们知道加载类时,会先初始化静态成员,如果内部类有静态成员,那么内部类就会在外部类之前生成,而内部类是为外部类服务的,内部类在外部类之前就生成可能会脱离掌控。
- 在实例化内部类时,内部类会持有一个外部类当前对象的引用,这样在成员内部类中就可以直接访问外部类的成员,即使是private修饰的。
- 编译后A.B被重命名为A$B。
匿名内部类
匿名内部类就是指没有名字的内部类,匿名内部类没有构造器
new 父类名或者父接口名 {
// 方法的重写
@Override
public void method(){
// 重写的方法体内容。。。
}
};
//例子
public class Test01 {
//内部类
static class dog{
public final static String name="阿黄";
}
public static void main(String[] args){
//匿名内部类对象
(
new dog() {//匿名对象
//补充方法
void show (String name) {
System.out.println(name+"在吃饭然后打了一个嗝");
}
}).show(dog.name);//执行方法
}
}
上面的main方法里面使用dog类创建一个内部类,但是这个内部类没有名字。所以没有构造方法。
注意:
1、匿名内部类在创建对象时,只能使用唯一的一次 如果希望多次创建对象,而且类的内容是一样的话,建议单独定义实现类
2、匿名对象,在【调用方法时】,也只能使用唯一一次 如果希望同一个对象,调用多次方法,那么就建议给对象起个名字
3、匿名内部类是省略了【实现类/子类名称】,但是匿名对象是省略了【对象名】