春风博客

春天里,百花香...

导航

<2007年12月>
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345

统计

公告

MAIL: junglesong@gmail.com
MSN: junglesong_5@hotmail.com

Locations of visitors to this page

常用链接

留言簿(11)

随笔分类(224)

随笔档案(126)

个人软件下载

我的其它博客

我的邻居们

最新随笔

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜

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

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

首先请看两个类的代码:
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/Files/sitinspring/PrivatePuzzle20071204210542.rar

posted on 2007-12-04 20:42 sitinspring 阅读(9910) 评论(7)  编辑  收藏 所属分类: Object Orient ProgrammingJava基础

评论

# re: 私有的成员能被子类继承吗? 2007-12-04 22:17 Matthew Chen

佩服,用debug应该很能说明问题拉.
  回复  更多评论   

# re: 私有的成员能被子类继承吗? 2007-12-04 23:18 Edward's

搞这么麻烦,用发射就能得到父类的私有属性  回复  更多评论   

# re: 私有的成员能被子类继承吗? 2007-12-05 09:32 ruderal

这样设计不应该说有没意义,应该说很合理.
如果子类没有私有objects对象,那addStr2Obs方法里面的objects又是什么?没声明的对象?!  回复  更多评论   

# re: 私有的成员能被子类继承吗? 2007-12-05 09:50 mlhorizon

书上不是说明了,你new出来的子类中其实就有一个父类的拷贝啊,要不然你的super指向哪里了!!这样子能使用父类的方法和对象就不稀奇了哈!!  回复  更多评论   

# re: 私有的成员能被子类继承吗? 2007-12-05 11:39 10:10

这个,当然是可以继承的,不过我认为这篇文章如果把对象继承的内存模型画出来就更好了:能从本质上说明问题  回复  更多评论   

# re: 私有的成员能被子类继承吗? 2012-02-12 21:18 sie

这篇文章有误人嫌疑,请看Java语言官方规范,明确写着私有成员不能被继承。  回复  更多评论   

# re: 私有的成员能被子类继承吗? 2012-04-18 16:15 何杨

@sie

你运行程序了吗?!  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
 
sitinspring(http://www.blogjava.net)原创,转载请注明出处.