1. 程式人生 > >java基礎問題----abstract的method是否可同時是static,是否可同時是native,是否可同時是synchronized

java基礎問題----abstract的method是否可同時是static,是否可同時是native,是否可同時是synchronized

28、abstract的method是否可同時是static,是否可同時是native,是否可同時是synchronized?


abstract的method 不可以是static的,因為抽象的方法是要被子類實現的,而static與子類扯不上關係!
native方法表示該方法要用另外一種依賴平臺的程式語言實現的,不存在著被子類實現的問題,所以,它也不能是抽象的,不能與abstract混用。例如,FileOutputSteam類要硬體打交道,底層的實現用的是作業系統相關的api實現,例如,在windows用c語言實現的,所以,檢視jdk 的原始碼,可以發現FileOutputStream的open方法的定義如下:
private native void open(String name) throws FileNotFoundException;
如果我們要用java呼叫別人寫的c語言函式,我們是無法直接呼叫的,我們需要按照java的要求寫一個c語言的函式,又我們的這個c語言函式去呼叫別人的c語言函式。由於我們的c語言函式是按java的要求來寫的,我們這個c語言函式就可以與java對接上,java那邊的對接方式就是定義出與我們這個c函式相對應的方法,java中對應的方法不需要寫具體的程式碼,但需要在前面宣告native。
關於synchronized與abstract合用的問題,我覺得也不行,因為在我幾年的學習和開發中,從來沒見到過這種情況,並且我覺得synchronized應該是作用在一個具體的方法上才有意義。而且,方法上的synchronized同步所使用的同步鎖物件是this,而抽象方法上無法確定this是什麼。
29、什麼是內部類?Static Nested Class 和 Inner Class的不同。


內部類就是在一個類的內部定義的類,內部類中不能定義靜態成員(靜態成員不是物件的特性,只是為了找一個容身之處,所以需要放到一個類中而已,這麼一點小事,你還要把它放到類內部的一個類中,過分了啊!提供內部類,不是為讓你幹這種事情,無聊,不讓你幹。我想可能是既然靜態成員類似c語言的全域性變數,而內部類通常是用於建立內部物件用的,所以,把“全域性變數”放在內部類中就是毫無意義的事情,既然是毫無意義的事情,就應該被禁止),內部類可以直接訪問外部類中的成員變數,內部類可以定義在外部類的方法外面,也可以定義在外部類的方法體中,如下所示:
public class Outer
{
           int out_x  = 0;
           public void method()
                   {
                    Inner1 inner1 = new Inner1();
                    public class Inner2   //在方法體內部定義的內部類
                    {
                             public method()
                             {
                                       out_x = 3;
                             }
                    }
                    Inner2 inner2 = new Inner2();
           }
 
           public class Inner1   //在方法體外面定義的內部類
           {
           }
          
}
在方法體外面定義的內部類的訪問型別可以是public,protecte,預設的,private等4種類型,這就好像類中定義的成員變數有4種訪問型別一樣,它們決定這個內部類的定義對其他類是否可見;對於這種情況,我們也可以在外面建立內部類的例項物件,建立內部類的例項物件時,一定要先建立外部類的例項物件,然後用這個外部類的例項物件去建立內部類的例項物件,程式碼如下:
Outer outer = new Outer();
Outer.Inner1 inner1 = outer.new Innner1();
 
在方法內部定義的內部類前面不能有訪問型別修飾符,就好像方法中定義的區域性變數一樣,但這種內部類的前面可以使用final或abstract修飾符。這種內部類對其他類是不可見的其他類無法引用這種內部類,但是這種內部類建立的例項物件可以傳遞給其他類訪問。這種內部類必須是先定義,後使用,即內部類的定義程式碼必須出現在使用該類之前,這與方法中的區域性變數必須先定義後使用的道理也是一樣的。這種內部類可以訪問方法體中的區域性變數,但是,該區域性變數前必須加final修飾符。
對於這些細節,只要在eclipse寫程式碼試試,根據開發工具提示的各類錯誤資訊就可以馬上了解到。
 
在方法體內部還可以採用如下語法來建立一種匿名內部類,即定義某一介面或類的子類的同時,還建立了該子類的例項物件,無需為該子類定義名稱:
public class Outer
{
           public void start()
           {
                    new Thread(
new Runable(){
                                       public void run(){};
}
).start();
           }
}
 
最後,在方法外部定義的內部類前面可以加上static關鍵字,從而成為Static Nested Class,它不再具有內部類的特性,所有,從狹義上講,它不是內部類。Static Nested Class與普通類在執行時的行為和功能上沒有什麼區別,只是在程式設計引用時的語法上有一些差別,它可以定義成public、protected、預設的、private等多種型別,而普通類只能定義成public和預設的這兩種型別。在外面引用Static Nested Class類的名稱為“外部類名.內部類名”。在外面不需要建立外部類的例項物件,就可以直接建立Static Nested Class,例如,假設Inner是定義在Outer類中的Static Nested Class,那麼可以使用如下語句建立Inner類:
Outer.Inner inner = new Outer.Inner();
由於static Nested Class不依賴於外部類的例項物件,所以,static Nested Class能訪問外部類的非static成員變數。當在外部類中訪問Static Nested Class時,可以直接使用Static Nested Class的名字,而不需要加上外部類的名字了,在Static Nested Class中也可以直接引用外部類的static的成員變數,不需要加上外部類的名字。
在靜態方法中定義的內部類也是Static Nested Class,這時候不能在類前面加static關鍵字,靜態方法中的Static Nested Class與普通方法中的內部類的應用方式很相似,它除了可以直接訪問外部類中的static的成員變數,還可以訪問靜態方法中的區域性變數,但是,該區域性變數前必須加final修飾符。