Java:涨知识啦

1.类文件碰撞:资源存在不同的情况

我在21.12.8号编程时,突然遇到一个问题:
在一个包下的一个类中,package(声明在哪个包下的代码处出现红色纽)处报错,说的是:

Class file collision: A resource exists with a different case: ‘/hello/bin/hello/Person.class’.

用中文解释就是:类文件碰撞。
为什么会突然出现故障?我以前在一个包下创建n个程序也没见过!咋今天就遇到了?
第一步,检查我的类的继承等有无出错,没有;
第二步,检查我的成员变量、方法等有无出错,没有;
正当我一脸懵逼时,我想到了,在这个包中另一个程序里有两个和我现在这个出错的包中一样的类名。

【以下截图用来展现分析思路】

同一包下的一个程序类(Task3):同一类下的程序类(cashi)
解题重点

在Windows下,文件不区分大小写,所以当同一包下(文件夹相同)会导致类文件碰撞;在不同包下,因为文件夹不同,所以两包中同名的、不同名的不影响。

2.隐式超级构造函数没有定义,必须显式调用另一个构造函数

英文报错:Implicit super constructor Pet() is undefined. Must explicitly invoke another constructor

因为子类比父类多了一个成员变量,所以在子类重载构造函数时,产生了错误,让我们来一起看看吧~
【下面是错误代码截图】
子类中多了一个成员变量,导致构造出错
为什么会出错呢?
是因为:调用子类的构造方法之前会先隐式的调用父类的构造方法,所以导致了定义了两次sex和name两个变量,这样不行,会陷入循环。现在我们来改一改代码,将上图画横线的两句用super(sex,name)代替,看看是否报错。
【以下是更正后的代码图片】
显示调用父类的有参构造函数
现在我们显示的调用了父类的有参构造函数super(参数1,参数2);没有报错了!
难道原因就在于此吗?
不不不,还记得定义吗?覆盖(重写)。
【仔细阅读哦,复习复习】

下面解释基于“子类中全局变量未初始化”对子类构造函数的调用进行完整的过程分析。
(1)子类在实例化时,如果自己有有参的构造函数,则进入自己的构造函数 ——》
第一步,先去父类的成员变量处溜达一圈——》第二步,如果调用的子类构造函数中(第一条语句)没有显式的说调用父类的有参或者无参构造函数,则隐式的调用父类的无参构造函数;如果显式的说了,那么就调用这个显式说明的有参或者无参构造函数——》第三步,逛一逛子类的成员变量——》第四步,子类执行构造函数内的内容。
(2)子类在实例化时,如果自己无有参的构造函数,(因为构造函数不能继承,不能重写,所以相当于子类中现在没有任何一个构造函数),那么仍是执行第一步(同上)——》第二步,调用父类的无参构造函数,如果父类没有有参构造函数,则调用父类默认的无参构造函数,或者调用父类的给出的无参构造函数;如果父类有有参构造函数,不好意思,还是只能调用父类的申明了的无参构造函数,没得?呕吼,那么现在就会报错了!为什么?因为如果父类写了有参的构造函数,导致系统不会再给此父类一个默认的(隐式的)无参构造函数,也就是说,现在父类中的构造方法只有一个——有参的。

这就是报错的原因!掌握了吗?
【这里推荐两篇文章,值得一看】
第一篇
第二篇

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值