JAVA中的属性继承小知识

偶然看到一个考JAVA继承类知识的题目,根据题目猜输出结果,代码大概如下:

public class Parent {
    String name = "parent";
    public String getName(){
        return name;
    }
    
    static class Child extends Parent{
        String name = "child";
        public String getName(){
            return name;
        }
    }
    
    public static void main(String[] args) {
        Child child = new Child();
        Parent parent = child;
        
        System.out.println(parent.name + " , " + child.name);
        System.out.println(parent.getName() + " , " + child.getName());
    }
}

输出结果如下:

parent , child
child , child

因为多态的特性所以不管是parent.getName()还是child.getName()最终调用的都是Child中的方法,所以输出内容相同也可以理解。

parent.name和child.name都是同一个对象,只是类型不同却输出不同的结果,这就不能用多态来解释,只能说明是属性是和类型绑定并且不会被覆盖。

也即是父类中的属性虽然可以被子类所继承使用但是即使子类有同名的属性也无法覆盖父类的属性。

例子如下:

public class Parent {
    String name = "parent";
    public String getName(){
        return name;
    }
    
    static class Child extends Parent{
        String name = "child";
    }
    
    public static void main(String[] args) {
        Child child = new Child();
        Parent parent = child;
        
        System.out.println(parent.name + " , " + child.name);
        System.out.println(parent.getName() + " , " + child.getName());
    }
}

输出:

parent , child
parent , parent

在这个例子中因为调用的都是父类的方法,自然就是输出的父类的属性值。


总结一下就是:方法可以被覆盖但属性无法覆盖,子类的方法中使用属性时的寻找顺序是先从本类中找同名属性当找不到时才会使用父类中的同名属性。

提交评论