多态只针对方法,而不是属性

2022-02-14  本文已影响0人  东南枝下

java中子类只能重写父类的方法 ,而不能重写属性

父类

public abstract class Parent extends GrandFather {

    protected String parentName;

    public String getParentName() {
        return parentName;
    }

    public void setParentName(String parentName) {
        this.parentName = parentName;
    }
}

子类
先建一个和父类一摸一样的属性,但不重写父类该属性的 get set 方法

public class Child extends Parent {

    private String childName;

    // 在这里创建一个和父类一摸一样的属性
    private String parentName;

    public String getChildName() {
        return childName;
    }

    public void setChildName(String childName) {
        this.childName = childName;
    }

// 先注释掉,暂时先不重写父类的 get set 方法
//    @Override
//    public String getParentName() {
//        return parentName;
//    }
//
//    @Override
//    public void setParentName(String parentName) {
//        this.parentName = parentName;
//    }
}
public class ParentChildTestMain {

    public static void main(String[] args) {

        Child child = new Child();
        child.setChildName("zhangSan");
        child.setParentName("liSi");

        System.out.println("----------------获取字段值-------------------");
        System.out.println("ChildName : " + child.getChildName());
        System.out.println("ParentName : " + child.getParentName());

        System.out.println("----------------获取父类字段值-------------------");
        System.out.println("ParentName : " + ((Parent) child).getParentName());

        System.out.println("----------------使用反射获取子类字段值-------------------");
        try {
            Field field = Child.class.getDeclaredField("parentName");
            field.setAccessible(Boolean.TRUE);
            String value = (String) field.get(child);
            System.out.println("ParentName : " + value);
        } catch (NoSuchFieldException | IllegalAccessException e) {
            e.printStackTrace();
        }

        System.out.println("----------------使用反射获取父类字段值-------------------");
        try {
            Field field = Parent.class.getDeclaredField("parentName");
            field.setAccessible(Boolean.TRUE);
            String value = (String) field.get(child);
            System.out.println("ParentName : " + value);
        } catch (NoSuchFieldException | IllegalAccessException e) {
            e.printStackTrace();
        }

    }

}

----------------获取字段值-------------------
ChildName : zhangSan
ParentName : liSi
----------------获取父类字段值-------------------
ParentName : liSi
----------------使用反射获取子类字段值-------------------
ParentName : null
----------------使用反射获取父类字段值-------------------
ParentName : liSi

可以看到通过get方法能获取到值是因为get/set方法是父类的方法,值被赋到了父类的属性中,但子类的属性没有这个值

----------------获取字段值-------------------
ChildName : zhangSan
ParentName : liSi
----------------获取父类字段值-------------------
ParentName : liSi
----------------使用反射获取子类字段值-------------------
ParentName : liSi
----------------使用反射获取父类字段值-------------------
ParentName : null

这个时候子类的属性中有值但父类中没有

在代码中打断点可以看到,有一个Parent.parentName的属性


图片.png

改写子类set方法如下:

···
@Override
    public void setParentName(String parentName) {
        super.parentName = parentName;
        this.parentName = parentName;
    }
···

输出如下:

----------------获取字段值-------------------
ChildName : zhangSan
ParentName : liSi
----------------获取父类字段值-------------------
ParentName : liSi
----------------使用反射获取子类字段值-------------------
ParentName : liSi
----------------使用反射获取父类字段值-------------------
ParentName : liSi
上一篇 下一篇

猜你喜欢

热点阅读