Java知識點總結(內存分析)

Java知識點總結(內存分析)

@(Java知識點總結)[Java, Java面向對象]java

[toc]程序員

對象內存

類是建立對象的模板

Java對象的使用時經過引用進行的
基本數據類型直接賦值,引用類型傳遞的是一個地址
棧:存放局部變量
堆:存放new出來的對象
方法區:存放類的信息(代碼) 、static變量、常量池(字符串常量)等...this

clipboard.png

Student s1 = new Student();
s1.name="張三";
s1.study();
s1.sayHello("王武");
 
Student s2 = new Student();
s2.age = 18;
s2.name="李四";

垃圾回收機制(Garbage Collection)

  1. 對象空間的分配:使用new關鍵字便可
  2. 對象空間的釋放:將對象賦值null便可。垃圾回收器將負責回收全部"不可達"對象的內存空間
  3. 要點:程序員無權調用垃圾回收器
    程序員能夠經過System.gc() 通知GC運行,可是Java規範並不能保證當即運行
    finalize方法,是java提供程序員用來釋放對象,或資源的方法,可是儘可能少用
  4. 一個對象沒有被引用,就會被Java垃圾回收機制回收

static內存

  1. 在類中,用static聲明的成員變量爲靜態變量,或者叫作:類屬性,類變量,從屬於類,給對象分配的內存裏沒有
  2. 它爲類的公用變量,屬於類,被該類的全部實例共享,在類被載入時被顯示初始化
  3. 對於該類的全部對象來講,static成員變量只有一份,被該類的全部對象共享
  4. 可使用"對象.類屬性"來調用。不過通常都是用"類名.類屬性"
  5. static變量置於方法區中
  6. 用static聲明的方法爲靜態方法
  7. 類名.方法名調用
    在調用該方法時,不會將對象的引用傳遞給它,因此在static方法中,不可訪問非static的成員
  8. 靜態初始化代碼塊spa

    static{code

    ...

    }對象

若是但願加載後,對整個類進行某些初始化操做,可使用static初始化塊繼承

是在類初始化時執行,不是在建立對象時執行ip

靜態初始化塊中不能訪問非static成員內存

執行順序:上溯到Object類,先執行Object的靜態初始化塊,再向下執行子類的靜態初始化塊,直到咱們的類的靜態初始化塊爲止資源

多態內存

多態性是OOP的一個重要特性,主要是用來實現動態聯編的,換句話說,就是程序的最終狀態只有在執行過程當中才被決定而非在編譯期間就決定了。

這對於大型信息來講能提升系統的靈活性和擴展性

引用變量的兩種類型:

  • 編譯時類型 (模糊一點,通常是一個父類)
    由聲明時的類型決定
  • 運行時類型(運行時,具體哪一個子類就是哪一個子類)
    由實際對應的對象類型決定

多態的存在要有3個必要條件:

  • 要有繼承
  • 要有方法重寫
  • 父類引用指向子類對象

子類若是重寫了父類中的方法,方法調用的時候與實際類類型相綁定(傳遞的隱式參數this指向的開闢內存空間的類的對象,而不是父類的對象)

clipboard.png

public class Test {
  public static void testAnimalVoice(Animal c) {
    c.voice();
    if (c instanceof Cat) {
     ((Cat) c).catchMouse();
    }
  }
 
  public static void main(String[] args) {
    Animal a = new Cat();
    Cat a2 = (Cat) a;
    testAnimalVoice(a);
  }
}
 
class Animal {
  void voice() {
    System.out.println("發出動物的叫聲");
  }
}
 
class Cat extends Animal {
  private String name = "Tom";
  void catchMouse() { //方法存在隱式參數this和super
    super.voice();
    System.out.println(this.name+"抓老鼠");
  }
}
相關文章
相關標籤/搜索