細節二:參數、引用類型、實例化

一、null和""空字符串的區別
null不指向任何對象,至關於沒有任何值,null不分配內存空間
""表明一個長度爲0的字符串,""會分配內存空間
字符串類型的默認值爲nulljava

二、成員變量在new對象初始化的時候,會默認的給上初始值(默認值)
在方法中的局部變量沒有初始值,要使用的話,必須先賦值函數

三、字符串類型屬於引用類型,棧中的引用指向堆裏的對象
一個String對象在 堆內存 中建立之後, 就不能被改變了
請注意String對象的全部方法都不會改變其自己,而是會返回一個新的String對象.對象

四、java對String類型作了特殊處理
String a = "123";
String b = "123";
System.out.println(a.equals(b)); 輸出true
System.out.println(a==b); 輸出true內存

正常狀況下,比較對象是否相等
String a1 = new String("aaa");
String b1 = new String("aaa");
System.out.println(a1.equals(b1)); 輸出true
System.out.println(a1 == b1); 輸出false字符串

五、實參和與其對應的形參各佔用獨立的存儲單元class

參數爲基本數據類型
基本數據類型實參傳遞到形參的是值,形參的改變不會影響實參
static int [] a ;
public static int[] way(int[] a) {
  a = new int[5];
  return a;
}

public static void main(String[] args) {
  a = new int[3];
  way(a) ;
  System.out.println(a.length); 輸出3

  a = way(a);
  System.out.println(a.length); 輸出5
}test

參數爲引用類型,實參傳遞到形參的是地址
public class Manager {
  String name;
  int age;
  public void manager(Manager m) {
    m.name = "張三" ;
    m.age = 23;
    System.out.println(m.name+"\t"+m.age );
  }
}變量

public class Test{
  public static void main(String[] args) {
    Manager m = new Manager();
    m.name = "李四";
    m.age = 22;構造函數

    //將實參的地址傳遞給形參,實參與形參指向同一個對象
    m.manager(m);
    System.out.println(m.name+"\t"+m.age );
  } 數據類型

}
運行:
張三 23
張三 23

public class Manager {
  String name;
  int age;
  public void manager(Manager m) {
    //在此處給形參m,從新new一個對象,形參m會指向新的地址
    m = new Manager();
    m.name = "張三" ;
    m.age = 23;
    System.out.println(m.name+"\t"+m.age );
  }
}

public class Test{
  public static void main(String[] args) {
    Manager m = new Manager();
    m.name = "李四";
    m.age = 22;

    //將實參的地址傳遞給形參,實參與形參指向同一個對象
    m.manager(m);
    System.out.println(m.name+"\t"+m.age );
  }

}
運行:
張三 23
李四 22

六、實例化一個對象的過程:
一、加載父類(有直接父類的狀況下)
二、在堆內存中開闢空間,分配內存
三、對對象屬性進行默認初始化
四、調用對應的構造方法進行初始化
五、在構造方法中,第一行先調用父類的構造方法進行初始化
六、進行子類構造函數初始化

若是一個函數的static修飾的成員變量是引用類型,那麼就算這個函數進行屢次實例化,它的static修飾的引用類型成員變量也只會實例化一次

public class Book {
  Test04 test1 = new Test04();
  public Book (int num) {
    System.out.println("book"+num);
  }
  static Test04 test2 = new Test04();
}

public class Test04 {   public Test04() {     System.out.println("Test04");   }   public static void main(String[] args) {     Book book1 = new Book(1);     Book book2 = new Book(2);   } } 運行: Test04 Test04 book1 Test04 book2

相關文章
相關標籤/搜索