内部类的学习


活动地址: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、匿名内部类是省略了【实现类/子类名称】,但是匿名对象是省略了【对象名】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值