关于匿名内部类

博客探讨了在Java中如何在不同包下创建具有protected构造器的类的对象。通过两种方法进行了阐述,一是直接修改构造器访问修饰符,但此方法在无法修改源码时不可行。二是利用匿名内部类,通过创建AA类的子类,由于子类可以访问父类的protected成员,从而实现构造AA对象。匿名内部类实际上创建了一个AA的子类实例,证明了这一点并解释了其工作原理。
摘要由CSDN通过智能技术生成

先来看例子
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
要求:在BB类中创建一个AA类对象

仔细看完这个问题,可能就会发现他十分的刁钻
首先,两个类处于不同的包下。这很正常很普通,关键是AA类中只有一个构造器,而且,他的修饰符是protected,学过java的朋友应该都知道,protected修饰符代表着不同包下不能访问调用
所有问题来了,要如何创建这个AA对象呢?

解决方案有两种:

  1. 就是将AA类中构造器的修饰符,修改为范围更大的public
  2. 就是使用今天要讲的重点
    在这里插入图片描述
    在这里插入图片描述
    首先,来说第一种方法,这种方法可能是大多数人想到的方法,这个办法确实这直接暴力,可是,如果把AA类换乘源码呢?我们是没有办法修改源码的,所有这种办法有一定的局限性,不可取

然后,就是第二种方法了,可能刚开始看的时候是不是有点奇怪《这是啥玩意?》
换一种形式可能就清楚熟悉了
在这里插入图片描述
这其实就是我们的匿名内部类

那么下一个问题来了,为什么使用匿名内部类的形式就可以了呢?

首先,我们得先确定,这个在这里插入图片描述
还是一个AA类么?
在这里插入图片描述
在这里插入图片描述
可以看到,它已经不是一个AA类了,那他是什么呢?
其实他是长这样的,我们应该知道匿名内部类的对象名不是我们自己取,是系统帮我们取的,所有一般来说就长得奇怪了一点
在这里插入图片描述
其实他是AA类的一个子类
我们可以在AA类中添加一个方法来证明
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
事实也如我们所证,他确实是一个AA的子类
同理,如果AA类是一个接口那么他的匿名内部类应该长这样
在这里插入图片描述
好了下一个问题
就是为什么匿名内部类就可以调用AA类中的protected的构造器呢?

我们可以参照这个结构想一想
在这里插入图片描述
既然他是一个AA类的子类,那么他应该具有什么特质呢?
首先,作为一个类 ,在没有声明构造器的情况下,系统会默认分配一个空参构造器给该对象
然后,作为一个子类,在构造器的第一行,系统也会默认调用调用父类的空参构造器!!!就是调用super()

所以,其实他长这样
在这里插入图片描述
因为调用了super(),所以他就理所应当的调用了父类的空参构造器,也就是AA类中被protected修饰的空参构造器

因为子类调用父类的方法属性方法构造器理所应当,所有通过这种方式,就越过了权限修饰符的限制

同理,如果我们传入了一个参数(或者多个),不过这时,系统不会分配空参构造器了,而是直接调用子类或者父类中与之匹配的构造器
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值