一、public属性重名
1、此时属性是不是存在动态绑定呢?
测试如下:
package verify;
public class SameFieldInGeneric extends SuperClass{
public String field = “subClassField”;
public static void main(String[] args) {
// TODO Auto-generated method stub
SameFieldInGeneric subObject = new SameFieldInGeneric();
//subClassField
System.out.println("最初始的属性 = " + subObject.field);
SuperClass supObject = subObject;
//superClassField
System.out.println("转换为父类后的属性 = " + supObject.field);
SameFieldInGeneric subObject2 = (SameFieldInGeneric) supObject;
//subClassField
System.out.println("再次转换回子类后的属性 = " + subObject2.field);
System.out.println();
/* 实际情况中,属性不太可能是public的
基本是通过get方法获取的,此时重名必须得重写get方法
这样结果就都是子类的真实属性了subClassField
*/
System.out.println("方法获取的:最初始的属性为 " + subObject.getField());
System.out.println("方法获取的:转换为父类后的属性为 " + supObject.getField());
System.out.println("方法获取的:再次转换回子类后的属性为" + supObject.getField());
}
public String getField() {
return field;
}
}
class SuperClass {
public String field = “superClassField”;
public String getField() {
return field;
}
}
测试结果:属性不存在动态绑定,即属性不存在重写这种说法。
2、那是不是可以理解为继承过程中的属性重名会导致父类属性被隐藏呢。
从子类对象变量subObject结果来说可以这么理解。
但从supObject父类对象变量结果来看,我觉得又不仅是隐藏的关系,因为从subObject2的结果可得出子类对象变量subObject在转化为父类对象变量supObject的过程中,重名的属性并没有被改变。
那是不是可以理解为父类对象变量supObject访问的并不是(堆内存中的)子类对象的真实属性呢。我不知道。
3、结论
继承当中出现属性重名的情况时,父类属性会被隐藏,但是当子类对象被父类对象变量引用时,父类的属性又会被激活,前提是直接通过.访问,而不是通过方法获取。
4、瞎叨叨
真实情况中很少会同时出现属性直接暴露和属性重名的这种情况吧,所以大概就可以不用深究了…
二、static方法重名
1、结论
首先static方法会被子类继承。
但不存在动态绑定,调用时访问的方法为定义的对象变量所属的类或类本身的方法。
2、测试
package classAndGeneric;
/*
-
静态方法会被子类继承
-
但不存在动态绑定,访问的是定义的对象变量所在的类或类本身的方法
*/
public class StaticMethodInherit extends SuperClass {public static void main(String[] args) {
// TODO Auto-generated method stub
staticMethod(); // sub static method…StaticMethodInherit sub = new StaticMethodInherit(); // 父类的被隐藏,和通过类直接访问效果相同 sub.staticMethod(); // sub static method..... SuperClass sup = sub; // 父类的被激活 sup.staticMethod(); // super static method......
}
public static void staticMethod() {
System.out.println(“sub static method…”);
}
}
class SuperClass {
public static void staticMethod() {
System.out.println(“super static method…”);
}
}