java 方法和属性在继承中的易错处

java 方法和属性在继承中的易错处

私有属性和方法可不可以被继承哪?看下面的运行结果:

class Life{
    private String name;
    public String getName(){
        return this.name;
    }
    public void setName(String name){
        this.name=name;
    }
}
public class Person extends Life{
    
    private int age;
    public int getAge(){
        return this.age;
    }
    
    public static void main(String args[]){
       Life lf=new Person();
       lf.setName("father");
       System.out.println(lf.getName());//打印 father
    }
}

刚开始以为这样就可以得出“private是可以被继承”的结论,后来经过多方求证证明我错了,可以由反射来证明一下子类里的内容:

 void che() {
        Method[] m = this.getClass().getDeclaredMethods();
        Field[] f = this.getClass().getDeclaredFields();
        for (Method d : m)
            System.out.println(d.getName());
        for (Field d : f)
            System.out.println(d.getName());
    }

Life lf=new Person();对于方法,如果子类重写了,就调用子类方法,如果方法没有重写,在子类找不到方法就会去父类里面找,父类找不到,再去父类的父类那里找。对于属性,若在当前对象中都找不到对应,会去该对象的父类中查找。搞了好长时间,现在得出:子类不能继承父类的private属性,但可以通过继承的方法(比如,public方法)访问到父类的private属性,根据方法和属性的调用顺序的话,不写this或super的情况下,默认为this。
再看下面的代码:

class Life {
    String name="father";
    public String getName() {
        return this.name;
    }
}
 
public class Person extends Life {
    String name="son";
    public static void main(String args[]) {
        Life lf=new Person();
        System.out.println(lf.name);//打印**father
    }
}

这是关于多态的一个问题,并不是所有的事物都可以多态的发生,只有普通的方法调用可以是多态的。比如直接访问某个域,这个访问就将在编译期进行解析。所以子类向上转型为父类时,则会遗失掉父类中没有定义的方法,而除了private的属性外,其他的属性都会被父类的属性覆盖
在Person对象转型为Life引用时,任何域访问操作都将由编译器解析,因此不是多态的。另外静态方法是与类,而并非与单个的对象相关联的。如下代码

class Life {
    public static String getName() {
        return "father";
    }
}
 
public class Person extends Life {
    public static String getName(){
        return "son";
    }
    public static void main(String args[]) {
        Life lf=new Person();
        System.out.println(lf.getName());//打印**father
    }
}

再看下面的代码

class Foo {
    int a=3;
    public void addFive() {
        a += 5;
    }
}
 
public class Bar extends Foo {
    int a=10;
    public void addFive() {
        a += 6;
    }
    public static void main(String[] args) {
        Foo foo = new Bar();
        System.out.println(foo.a);//*****打印 3
        foo.addFive();
        System.out.println(foo.a);//**** 3
    }
}
Bar中有两个a,一个是父类继承来的,一个是自己的,foo.a是父类中被隐藏的,而foo.addFive()中加的是Bar里的故输出是:3 3

如果我们把Bar里的addFive()注释哪?
结果是:3 8
如果注释了public int a=10,运行结果又是什么哪?
结果:3 9

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值