日期:2014-05-20  浏览次数:20692 次

为什么说重写属性是无意义的,能讲明白么?
因为属性是需要封装的,所以重写属性是无意义的。这个是我在书上看到的一句话,不理解,谁帮忙解释一下的!
感激不尽啊!

------解决方案--------------------
属性有重写一说?没有吧,只有方法能重写
------解决方案--------------------
重写只发生在方法里面,不包括属性子类继承父类后,如存在同名、同参、同返回值的方法,子类方法会重写父类的同名方法,那么如果父子存在相同的属性名会重写吗?参见如下代码:
public class Pet {
public String name ;

public String getName() {
return name;
}
public Pet(){
this.name = "pet";
}
}
public class Dog extends Pet {
public String name;
public Dog(){
this.name = "dog";
}

}
public static void main(String[] args) {
Pet pet = new Dog();
System.out.println(pet.name);
System.out.println(pet.getName());
}
系统运行后,输出结果为两个"pet",而没有任何"dog",为什么?
原来多态仅针对实例方法,与实例的属性无关。
如果修改Dog类,增加getName方法后,输出结果如何?
public class Dog extends Pet {
public String name;
public String getName() {
return name;
}
public Dog(){
this.name = "dog";
}
}
输出结果为"pet" 和"dog",这验证了上述的结论:重写只对方法有效,对属性无效!
------解决方案--------------------
属性没有重写的说法。
子类中有了名称一样的属性,是隐藏了父类的属性,实际上用super.属性名,还是可以得到父类的非private属性.
------解决方案--------------------
Java code


public class Son extends Father{
    public int x = 10;
    
    public void p(){
        System.out.println(super.x);
        System.out.println(this.x);
    }
    
    public static void main(String[] args){
        Son s = new Son();
        s.p();
    }
}