java属性封装的问题
下列代码:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
public class Fu {
private int a;
public void set(int b){
this.a=b;
}
}
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
public class Zi extends Fu {
}
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
public class Tes{
public static void main(String[] args) {
Zi c=new Fu();
c.set(1);
}
}
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
我通过子类对象c去调用父类的set的方法,这个方法的调用者应该是子类对象c,这个方法应该是被继承下来了,子类也有一份,this.a我理解成子类对象c.a,因为调用对象不是父类对象,为什么还能修改父类的私有属性a的值?我知道set方法是可以访问父类的是有属性的。
这个程序的Zi c=new Fu()这句话是不正确的,子类不能new父类对象,反过来是正确的。改为Fu c=new Zi()。
更改以后的程序这样解释:
1. 创建一个子类对象c,它继承自父类,因此拥有父类的属性a和方法set。
2. c调用从父类继承过来的set方法,这个方法会修改从父类继承过来的子类属性a。
对于父类private的属性,子类不能直接在自己的方法中更改。
比如在子类中定义一个方法ziSet,试图改变父类的a属性:
public void ziSet(int b){
this.a = b;
}
由于a属性在父类是private的,所以不能被子类修改,编译不通过。
如果a属性声明为protected,就可以使用子类的ziSet修改父类的a属性了。
但是可以通过从父类继承的方法修改是没问题的,因为方法是父类的,private不会限制。