如果你的答案是斬釘截鐵的"不能",那么請你繼續向下看,說不定這篇文章能對你有所用處.
首先請看兩個類的代碼:
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.tkk7.com/Files/sitinspring/PrivatePuzzle20071204210542.rar