2014-12-05 78 views
2

我可以繁殖的靜態和非靜態變量,像這樣:與靜態和非靜態變量的數學運算

public class C { 
    protected int c; 
    private static int s; 
    public int ma() { return this.c*this.s; } 
} 

或者:

public class B{ 
    protected int x; 
    private static int y; 
    public static int ms() { return x + y; } 
} 

第二個代碼不工作,我想知道是因爲它期待靜態嗎?

回答

6

第二個代碼塊不起作用,因爲msstatic。您不能從static上下文中引用非static成員(x)。

您需要使ms爲非static函數或使xstatic變量。

像這樣:

public class B{ 
    protected static int x; // now static 
    private static int y; 
    public static int ms() { return x + y; } 
} 

或者是這樣的:

public class B{ 
    protected int x; 
    private static int y; 
    public int ms() { return x + y; } // now non-static 
} 
1

靜態變量/函數是一個跨應用程序共享。在你的第二個例子中

public class B{ 
    protected int x; 
    private static int y; 
    public static int ms() { return x + y; } 
} 

你的方法被聲明爲靜態的,因此是一個靜態上下文。經驗法則:您無法從靜態上下文訪問非靜態事物。這是爲什麼是這樣的一些推理。

假設您有兩個B類型的對象,其中x=1和其中一個x=2。由於y是靜態的,它被兩個對象共享。讓y=0

假設您從程序的其他地方撥打B.ms()。你不是指任何特定的B對象。因此,JVM無法添加x + y,因爲它不知道要使用哪個值x。合理?