成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java對象與內存管理

開發 后端
今天我們將談到Java對象與內存管理,包括相關實例代碼以及錯誤編譯的代碼,供大家參考。

1.實例變量和類變量的內存分配

類變量 :使用static修飾的成員變量是類變量,屬于該類本身

實例變量:沒有使用static修飾的成員變量是實例變量,屬于該類的實例

由于同一個JVM內每個累只對應一個Class對象,因此同一個JVM內的一個類的類變量只需一塊內存空間。

對于實例變量而言,該類沒創建一次實例,就需要為實例變量分配一塊內存空間,所以,程序中有幾個實例,實例變量就需要幾塊內存空間。

2.類變量的初始化時機總是出于實例變量的初始化之前

我們先看下下面三段代碼:

1)因為兩個實例變量都是在創建變量的時候才開始分配空間,此時num2還沒有分配,所以前向引用就會出現編譯錯誤。

  1. int num = num2 + 3;    //非法前向引用,會報錯 
  2. int num2 = 2 

2)因為兩個類變量在JVM加載類的時候分配空間,此時num2還沒有分配,所以前向引用就出現變異錯誤。

  1. static int num = num2 + 3;    //非法前向引用,會報錯 
  2. tatic int num2 = 2 

3)因為類變量num2在JVM加載類的時候空間已經分配好,而num在創建實例的時候踩分配空間,此時num2已經分配成功了,所以num前向引用成功。

  1. int num = num2 + 3;    //正確使用 
  2. static int num2 = 2

由上面三段代碼塊就可以驗證得:類變量的初始化時機總是出于實例變量的初始化之前

3.Java對象的初始化方式及其執行順序

Java對象的初始化方式有三種:1)構造器  2)初始化塊  3)定義變量時指定初始化值

如果這三種初始化方式同時出現,也要注意,他們也有一個執行順序的規定:

1)靜態初始化塊只在類第一次創建對象的時候運行一次,后面就不會再運行,而類在每次創建對象時,非靜態初始化塊總是會運行一次。

  1. public class Test{ 
  2.      static { 
  3.          System.out.println("執行---靜態初始化代碼塊."); 
  4.      } 
  5.       
  6.      { 
  7.          System.out.println("執行---非靜態初始化代碼塊."); 
  8.      } 
  9.       
  10.      public static void main(String[] args) { 
  11.          for (int i = 1; i <= 2; i++) { 
  12.              System.out.println("創建第 " + i + " 個對象");  
  13.              new Test(); 
  14.              System.out.println(); 
  15.          } 
  16.      } 
  17.  } 
 

運行結果:

2)構造器每次創建對象時,構造器必然有執行的機會,此時,非靜態初始化塊必定也將獲得機會并且運行在構造器之前

  1. public class Test{ 
  2.   
  3.      { 
  4.          System.out.println("執行---非靜態初始化代碼塊."); 
  5.      } 
  6.       
  7.      public Test() { 
  8.          System.out.println("執行---構造器."); 
  9.      } 
  10.       
  11.      public static void main(String[] args) { 
  12.          for (int i = 1; i <= 2; i++) { 
  13.              System.out.println("創建第 " + i + " 個對象");  
  14.              new Test(); 
  15.              System.out.println(); 
  16.          } 
  17.      } 
  18.  } 
 

運行結果:

3)定義變量時指定的初始化值和初始化塊中指定的初始值的執行順序與他們在源程序中的排列順序相同。

驗證代碼一:

  1. public class Test{ 
  2.       
  3.      String i = "定義變量時指定的初始化值"
  4.   
  5.      { 
  6.          i = "初始化塊中指定的初始值"
  7.      } 
  8.       
  9.      public static void main(String[] args) { 
  10.          for (int i = 1; i <= 2; i++) { 
  11.              System.out.println("創建第 " + i + " 個對象");  
  12.              System.out.println(new Test().i); 
  13.              System.out.println(); 
  14.          } 
  15.      } 
  16.  } 

運行結果

驗證代碼二 :

  1. public class Test{ 
  2.   
  3.      { 
  4.          i = "初始化塊中指定的初始值"
  5.      } 
  6.       
  7.      String i = "定義變量時指定的初始化值"
  8.   
  9.      public static void main(String[] args) { 
  10.          for (int i = 1; i <= 2; i++) { 
  11.              System.out.println("創建第 " + i + " 個對象");  
  12.              System.out.println(new Test().i); 
  13.              System.out.println(); 
  14.          } 
  15.      } 
  16.  } 

運行結果:

4.關于父子實例的內存控制

(一般情況下是不用內部類來驗證的,但是都是一樣的啦,我偷懶下,所以使用了內部類,大家原諒哈)

1)當子類重寫父類方法后,父類表面上只是調用屬于自己的被子類重寫的方法。

 
  1. public class Test{ 
  2.      class Base { 
  3.          Base() { 
  4.              this.info(); 
  5.          } 
  6.          public void info() { 
  7.              System.out.println("Base"); 
  8.          } 
  9.          public void getInfo() { 
  10.              info(); 
  11.          } 
  12.      } 
  13.       
  14.      public class Child extends Base{ 
  15.          @Override 
  16.          public void info() { 
  17.              System.out.println("Child"); 
  18.          } 
  19.      } 
  20.       
  21.      public static void main(String[] args) { 
  22.          Test test = new Test(); 
  23.          Base base = test.new Child(); 
  24.          base.info(); 
  25.          base.getInfo(); 
  26.      } 
  27.  } 

運行結果:

2)上述是屬于多態中方法的體現,但是方法有多態,實例變量無多態。

解釋下“方法有多態,變量無多態”這句話:意思是,不管怎樣,父類表面上只是調用屬于自己的被子類重寫的方法。而變量不一樣,假設父類和子類都有同一個變量名的實例變量,向上轉型后,通過父類訪問的實例變量得到的值是自身的而非子類的。向下轉型后,通過子類訪問的實例變量得到的值是自身的而非父類的。

很多書上或教學視頻上都講,創建一個子類對象的時候,Java 會順著繼承結構往上一直找到 Object,然后從 Object 開始往下依次執行構造函數。先執行父類的構造函數,然后在其子類中會創建一個成員變量指向他的父類。其實這個說法是錯誤的,系統并不會真正的去創建父類對象,只是在子類對象中不僅保存了本身的實例變量,還有它父類的全部實例變量。

  1. public class Test{ 
  2.      class Base {    //父類 
  3.          int i = 2
  4.      } 
  5.       
  6.      public class Child extends Base{    //子類 
  7.          int i  = 20
  8.      } 
  9.       
  10.      public static void main(String[] args) { 
  11.          Test test = new Test(); 
  12.          Child child = test.new Child(); 
  13.          Base base = child; 
  14.          System.out.println(" Base.i : " + base.i); 
  15.          System.out.println("Child.i : " + child.i); 
  16.      } 
  17.  } 

運行結果: 

5.final修飾符

final變來那個在編譯時就被確定下來了,相當于一個直接量。

1)final修飾的實例變量賦值時機:

定義final實例變量時 指定初始值 

在非靜態初始化模塊中為final實例變量指定的初始值

在構造器中為final實例變量指定初始值   

2)final修飾的類變量賦值時機: 

定義final類變量時指定初始值

在靜態初始化模塊中為final實例變量指定的初始值

原文鏈接:http://www.cnblogs.com/xiaoxuetu/archive/2013/03/27/2985616.html

【編輯推薦】

責任編輯:彭凡 來源: 博客園
相關推薦

2009-06-16 11:11:07

Java內存管理Java內存泄漏

2022-02-28 10:25:17

Python參數傳遞拷貝

2015-06-25 09:47:20

iOS內存管理

2011-07-07 09:54:01

Cocoa Core Foundation

2020-09-25 07:55:51

內存Java對象

2013-10-12 13:01:51

Linux運維內存管理

2024-03-11 08:22:40

Java內存泄漏

2010-08-19 09:24:41

iPhone

2021-04-25 06:12:19

Java內存布局JVM

2011-08-15 16:28:06

Cocoa內存管理

2018-07-04 14:43:55

對象模型內存結構內存模型

2023-10-16 23:57:35

Redis內存

2015-11-16 11:22:05

Java對象內存分配

2025-06-03 04:00:05

glibc堆內存Linux

2023-07-11 08:43:43

volatileJava內存

2011-12-20 10:43:21

Java

2018-07-23 09:26:08

iOS內存優化

2013-10-11 17:32:18

Linux運維內存管理

2010-09-25 09:24:54

Java內存管理

2009-09-02 09:23:26

.NET內存管理機制
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 蜜桃毛片 | 欧美成人a∨高清免费观看 老司机午夜性大片 | 亚洲精品第一 | 欧美精品久久久久 | 亚洲欧美精品 | 水蜜桃久久夜色精品一区 | 精品国产乱码久久久久久丨区2区 | 亚洲精品一区二区三区中文字幕 | 99精品在线免费观看 | 国产精品久久久久久久久久久久久久 | 中文字幕影院 | 日韩精品一区二区三区在线播放 | 国产欧美日韩 | 99热精品在线观看 | www.成人在线视频 | 亚洲精品视频网站在线观看 | 欧美日韩精品一区二区 | 成人激情视频在线播放 | 成人精品视频免费 | 99re视频在线免费观看 | 国产高清视频 | 中文字幕成人 | 国产精品一区一区 | 久久人| 国产综合一区二区 | 亚洲视频在线观看一区二区三区 | 久草视频在线播放 | 在线视频一区二区三区 | 亚洲中午字幕 | 狠狠干av | 日韩精品一区二区三区在线观看 | 黄色毛片视频 | 国产91丝袜在线播放 | 国产盗摄视频 | 久久国产一区 | 草草视频在线观看 | 一区二区久久 | 综合久久色 | 欧美又大粗又爽又黄大片视频 | 国产激情三区 | 另类二区|