【Java學習筆記】2015.1.5

1.classpath中的「.」表示當前的路徑,因此配置classpath時要注意不能忘了「.」。若是不注意,會出現cmd下運行程序時,.java文件能夠編譯可是不能運行;
通常的classpath配置以下:
.;%JAVA_HOME%/lib/tool.jar;%java_home%/lib/rt.jar

 之因此提到這個,是由於在作後面程序的測試時,犯了這個錯誤,我在配置classpath時忘掉了「.」,因而一直報 NoClassDefFoundError的錯誤,而後發現是本身沒有把當前路徑加入到java的classpath,jvm固然找不到我編譯好的class。java

2.關於Java主類中main方法裏args的做用:
       args這裏一樣是用於傳遞參數,舉例說明。假設咱們的demo是Member_and_local.java,代碼以下:
public class Member_and_local {
  public static void main(String[] args){
    //測試main函數傳參
        System.out.println( "第1個參數是"+args[0]+" 第2個參數是"+args[1]+" 第3個參數是"+args[2]);
    }
}

  在咱們用cmd命令行運行java程序時,通常狀況下,首先 javac Member_and_local.java 編譯,而後 java Member_and_local 運行,其實args給咱們提供了一個傳遞參數的接口。只要咱們代碼中有相應的處理,能夠在後面加上參數運行,例如圖1中,咱們執行java Member_and_local 李根 1 232,這樣咱們在程序中就能夠經過args[0]來訪問字符串「李根」,args[1]來訪問「1」,args[2]來訪問「232」程序員

       圖1.args使用測試          jvm

運行結果如上,第一次運行沒有添加參數,程序報錯,緣由是:在沒有參數輸入時,我在程序中調用了args[0]、args[1]、args[2],固然指針溢出,而添加參數後,正常輸出。
另外,咱們能夠設置不一樣的參數類型,好比把String換成int,能夠得到int型的參數;
Public static void main( String[] int[] args){}
綜上,args是便於程序員作傳參的一種方法。
 
3.局部變量和成員變量
我不知道java裏怎麼準肯定義這兩種變量,可是個人理解以下:
局部變量:是指在 全部方法中定義的變量(包括main方法),它只在方法執行過程當中有效,存在於棧中, 必須先作初始化才能調用,方法結束後,會被清空。
成員變量:也叫全局變量,是指在類中定義的變量,存在於堆中;它在整個類中都有效,只要類不被回收,它就一直存在,而且會自動初始化。
成員變量又可分爲:類變量和實例變量
  (1)類變量:又叫靜態變量,用static修飾,它能夠直接用類名調用,也能夠用對象調用,並且全部對象的同一個類變量都是共享同一塊內存空間的。
  (2)實例變量:不用static修飾,它只能經過對象調用,並且全部對象的同一個實例變量是共享不一樣的內存空間的。
 
下面舉例說明:
a.局部變量要初始化,成員變量會自動初始化
public class Member_and_local {
    public static void main(String[] args){
        //測試局部變量
        //error: local variables must be initialed
        String name;
        int age;
        boolean sex;
        System.out.println( name+age+sex);
    }
}

此段程序會報錯,由於name,age,sex是main方法中的局部變量在不初始化時會編譯不經過,由於它未初始化函數

而成員變量則不一樣,咱們用以下代碼測試:測試

public class Member_and_local {
    public static void main(String[] args){
        Human ligen = new Human();
        ligen.getInfo();
    }
}
class Human{
    public static int population;
    private boolean sex;
    private String name;
    private int age;
    private Human partner;
    private double height;
    public void getInfo(){
        System.out.println( this.population+" "+this.sex+" "+this.name+" "+this.age);
        System.out.println( " "+this.partner+" "+this.height);
    }
}    

咱們定義了一個Human類,而且定義了6種不一樣類型的成員變量,他們均未初始化,可是咱們使用getInfo()方法直接訪問成員變量,結果並未出錯,而是以下this

0 false null 0 null 0.0
那麼能夠看出各個類型的默認值以下表:
類型(Type) int double String(Object) Human(Object) boolean
默認值(default) 0 0.0 null null false
其餘類型能夠在使用時具體查詢,可是這裏咱們仍是養成良好的習慣,將成員變量自動初始化。
 
b.類變量能夠用類名或者對象實例訪問,實例變量只能用對象實例訪問(類方法,實例方法同理)。用static關鍵字標註。
public class Member_and_local {
    public static void main(String[] args){        
        //測試類變量和實例變量
        System.out.println(Human.population);
        Human ligen = new Human();
        System.out.println(ligen.population);        
    }
}
class Human{
    public static int population;
    public Human(){
        this.population += 1;
    }
}

結果爲0 1;說明類變量能夠同時被類對象,實例對象訪問。spa

 

4.引用中存放的不是對象地址,可是存放的內容能夠找到對象的堆地址;命令行

public class Member_and_local {
    public static void main(String[] args){
        //查看引用中存放的是什麼
        Human ligen = new Human();
        System.out.println(ligen);
    }
}

結果爲指針

Human@459189e1

這個內容不是地址,可是應該能夠用於尋找ligen這個對象的地址。修正:準確是 ligen.getClass().getName() + "@" + 16進制哈希碼。code

 

5.java參數的值傳遞和引用傳遞

java中方法的參數有多是基本變量int,long,boolean等,也多是普通包裝類對象String,Object等。在作參數傳遞時,前者是值傳遞,也就是將原變量複製一份傳給參數;後者是引用傳遞,則是將對象的引用複製一份傳遞給參數;這麼一來就會致使一些問題,若是該方法對傳入的參數作改變,值傳遞是不會影響原變量,可是引用傳遞則會影響原變量

相關文章
相關標籤/搜索