1.關(guān)于在靜態(tài)方法中訪問(wèn)非靜態(tài)內(nèi)部類的問(wèn)題
public class Outer{
public String name = "Outer";
public static void main(String argv[]){
//Inner myinner = new Inner(); //直接用這句話創(chuàng)建會(huì)編譯錯(cuò)誤
Outer myouter=new Outer(); //先創(chuàng)建外部類的對(duì)象
Outer.Inner myinner=myouter.new Inner();
myinner.showName();
}//End of main
//下面這段代碼用來(lái)測(cè)試這種n煩的辦法
public void amethod(){
Outer myouter=new Outer();
Outer.Inner myinner=myouter.new Inner();
myinner.showName();
}
//非靜態(tài)方法訪問(wèn)非靜態(tài)內(nèi)部類
private class Inner{
String name =new String("Inner");
void showName(){
System.out.println(name);
}
}//End of Inner class
}
在非靜態(tài)方法訪問(wèn)非靜態(tài)內(nèi)部類直接創(chuàng)建該內(nèi)部類的對(duì)象:new Inner().showName();當(dāng)然也可以采取這種n煩的辦法假設(shè)private class Inner改成static private class Inner, 那么在靜態(tài)方法中訪問(wèn)靜態(tài)內(nèi)部類也是直接創(chuàng)建該內(nèi)部類的對(duì)象,即Inner myinner = new Inner(),或者Outer.Inner myinner = new Outer.Inner()也行得通,可見(jiàn)這種n煩的方法在上面三種情況下都是可以用的。
2.Abstract方法不能用final,static修飾非abstract方法在abstract類中可以用final,static
抽象類中的抽象方法不能是final,但是非抽象方法前加final可以編譯通過(guò)因?yàn)閍bstract和final相互排斥,前者專用于繼承,后者禁止繼承
抽象類中的抽象方法不能為static
非抽象方法可以為static
包裹類Integer、 String 、Float、 Double等都是final類,不能被繼承!Integer i=new Integer(“6”);如果字符串不是數(shù)字,會(huì)產(chǎn)生運(yùn)行異常(不會(huì)出現(xiàn)編譯錯(cuò)誤)但是對(duì)于boolean,這個(gè)規(guī)則不適用。當(dāng)字符串時(shí)(大小寫(xiě)無(wú)關(guān)),Boolean對(duì)象代表的數(shù)值為true,其他字符串均為false如:
Boolean b = new Boolean(“afiwou”); 代表false
Boolean b = new Boolean(“tRue”); 是true
3.多態(tài)性、虛擬方法調(diào)用
public class Test8 {
public static void main(String [] args){
Base b = new Subclass();
System.out.println(b.x);
System.out.println(b.method());
}
}
class Base{
int x = 2;
int method(){
return x;
}
}
class Subclass extends Base{
int x = 3;
int method(){
return x;
}
}
結(jié)果是2,3,而不是3,3
Employee e = new Manager();
e.department = " Finance " ;
//department 是Manager的一個(gè)特殊屬性
聲明變量e后,你能訪問(wèn)的對(duì)象部分只是Employee的部分;Manager的特殊部分是隱藏的。這是因?yàn)榫幾g器應(yīng)意識(shí)到,e 是一個(gè)Employee,而不是一個(gè)Manager。但重寫(xiě)的方法除外
在你接收父類的一個(gè)引用時(shí),你可以通過(guò)使用instanceof運(yùn)算符判定該對(duì)象實(shí)際上是你所要的子類,并可以用類型轉(zhuǎn)換該引用的辦法來(lái)恢復(fù)對(duì)象的全部功能。為什么說(shuō)“恢復(fù)對(duì)象的全部功能”,就是因?yàn)樯弦桓袼枋龅模宇悓?duì)象賦給父類句柄后,該句柄不能訪問(wèn)子類的那些特殊屬性和方法,要用就要重新造型。這其實(shí)是多態(tài)參數(shù)的后續(xù)應(yīng)用,形成這樣一個(gè)鏈條:傳入多態(tài)參數(shù)??instanceof判斷類型??casting??恢復(fù)功能
Employee e = new Manager();
e.getDetails();
在此例中,Manager 重寫(xiě)了Employee的getDetail()方法。被執(zhí)行的e.getDetails()方法來(lái)自對(duì)象的真實(shí)類型:Manager。事實(shí)上,執(zhí)行了與變量的運(yùn)行時(shí)類型(即,變量所引用的對(duì)象的類型)相關(guān)的行為,而不是與變量的編譯時(shí)類型相關(guān)的行為。這是面向?qū)ο笳Z(yǔ)言的一個(gè)重要特征。它也是多態(tài)性的一個(gè)特征,并通常被稱作虛擬方法調(diào)用??“動(dòng)態(tài)綁定”
寫(xiě)了這么多也不知道對(duì)你有沒(méi)有幫助呢?
posted @
2005-11-17 09:34 安德?tīng)査?閱讀(321) |
評(píng)論 (2) |
編輯 收藏
1.關(guān)于參數(shù)的傳遞
class ValHold{
public int i = 10;
}
public class ObParm{
public void amethod(){
ValHold v = new ValHold();
another(v);
System.out.println(v.i);
}
public void another(ValHold v){
v.i = 20;
ValHold vh = new ValHold();
v =vh;
System.out.println(v.i);
}
public static void main(String[] argv){
ObParm o = new ObParm();
o.amethod();
}
}
此題的答案是10,20,為什么不是10,10呢?
這樣解釋吧,按照sun官方的說(shuō)法:當(dāng)一個(gè)引用變量作為參數(shù)傳遞給一個(gè)方法時(shí), 在這個(gè)方法內(nèi)可以改變變量的值,即改變引用指向的對(duì)象,(本題中將vh賦給v)但是方法的調(diào)用結(jié)束后,改變量恢復(fù)原來(lái)的值,即變量仍然指向原來(lái)的對(duì)象。 (即another(v)調(diào)用結(jié)束之后,v又回復(fù)到第一次ValHold v = new ValHold();時(shí)指向的地址空間。) 但是如果在方法內(nèi)改變了引用指向的對(duì)象的數(shù)據(jù)(屬性),那么當(dāng)方法的調(diào)用結(jié)束后,盡管引用仍然指向原來(lái)的對(duì)象,這個(gè)對(duì)象的某個(gè)屬性已經(jīng)被改變了(v的i值在 執(zhí)行v.i=20的時(shí)候就已經(jīng)被改變了,所以調(diào)用another結(jié)束后,v.i已經(jīng)變成了20) .
2.關(guān)于內(nèi)部類
public class InOut{
String s= new String("Between");
public void amethod(final int iArgs) {
int iam;
class Bicycle{
Bicycle() {
System.out.println(s); //這兩句話可以,也就是說(shuō)可以訪問(wèn)s
System.out.println(iArgs); //和final int 常量
//System.out.println(iOther);
}
}
new Bicycle();
}
public void another(){
int iOther;
}
public static void main(String[] args) {
InOut inout= new InOut();
inout.amethod(22);
}
}
Inner class能夠存取外部類的所有實(shí)例變量----無(wú)論這些實(shí)例變量有什么樣的存取控制符(比如private),就像類中的方法能夠存取方法所在類的所有變量一樣;如果inner class定義在方法中,則inner class能夠存取方法所在的類中的實(shí)例變量,也能存取該方法中的局部變量,但該局部變量必須是final的,也就是只能訪問(wèn)方法中的常量.(上面所說(shuō)的都是普通內(nèi)部類,不是靜態(tài)內(nèi)部類的情況).
public class Testinner {
int t=10;
public void a() {
final int u =90;
class InMethod { //方法中內(nèi)部類
InMethod() { //內(nèi)部類的構(gòu)造方法
System.out.println("u="+u); //封裝方法內(nèi)的變量必須是final才能訪問(wèn)到!
System.out.println("t="+t); //外部類的變量可以任意訪問(wèn)!
}
}
new InMethod();//必須在方法a()中創(chuàng)建內(nèi)部類對(duì)象之后,Testinner對(duì)象才能通過(guò) a()訪問(wèn)到InMethod類
}
public static void main (String[] args) {
Testinner t= new Testinner();
t.a();
}
}
輸出:u=90 ,t=10
方法中的內(nèi)部類不可以是static的!如果一個(gè)內(nèi)部類是靜態(tài)的(當(dāng)然只能是類中的內(nèi)部類啦),那么這個(gè)類就自動(dòng)的成為頂級(jí)(top-level)類即普通的類。靜態(tài)內(nèi)部類中的方法(無(wú)論是靜態(tài)的方法還是非靜態(tài)的方法)只能直接訪問(wèn)外部類中的靜態(tài)成員,要訪問(wèn)外部類中的非靜態(tài)成員,則必須創(chuàng)建外部類的對(duì)象。
posted @
2005-11-17 09:33 安德?tīng)査?閱讀(207) |
評(píng)論 (0) |
編輯 收藏