2016-04-07 68 views
1

「obj對象= NULL」我有以下代碼差異「obj對象=新的對象()」,並在靜態和非靜態函數

public class Sample { 
    public static void display(){ 
     System.out.println("Hai Sample"); 
    } 
    public void displays(){ 
     System.out.println("Hai Sample"); 
    } 
} 

public class Sample2 { 
    public static void main(String[] args) { 
     Sample obj=null; 
     obj.display(); 
     obj.displays(); 
     } 
} 

在這裏,當我們用null分配到樣品OBJ我只能訪問靜態方法。如果我使用像Sample obj= new Sample();這樣的新運營商,我可以訪問靜態和非靜態方法。

這裏我的問題是,對象初始化如何發生在這裏和空怎麼樣是指對象的靜態方法,爲什麼不非靜態方法

回答

1

不同的是,在一種情況下(new Sample()),你有一個實例。在第二種情況下(null),您不要

display是一個靜態方法(與類有關,而不是任何實例); displays是一個實例方法(與特定實例有關)。這是Java語法的怪癖,您可以通過看起來像這樣的東西來引用static字段和方法。由於該實例並未實際使用,因此不會解除引用,因此它的實際情況不會造成任何麻煩。

你在main代碼實際上此:

public static void main(String[] args) { 
    Sample obj=null; 
    Sample.display(); // `display` is static, no instance is used 
    obj.displays(); // `displays` is non-static, requires an instance 
} 

當你似乎通過obj調用display,其實所有的編譯器使用obj變量是看它的類型是什麼(在此情況下,Sample)。變量(null或實例,無論哪種方式)的完全不用,並且沒有錯誤。

相反,主叫displays,所述obj變量既用於它的類型(Sample它的價值,因爲調用displays當JVM需要作爲this使用用於呼叫的參考。試圖用null引用調用實例方法是一個錯誤。

1

與實例成員不同,您不需要實際的類實例來訪問static成員。

所以,你這樣做:

obj.display(); 

這是由JVM認爲:

Sample.display(); 

,並沒有問題運行。

但是,一個實例成員依賴於該類的每個實例(並且每個實例都是唯一的)。它不存在,直到實例生成。

obj.display(); 

是代碼,你不應該寫:人誰可能要以後維護你的代碼,可能會誤以爲是一個實例成員,並且假定調用該方法的影響僅限於該實例獨自一人,其不是這樣。

至於創建新實例的細節,請查看official documentation中的主題頁面。

1

這裏我的問題是,對象初始化如何在這裏發生和如何空指樣本對象的靜態方法

它沒有! null爲空。

您可以在不創建任何對象的情況下調用靜態方法。

此外,你應該調用靜態方法靜態方法:

Sample.display(); 

一個好的IDE應該給你一個警告/錯誤,您正在訪問的方法方式:

靜態方法顯示()從型樣品應該以靜態方式

1

被訪問當 -

Sample obj=null; 

而你試圖訪問,

public void display() { 
    System.out.println("Error"); 
} 

它會顯示錯誤。它需要一個實例。但你可以稱之爲 -

public static void display(){ 
    System.out.println("Success"); 
} 

因爲它是靜態的,所以不需要實例。