欢迎点击「算法与编程之美」↑关注我们!
本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章。
欢迎加入团队圈子!与作者面对面!直接点击!
|案例介绍
在日常用Java写代码的过程中,往往在子类继承父类时,会出现一些问题。今天我来讲解两个常见问题的解决方式。
|问题分析1
重写父类方法时修改权限导致继承失败。
源码如下:
class Test{
public Test(){
protected void doAe(){
protected Test doIt(){
return new Test();
}
}
}
}
class Test2 extends Test{
public Test2(){
super();
super.doAe();
}
public void doAenew(){
}
public void doAe(){
}
private Test2 doIT(){
return new Test2();
}
}
|解决方案
当重写父类方法时,修改的方法权限只能从小的范围到大的范围改变,如上面的程序,父类中的 doAe() 方法的权限为 protected ,继承后子类中的方法 doAe() 的修饰权限只能修改为 public,或者不变。
修改后的代码如下:
class Test{
public Test(){
protected void doAe(){
protected Test doIt(){
return new Test();
}
}
}
}
class Test2 extends Test{
public Test2(){
super();
super.doAe();
}
public void doAenew(){
}
public void doAe(){
}
public Test2 doIT(){
return new Test2();
}
}
|问题分析2
实例化子类对象前,无参数的父类构造函数执行,但有参数的却未执行。
源码如下:
class Pa{
public Pa(){
System.out.println("调试父类的构造方法。");
}
public Pa(String[] args){
System.out.println("调用父类带参数的构造方法。");
}
}
class AaPa extends Pa{
public AaPa(){
System.out.println("调用子类的AaPa()构造方法。");
}
}
public class AaCc extends AaPa{
AaCc(){
System.out.println("调用子类的AaCc()构造方法。");
}
public static void main(String[] args){
AaCc a = new AaCc();
}
}
在调用子类构造方法之前,会自动调用父类无参数的构造函数,若想要执行父类带参数的构造函数,只能使用 super 关键字显示调用父类的构造方法。
修改后的代码如下:
class Pa{
public Pa(){
System.out.println("调试父类的构造方法。");
}
public Pa(String[] args){
System.out.println("调用父类带参数的构造方法。");
}
}
class AaPa extends Pa{
public AaPa(){
super("args");
System.out.println("调用子类的AaPa()构造方法。");
}
}
public class AaCc extends AaPa{
AaCc(){
System.out.println("调用子类的AaCc()构造方法。");
}
public static void main(String[] args){
AaCc a = new AaCc();
}
}
END
主 编 | 王文星
责 编 | 李劲潮
where2go 团队
微信号:算法与编程之美
长按识别二维码关注我们!
温馨提示: 点击页面右下角 “写留言”发表评论,期待您的参与!期待您的转发!