第一种情况:
public class B{
private int var = 5;
public int getVar() {
return var;
}
public void setVar(int var) {
this.var = var;
}
B(){
}
}
<pre name="code" class="java">public class Bson extends B{
<span style="white-space:pre"> </span>private int var = 33;
Bson(){
System.out.println(getVar());
}
public static void main(String[] args) {
new Bson();
}
}
父类一个正常的bean结构,子类只设置了var字段没有对应的get方法,然而控制台的输出结果是5.
这说明,当父类和子类拥有相同名称的字段时(其实父类的是属性,子类是字段),调用父类对应的get方法,获得的是父类的成员变量而不是子类的。造成这种误解的原因是经常性不使用this,super关键字,久而久之忽略了其中的细节。
第二种情况:
public class B{
private int var = 5;
public int getVar() {
return var;
}
public void setVar(int var) {
this.var = var;
}
B(){
}
}
<pre name="code" class="java">public class Bson extends B{
private int var = 33;
public int getVar() {
return var;
}
public void setVar(int var) {
this.var = var;
}
Bson(){
System.out.println(getVar());
}
public static void main(String[] args) {
new Bson();
}
}
输出结果是33,这很容易理解,子类调用了自己的get方法获得了自己的变量。
关于这种情况,类似的还有当内部类的父类和外部类有名称相同的方法时是先调用外部类的方法还是父类的,以前我看过相关的blog,写得很详细,结果百度了一阵子也没搜出来,以后有时间会继续整理,也欢迎大家补充下