前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java|类的继承中两种错误的解决方式 |案例介绍

Java|类的继承中两种错误的解决方式 |案例介绍

作者头像
算法与编程之美
发布2020-07-17 14:31:38
7230
发布2020-07-17 14:31:38
举报

|案例介绍

在日常用Java写代码的过程中,往往在子类继承父类时,会出现一些问题。今天我来讲解两个常见问题的解决方式。

|问题分析1

重写父类方法时修改权限导致继承失败。

源码如下:

代码语言:javascript
复制
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,或者不变。

修改后的代码如下:

代码语言:javascript
复制
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

实例化子类对象前,无参数的父类构造函数执行,但有参数的却未执行。

源码如下:

代码语言:javascript
复制
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关键字显示调用父类的构造方法。

修改后的代码如下:

代码语言:javascript
复制
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();

    }

}



本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-07-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 算法与编程之美 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档