美文网首页
多态只针对方法,而不是属性

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

作者: 东南枝下 | 来源:发表于2022-02-14 14:13 被阅读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方法是父类的方法,值被赋到了父类的属性中,但子类的属性没有这个值

  • 在子类中重写父类该属性的get/set方法,输出如下
----------------获取字段值-------------------
ChildName : zhangSan
ParentName : liSi
----------------获取父类字段值-------------------
ParentName : liSi
----------------使用反射获取子类字段值-------------------
ParentName : liSi
----------------使用反射获取父类字段值-------------------
ParentName : null

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

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


图片.png
  • 在子类的set方法中为父类赋值

改写子类set方法如下:

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

输出如下:

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

相关文章

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

    java中子类只能重写父类的方法 ,而不能重写属性 创建两个类,一个子类一个父类进行测试 父类 子类先建一个和父类...

  • 多态

    1.多态 1.多态 1.1 要点 多态是方法的多态,不是属性的多态 多态的存在有三个必要条件:继承;方法重写;父类...

  • 博学谷第十三天

    时间:2020年1月8日内容:多态、类方法、类属性 多态、类方法、类属性 多态 面向对象的三大特征: 封装将属性和...

  • 多态

    测试多态性,属性 方法

  • P9 Dart中的类 对象

    封装,继承,多态 类是由属性和方法组成 /////

  • python类相关装饰器小记

    @property:针对属性的getter方法@age.setter:针对属性的setter方法 __ slots...

  • python中OOP的类属性和方法与多态

    目录 类的结构 类属性和实例属性 类方法和静态方法 多态 私有属性和私有方法 01. 类的结构 1.1 术语 ——...

  • 耦合性设计:为什么优先使用组合而不是继承?

    后台开发:核心技术与应用实践 为什么优先使用组合而不是继承?子类继承父类,可以继承父类的方法及属性,实现了多态以及...

  • js 面向对象模式

    面向对象:就是将一个需求抽象成一个对象,然后针对对象分析特征(属性)与动作(方法)。 面向对象的特征:封装多态继承...

  • 面向对象编程

    主要包括: 基本概念 属性私有化(类的封装) 实例属性与类属性 静态方法、类方法、与实例方法 继承与多态 获取对象...

网友评论

      本文标题:多态只针对方法,而不是属性

      本文链接:https://www.haomeiwen.com/subject/joyclrtx.html