如果你的答案是斬釘截鐵的"不能",那么請(qǐng)你繼續(xù)向下看,說(shuō)不定這篇文章能對(duì)你有所用處.
首先請(qǐng)看兩個(gè)類的代碼:
BaseClass:
package com.sitinspring;
import java.util.Vector;
/**
* 基類BaseClass,ChildClass類的父類
* @author: sitinspring(junglesong@gmail.com)
* @date: 2007-12-4
*/
public class BaseClass{
// 私有動(dòng)態(tài)數(shù)組成員,注意它是"private"的
private Vector objects;
/**
* 在構(gòu)造函數(shù)
*
*/
public BaseClass(){
objects=new Vector();
}
/**
* 公有函數(shù),向動(dòng)態(tài)數(shù)組成員objects添加字符串
* @param str
*/
@SuppressWarnings("unchecked")
public void addStr2Obs(String str){
objects.add(str);
}
/**
* 公有函數(shù),打印objects中的諸元素
*
*/
public void printAll(){
for(int i=0;i<objects.size();i++){
System.out.println("序號(hào)="+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(){
// 下面的句子是不能編譯通過(guò)的
/*for(int i=0;i<objects.size();i++){
System.out.println("序號(hào)="+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();
}
}
再讓我們把斷點(diǎn)停在main函數(shù)中的childClass.printAll()上,看看實(shí)例childClass中到底有什么.
以上截圖證明:
objects確實(shí)是ChildClass類實(shí)例childClass的成員,而且四個(gè)字符串也都被加進(jìn)去了.
最后執(zhí)行出來(lái),結(jié)果如下:
序號(hào)=0 元素=Hello
序號(hào)=1 元素=World
序號(hào)=2 元素=China
序號(hào)=3 元素=sitinspring
這也說(shuō)明,上面紅字部分的論斷是正確的.
再翻看書籍,關(guān)于private限制的成員變量是這樣寫的:
private 只允許來(lái)自改類內(nèi)部的方法訪問(wèn).不允許任何來(lái)自該類外部的訪問(wèn).
我們上面添字符串和遍歷輸出函數(shù)都是BaseClass的成員,所以它當(dāng)然被這兩個(gè)函數(shù)訪問(wèn).而ChildClass的printObjects是BaseClass類外部的函數(shù),結(jié)果當(dāng)然是編譯也不能通過(guò).
實(shí)際上,private,public,protected和繼承沒(méi)有關(guān)系,他們對(duì)成員函數(shù)和變量的限制只是在成員的可見(jiàn)性上,
public允許來(lái)自任何類的訪問(wèn);
private只允許來(lái)自改類內(nèi)部的方法訪問(wèn),不允許任何來(lái)自該類外部的訪問(wèn);
protected允許來(lái)自同一包中的任何類以及改類的任何地方的任何子類的方法訪問(wèn).
而關(guān)于成員變量的繼承,
父類的任何成員變量都是會(huì)被子類繼承下去的,私有的objects就是明證,這些繼承下來(lái)的私有成員雖對(duì)子類來(lái)說(shuō)不可見(jiàn),但子類仍然可以用父類的函數(shù)操作他們.
這樣的設(shè)計(jì)有何意義呢?我們可以用這個(gè)方法將我們的成員保護(hù)得更好,讓子類的設(shè)計(jì)者也只能通過(guò)父類指定的方法修改父類的私有成員,這樣將能把類保護(hù)得更好,這對(duì)一個(gè)完整的繼承體系是尤為可貴的. jdk源碼就有這樣的例子,java.util.Observable就是這樣設(shè)計(jì)的.
本文例子下載:
http://m.tkk7.com/Files/sitinspring/PrivatePuzzle20071204210542.rar