java基礎 題和知識點總結, 關於String s是否默認初始化為null......,new一個對象和類靜態域,是不是在內存中不是一個地方


一道筆試題

22. 下面代碼的運行結果為:()

復制代碼
import java.io.*;
import java.util.*;

public class foo{

    public static void main (String[] args){

        String s;

        System.out.println("s=" + s);

    }

}
復制代碼

A 代碼得到編譯,並輸出“s=”

B 代碼得到編譯,並輸出“s=null”

C 由於String s沒有初始化,代碼不能編譯通過

D 代碼得到編譯,但捕獲到 NullPointException異常

答案:C

解析:開始以為會輸出null什么的,運行后才發現Java中所有定義的基本類型或對象都必須初始化才能輸出值。

以上解析錯了.

原因是,方法中的局部變量一定要手動初始化,不然編譯會報錯.

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    The local variable s may not have been initialized

 

 二. 那么也就是說,全局變量不需要手動初始化,JVM會自動初始化為null或0.

public class Test00001{
     static String s;
     String x=8;
     String y;
     /*string類型在代碼中屬於局部變量,那么局部變量必須賦值,哪怕是null,否則編譯通不過的,
      * 會提示說此變量未初始化,如果是類的成員變量,則可以不賦值,它會有默認值的。
java為了規避一些運行期間的空指針錯誤,都會強調局部變量必須賦值,
否則編譯器會立即報錯,提示用戶修改。 */
    public static void main (String[] args){

        Test00001 t = new Test00001();
        System.out.println(t.s);//輸出null
        System.out.println(t.x);//輸出null
        System.out.println(x);//報錯,沒有初始化,或者不是類靜態變量
        //方法中不能調用類的非靜態變量屬性??哪怕已經初始化.
        System.out.println("s=" + s);//輸出null

    }

}

只要能夠調用,全局變量(也就是類變量)都有自動的初始化值.    不會產生編譯器報錯

 

三.但是又產生一個新問題,很重要,

 

類的靜態方法(函數)中為什么不能調用非靜態成員(屬性)?

 

程序最終都將在內存中執行,變量只有在內存中占有一席之地時才能被訪問。
類的靜態成員(變量和方法)屬於類本身,在類加載的時候就會分配內存,可以通過類名直接去訪問;非靜態成員(變量和方法)屬於類的對象,所以只有在類的對象產生(創建類的實例)時才會分配內存,然后通過類的對象(實例)去訪問。
在一個類的靜態成員中去訪問其非靜態成員之所以會出錯是因為在類的非靜態成員不存在的時候類的靜態成員就已經存在了,訪問一個內存中不存在的東西當然會出錯:class CA{private:int a; //非靜態成員,創建類的實例時分配內存,類的不同實例對應不同的內存區域

yes,上訴就是真正的原因.

 

所以main方法也是static 類的靜態方法,所以他不能直接調用類的非靜態屬性和方法.   此時,雖然不需要初始化類屬性變量,但是因為不能直接調用非靜態變量,依然報錯.

public class Test04 {
    String s;
    public static void main(String[] args) {
            System.out.println(s);//報錯
    }

}
Unresolved compilation problem: 
    Cannot make a static reference to the non-static field s

 注意這和一開始的局部變量一定要初始化報錯,本質不同!

 

 

四.那么類中非靜態方法可以直接調用非靜態變量嗎?,可以!

public class Test02 {
    String s;
    public static void main(String[] args) {
        Test02 t = new Test02();
        t.test();  //輸出null
    }
public void test(){
    System.out.println(s);
}
}

原因是在 new 實例化一個類的 對象時,會加載這個類的所有屬性和方法,將其放到內存中來.

但是,以下又會報錯:

public class Test02 {
    String s;
    public static void main(String[] args) {
        Test02 t = new Test02();
        t.test();
        System.out.println(s);//報錯
    }
public void test(){
    System.out.println(s);
}
}
 Unresolved compilation problem: 
    Cannot make a static reference to the non-static field s

還是會報 靜態方法不能調用非靜態變量.

雖然,在靜態方法中初始化這個類的對象.

原因暫時不清楚,java ,new一個對象和類靜態域,是不是在內存中不是一個地方,  以前看過一個視頻,好像是放在

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM