私有成员能被子类继承吗?

如果你的答案是斩钉截铁的"不能",那么请你继续向下看,说不定这篇文章能对你有所用处.

首先请看两个类的代码:
BaseClass:

package  com.sitinspring;

import  java.util.Vector;

/**
 * 基类BaseClass,ChildClass类的父类
 * 
@author : sitinspring(junglesong@gmail.com)
 * @date: 2007-12-4
 
*/
public   class  BaseClass{
    
//  私有动态数组成员,注意它是"private"的
     private  Vector objects;
    
    
/**
     * 在构造函数
     *
     
*/
    
public  BaseClass(){
        objects
= new  Vector();
    }
    
    
/**
     * 公有函数,向动态数组成员objects添加字符串
     * 
@param  str
     
*/
    @SuppressWarnings(
" unchecked " )
    
public   void  addStr2Obs(String str){
        objects.add(str);
    }
    
    
/**
     * 公有函数,打印objects中的诸元素
     *
     
*/
    
public   void  printAll(){
        
for ( int  i = 0 ;i < objects.size();i ++ ){
            System.out.println(
" 序号= " + i + " /t元素= " + objects.get(i));
        }
    }
}


ChildClass,BaseClass的派生类:

package  com.sitinspring;

/**
 * ChildClass,BaseClass的派生类
 * 
@author : sitinspring(junglesong@gmail.com)
 * @date: 2007-12-4
 
*/
public   class  ChildClass  extends  BaseClass{
    
public   void  printObjects(){
        
//  下面的句子是不能编译通过的
         /* for(int i=0;i<objects.size();i++){
            System.out.println("序号="+i+"/t元素="+objects.get(i));
        }
*/
    }
    
    
public   static   void  main(String[] args){
        ChildClass childClass
= new  ChildClass();
        
        childClass.addStr2Obs(
" Hello " );
        childClass.addStr2Obs(
" World " );
        childClass.addStr2Obs(
" China " );
        childClass.addStr2Obs(
" sitinspring " );
        
        childClass.printAll();
    }
}


再让我们把断点停在main函数中的childClass.printAll()上,看看实例childClass中到底有什么.


以上截图证明:objects确实是ChildClass类实例childClass的成员,而且四个字符串也都被加进去了.

最后执行出来,结果如下:

序号 = 0     元素 = Hello
序号
= 1     元素 = World
序号
= 2     元素 = China
序号
= 3     元素 = sitinspring

这也说明,上面红字部分的论断是正确的.

再翻看书籍,关于private限制的成员变量是这样写的:
private  只允许来自改类内部的方法访问.不允许任何来自该类外部的访问.

我们上面添字符串和遍历输出函数都是BaseClass的成员,所以它当然被这两个函数访问.而ChildClass的printObjects是BaseClass类外部的函数,结果当然是编译也不能通过.

实际上,private,public,protected和继承没有关系,他们对成员函数和变量的限制只是在成员的可见性上,
public允许来自任何类的访问;
private只允许来自改类内部的方法访问,不允许任何来自该类外部的访问;
protected允许来自同一包中的任何类以及改类的任何地方的任何子类的方法访问.


而关于成员变量的继承, 父类的任何成员变量都是会被子类继承下去的 ,私有的objects就是明证,这些继承下来的私有成员虽对子类来说不可见,但子类仍然可以用父类的函数操作他们.

这 样的设计有何意义呢?我们可以用这个方法将我们的成员保护得更好,让子类的设计者也只能通过父类指定的方法修改父类的私有成员,这样将能把类保护得更好, 这对一个完整的继承体系是尤为可贵的. jdk源码就有这样的例子,java.util.Observable就是这样设计的.


 

本文转自http://www.blogjava.net/sitinspring/archive/2007/12/04/165288.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值