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

Java對(duì)象與內(nèi)存管理

開(kāi)發(fā) 后端
今天我們將談到Java對(duì)象與內(nèi)存管理,包括相關(guān)實(shí)例代碼以及錯(cuò)誤編譯的代碼,供大家參考。

1.實(shí)例變量和類(lèi)變量的內(nèi)存分配

類(lèi)變量 :使用static修飾的成員變量是類(lèi)變量,屬于該類(lèi)本身

實(shí)例變量:沒(méi)有使用static修飾的成員變量是實(shí)例變量,屬于該類(lèi)的實(shí)例

由于同一個(gè)JVM內(nèi)每個(gè)累只對(duì)應(yīng)一個(gè)Class對(duì)象,因此同一個(gè)JVM內(nèi)的一個(gè)類(lèi)的類(lèi)變量只需一塊內(nèi)存空間。

對(duì)于實(shí)例變量而言,該類(lèi)沒(méi)創(chuàng)建一次實(shí)例,就需要為實(shí)例變量分配一塊內(nèi)存空間,所以,程序中有幾個(gè)實(shí)例,實(shí)例變量就需要幾塊內(nèi)存空間。

2.類(lèi)變量的初始化時(shí)機(jī)總是出于實(shí)例變量的初始化之前

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

1)因?yàn)閮蓚€(gè)實(shí)例變量都是在創(chuàng)建變量的時(shí)候才開(kāi)始分配空間,此時(shí)num2還沒(méi)有分配,所以前向引用就會(huì)出現(xiàn)編譯錯(cuò)誤。

  1. int num = num2 + 3;    //非法前向引用,會(huì)報(bào)錯(cuò) 
  2. int num2 = 2 

2)因?yàn)閮蓚€(gè)類(lèi)變量在JVM加載類(lèi)的時(shí)候分配空間,此時(shí)num2還沒(méi)有分配,所以前向引用就出現(xiàn)變異錯(cuò)誤。

  1. static int num = num2 + 3;    //非法前向引用,會(huì)報(bào)錯(cuò) 
  2. tatic int num2 = 2 

3)因?yàn)轭?lèi)變量num2在JVM加載類(lèi)的時(shí)候空間已經(jīng)分配好,而num在創(chuàng)建實(shí)例的時(shí)候踩分配空間,此時(shí)num2已經(jīng)分配成功了,所以num前向引用成功。

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

由上面三段代碼塊就可以驗(yàn)證得:類(lèi)變量的初始化時(shí)機(jī)總是出于實(shí)例變量的初始化之前

3.Java對(duì)象的初始化方式及其執(zhí)行順序

Java對(duì)象的初始化方式有三種:1)構(gòu)造器  2)初始化塊  3)定義變量時(shí)指定初始化值

如果這三種初始化方式同時(shí)出現(xiàn),也要注意,他們也有一個(gè)執(zhí)行順序的規(guī)定:

1)靜態(tài)初始化塊只在類(lèi)第一次創(chuàng)建對(duì)象的時(shí)候運(yùn)行一次,后面就不會(huì)再運(yùn)行,而類(lèi)在每次創(chuàng)建對(duì)象時(shí),非靜態(tài)初始化塊總是會(huì)運(yùn)行一次。

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

運(yùn)行結(jié)果:

2)構(gòu)造器每次創(chuàng)建對(duì)象時(shí),構(gòu)造器必然有執(zhí)行的機(jī)會(huì),此時(shí),非靜態(tài)初始化塊必定也將獲得機(jī)會(huì)并且運(yùn)行在構(gòu)造器之前

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

運(yùn)行結(jié)果:

3)定義變量時(shí)指定的初始化值和初始化塊中指定的初始值的執(zhí)行順序與他們?cè)谠闯绦蛑械呐帕许樞蛳嗤?/p>

驗(yàn)證代碼一:

  1. public class Test{ 
  2.       
  3.      String i = "定義變量時(shí)指定的初始化值"
  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("創(chuàng)建第 " + i + " 個(gè)對(duì)象");  
  12.              System.out.println(new Test().i); 
  13.              System.out.println(); 
  14.          } 
  15.      } 
  16.  } 

運(yùn)行結(jié)果

驗(yàn)證代碼二 :

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

運(yùn)行結(jié)果:

4.關(guān)于父子實(shí)例的內(nèi)存控制

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

1)當(dāng)子類(lèi)重寫(xiě)父類(lèi)方法后,父類(lèi)表面上只是調(diào)用屬于自己的被子類(lèi)重寫(xiě)的方法。

 
  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.  } 

運(yùn)行結(jié)果:

2)上述是屬于多態(tài)中方法的體現(xiàn),但是方法有多態(tài),實(shí)例變量無(wú)多態(tài)。

解釋下“方法有多態(tài),變量無(wú)多態(tài)”這句話:意思是,不管怎樣,父類(lèi)表面上只是調(diào)用屬于自己的被子類(lèi)重寫(xiě)的方法。而變量不一樣,假設(shè)父類(lèi)和子類(lèi)都有同一個(gè)變量名的實(shí)例變量,向上轉(zhuǎn)型后,通過(guò)父類(lèi)訪問(wèn)的實(shí)例變量得到的值是自身的而非子類(lèi)的。向下轉(zhuǎn)型后,通過(guò)子類(lèi)訪問(wèn)的實(shí)例變量得到的值是自身的而非父類(lèi)的。

很多書(shū)上或教學(xué)視頻上都講,創(chuàng)建一個(gè)子類(lèi)對(duì)象的時(shí)候,Java 會(huì)順著繼承結(jié)構(gòu)往上一直找到 Object,然后從 Object 開(kāi)始往下依次執(zhí)行構(gòu)造函數(shù)。先執(zhí)行父類(lèi)的構(gòu)造函數(shù),然后在其子類(lèi)中會(huì)創(chuàng)建一個(gè)成員變量指向他的父類(lèi)。其實(shí)這個(gè)說(shuō)法是錯(cuò)誤的,系統(tǒng)并不會(huì)真正的去創(chuàng)建父類(lèi)對(duì)象,只是在子類(lèi)對(duì)象中不僅保存了本身的實(shí)例變量,還有它父類(lèi)的全部實(shí)例變量。

  1. public class Test{ 
  2.      class Base {    //父類(lèi) 
  3.          int i = 2
  4.      } 
  5.       
  6.      public class Child extends Base{    //子類(lèi) 
  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.  } 

運(yùn)行結(jié)果: 

5.final修飾符

final變來(lái)那個(gè)在編譯時(shí)就被確定下來(lái)了,相當(dāng)于一個(gè)直接量。

1)final修飾的實(shí)例變量賦值時(shí)機(jī):

定義final實(shí)例變量時(shí) 指定初始值 

在非靜態(tài)初始化模塊中為final實(shí)例變量指定的初始值

在構(gòu)造器中為final實(shí)例變量指定初始值   

2)final修飾的類(lèi)變量賦值時(shí)機(jī): 

定義final類(lèi)變量時(shí)指定初始值

在靜態(tài)初始化模塊中為final實(shí)例變量指定的初始值

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

【編輯推薦】

責(zé)任編輯:彭凡 來(lái)源: 博客園
相關(guān)推薦

2009-06-16 11:11:07

Java內(nèi)存管理Java內(nèi)存泄漏

2022-02-28 10:25:17

Python參數(shù)傳遞拷貝

2015-06-25 09:47:20

iOS內(nèi)存管理

2020-09-25 07:55:51

內(nèi)存Java對(duì)象

2013-10-12 13:01:51

Linux運(yùn)維內(nèi)存管理

2011-07-07 09:54:01

Cocoa Core Foundation

2024-03-11 08:22:40

Java內(nèi)存泄漏

2010-08-19 09:24:41

iPhone

2011-08-15 16:28:06

Cocoa內(nèi)存管理

2021-04-25 06:12:19

Java內(nèi)存布局JVM

2018-07-04 14:43:55

對(duì)象模型內(nèi)存結(jié)構(gòu)內(nèi)存模型

2023-10-16 23:57:35

Redis內(nèi)存

2025-06-03 04:00:05

glibc堆內(nèi)存Linux

2023-07-11 08:43:43

volatileJava內(nèi)存

2015-11-16 11:22:05

Java對(duì)象內(nèi)存分配

2011-12-20 10:43:21

Java

2010-09-25 09:24:54

Java內(nèi)存管理

2018-07-23 09:26:08

iOS內(nèi)存優(yōu)化

2013-10-11 17:32:18

Linux運(yùn)維內(nèi)存管理

2009-09-02 09:23:26

.NET內(nèi)存管理機(jī)制
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 国产精品18hdxxxⅹ在线 | 天堂在线中文字幕 | 欧美精品久久久久 | 亚洲三区在线观看 | 黄色免费av | 亚洲国产精品91 | 亚洲综合国产 | 在线色网站 | 人人做人人澡人人爽欧美 | 国产美女精品视频免费观看 | 国产日韩一区二区 | 懂色tv| 81精品国产乱码久久久久久 | 日韩黄色av | 国产成人久久精品一区二区三区 | 国产精品成人av | 亚洲免费在线 | 精品免费国产一区二区三区四区介绍 | 区一区二在线观看 | 久久久久久国产精品 | 国产欧美在线视频 | 日本一道本视频 | 国产精品视频导航 | 久久精品久久久 | 国产99久久精品一区二区永久免费 | 激情伊人网 | avtt国产 | 黄色大片观看 | 99这里只有精品视频 | 天天综合网天天综合色 | 欧美性网站 | 国产乱码一二三区精品 | 中文字幕在线观看精品 | 99免费视频 | 91久操网| 欧美一区精品 | 一级黄色片免费在线观看 | 成人一区二区三区在线观看 | 浮生影院免费观看中文版 | 亚洲成人av | 黄色网址大全在线观看 |