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

问个问题:类的私有成员是可以继承的,对还是错?
我一直都认为类的私有成员是不可以被继承的。但是有人说可以继承,通过以下的代码来说明的:
Java code
class Father {
    private String name;
    public void setName(String name) {
        this.name = name;
    }
    public void call() {
        System.out.println(name);
    }
    private void f1() {
        System.out.println("in f1");
    }
    public void f2() {
        f1();
    }
}
class Son extends Father {
}
class T {
    public static void main(String[]args) {
        Son s1 = new Son();
        s1.setName("son");
        s1.call();
        s1.f2();
    }
}


但是我认为这个代码也不能说明类的私有成员是可以继承的啊!
我觉得只不过就是son类调用了其父类的setName()方法,而实际操作这个name的是Father类。
这么理解对不?请教高手!

------解决方案--------------------
类的私有属性是不能被子类继承的
只能通过类提供的get和set方法进行访问(不是其子类的类也可以通过get和set方法进行访问)
这样做一方面是安全上得考虑,比如一个需求是要100以内的一个数i,如果i是public那么就可以随便进行赋值,而通过set方法就会安全(比如在set方法里面设置逻辑);
另一方面是因为private属性是为类的public方法服务的,外部的方法不需要直接对这个属性进行操作,要值得话可以通过方法实现,这样就实现了面向对象的封装特性
具体得好处楼主可以再做项目中体会下(private方法和属性的好处)
并且java bean规范(java官方的一个规范)也建议属性私有,提供get和set方法对属性进行操作,他们虽然是建议,不过楼主就把这个当成必须这样做就好了,这样不会出问题
------解决方案--------------------
private 属性是不能被子类继承的
就像你写的例子中的,你是 Son s1 = new Son(); s1.setName("son");操作的仅仅是父类的setName这个public类型的方法,然后通过setName这个方法操作的name属性,而不是直接操作的name属性。
如果name属性已经被子类继承,那么就应该可以直接访问这个属性,可事实确实不可直接访问的。
因此,再绕回来,一句话:父类的私有属性是不能够被子类继承的