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
网友评论