天天看點

java中學到的一點新知識

  這是我第一次寫自己的部落格,關于java方面的平時的一點心得,記錄我學習過程中的收獲。同時如果能對看到這文章的人有一絲影響,那我就跟榮幸了。第一次寫,寫的不好的各位見諒

1.對于this的一個用法導緻死循環:

class A

{

 public String toString()

 {

  return " "+this;

 }

}

class Test

 public static void main(String[] args)

  A a=new A();

  System.out.println(a);

在main函數中定義了類A的對象,調用系統類的标準輸出函數,而傳遞的是對象,就會調用對象的toString方法,而在類A中重寫了toString方法,傳回時又遇到了this它有會調用自身的toString方法,這就相當于一直遞歸,遞歸函數存放到棧中,直到棧滿,最後會抛出棧溢出異常。是以用this時要留個心。

2.增強型for循環:String[] s={"ajdfjf","kajfkdsaj","adsfkk","dafafd"};

                                for(String str:s)

                                        System.out.println(str);

for循環中相當于每次從字元串數組中每次取一個字元串指派給str,直到取空了字元串數組s就退出了for循環。

3.java中數組在定義時不能直接指定數組的大小,形如int a[3],正确的寫法是int a[]=new int[3];或者寫成int a[]; a=new int[3];java中數組推薦定義方式int[] num;

4.類的資料成員與成員方法:類的成員方法在記憶體中隻有一份拷貝,而資料成員對于每個對象都有一份拷貝。

5.java中main函數了解:public static void main(String[] args)

6.java中的System類的一點知識:System類中定義了三個final類型的常量對象in, out , err,前一個是InputStream的對象後兩個是PrintStream對象,沒想清楚為什麼可以直接生成抽象類的執行個體,今天看一下源代碼如下:

public final static InputStream in = nullInputStream();

public final static PrintStream out = nullPrintStream();

這裡可以明顯的看到這應該是要給對象賦空值,接着在裡面找到了nullInputStream()和nullPrintStream(),如下:

private static InputStream nullInputStream() throws NullPointerException {

      if (currentTimeMillis() > 0) {

          return null;

      }

      throw new NullPointerException();

    }

    private static PrintStream nullPrintStream() throws NullPointerException {

/**

     * The following two methods exist because in, out, and err must be initialized to null. The compiler, however, cannot be permitted to inline access to them, since they are later set to more sensible value by initializeSystemClass().

     */

從這裡面我們可以看到隻要是這個程式啟動了首先給這些對象賦空值,之後就不會出現空指針異常,還有從這兩個方法的注釋可以看出這是賦空值。但是之後會利用initializeSystemClass()方法來給那幾個對象設定更合理的值,這就解釋了為什麼可以再外面調用對象in,out,err