久久99久久人婷婷精品综合_超碰aⅴ人人做人人爽欧美_亚洲电影第三页_日韩欧美一中文字暮专区_波多野结衣的一区二区三区_婷婷在线播放_人人视频精品_国产精品日韩精品欧美精品_亚洲免费黄色_欧美性猛交xxxxxxxx

java中怎么控制對象和內存

這篇文章將為大家詳細講解有關java中怎么控制對象和內存,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

成都創新互聯專注于企業成都全網營銷、網站重做改版、新樂網站定制設計、自適應品牌網站建設、html5電子商務商城網站建設、集團公司官網建設、外貿網站建設、高端網站制作、響應式網頁設計等建站業務,價格優惠性價比高,為新樂等各大城市提供網站開發制作服務。

一、對象與內存控制的知識點

1.java變量的初始化過程,包括局部變量,成員變量(實例變量和類變量)。
 2.繼承關系中,當使用的對象引用變量編譯時類型和運行時類型不同時,訪問該對象的屬性和方法是有區別的。
 3.final修飾符特性。

二、java變量的劃分與初始化過程

     java程序的變量大體可以分為成員變量和局部變量,成員變量可以分為實例變量(非靜態變量)和類變量(靜態變量),一般我們遇到的局部變量會在下列幾種情況中出現:
     (1)形參:在方法簽名中定義的局部變量,由調用方為其賦值,隨著方法結束消亡。
     (2)方法內的局部變量:在方法內定義的局部變量必須在方法內顯示的初始化(賦初始值),隨著變量初始化完成開始,到方法結束而消亡。
     (3)代碼塊內的局部變量:在代碼塊內定義的局部變量必須在代碼塊內顯示的初始化(賦初始值),隨著初始化完成開始生效,隨著代碼塊的結束而消亡。

package com.zlc.array;

public class TestField {
	{
		String b ;
		//如果不初始化,編譯器就會報The local variable b may not have been initialized
		System.out.println(b);
	}
	public static void main(String[] args) {
		int a ;
		//如果不初始化,編譯器就會報The local variable a may not have been initialized
		System.out.println(a);
	}
}

    使用static修飾的成員變量是類變量,屬于類本身,沒有用static修飾的成員變量是實例變量,屬于該類的實例,在同一個JVM里面,每個類只能對應一個Class對象,但每個類可以創建多個java對象。(也就是說一個類變量只需一塊內存空間,而該類每創建一次實例,就需要為實例變量分配一塊空間)
   
     實例變量的初始化過程:從語法角度來說,程序可以在三個地方對實例變量執行初始化:
   (1)定義實例變量時指定初始值。
   (2)非靜態塊中對實例變量指定初始值。
   (3)構造器中對實例變量指定初始值。
    其中(1)和(2)這兩種方式初始化時間都比(3)在構造器中要早,(1)和(2)兩種初始化順序是按照他們在源碼中的排列順序決定的。
   

package com.zlc.array;

public class TestField {
	public TestField(int age){
		System.out.println("構造函數中初始化 this.age = "+this.age);
		this.age = age;
	}
	{
		System.out.println("非靜態塊中初始化");
		age = 22;
	}
	//定義的時候初始化
	int age = 15;
	public static void main(String[] args) {
		TestField field = new TestField(24);
		System.out.println("最終 age = "+field.age);
	}
}

    運行結果為:非靜態塊中初始化
                     構造函數中初始化 this.age = 15
                     最終 age = 24
    如果會使用javap的話,可以通過javap -c XXXX(class文件)看下改java類是如何編譯的。
    定義實例變量時指定初始值,初始化塊中為實例變量指定初始值語句地位是平等的,當經過編譯器編譯處理之后,他們都被提到構造器中,上面所說的 int age = 15;會劃分下面兩個步驟執行:
    1)int age;創建java對象時系統根據該語句為該對象分配內存。
    2)age = 15;這條語句會被提取到java類的構造器中執行。
   
    類變量的初始化過程
:從語法角度來說,程序可以從兩個地方對類變量進行初始化賦值。
   (1)定義類變量時指定初始值。
   (2)靜態塊中對類變量指定初始值。
    兩種執行順序和他們在源碼中的排列順序相同,我們舉個小變態的例子:
 

package com.zlc.array;

 class TestStatic {
	//類成員 DEMO TestStatic實例
	final static TestStatic DEMO = new TestStatic(15);
	//類成員 age
	static int age = 20;
	//實例變量 curAge
	int curAge;
	
	public TestStatic(int years) {
		// TODO Auto-generated constructor stub
		curAge = age - years;
	}
}
 public class Test{
	public static void main(String[] args) {
		System.out.println(TestStatic.DEMO.curAge);
		TestStatic staticDemo = new TestStatic(15);
		System.out.println(staticDemo.curAge);
	}
}

    輸出結果有兩行打印,一個是打印TestStatic類屬性DEMO的實例變量,第二個通過java對象staticDemo輸出TestStatic的實例屬性,根據我們上面分析的實例變量和類變量的初始化流程可以進行推斷:
    1)初始化第一階段,加載類的時候為類變量DEMO、age分配內存空間,此時DEMO和age的默認值分別是null和0。
 

   2)初始化第二階段,程序按順序依次給DEMO、age賦初始值,TestStatic(15)需要調用TestStatic的構造器,此時age = 0 所以打印結果為 -15,而當staticDemo被初始化的時候,age已經被賦值等于20了,所以輸出結果為5。

三、在繼承關系中繼承成員變量和繼承成員方法的區別。

    當創建任何java對象時,程序總會先調用父類的非靜態塊、父類構造器,最后才調用本類的非靜態塊和構造器。通過子類的構造器調用父類的構造器一般分為兩種情況,一個是隱式調用,一個通過super顯示調用父類的構造器。
    子類的方法可以調用父類的實例變量,這是因為子類繼承了父類就會獲取父類的成員變量和方法,但父類的方法不能訪問子類的實例變量,因為父類不知道它將被哪個類繼承,它的子類將會增加什么樣的成員變量,當然在一些極端的例子里面還是可以實現父類調用子類變量的,比如:子類重寫了父類的方法,一般都會打印出默認值,因為這個時候子類的實例變量還沒有初始化。
 

package com.zlc.array;
class Father{
	int age = 50;
	public Father() {
		// TODO Auto-generated constructor stub
                System.out.println(this.getClass());
                //this.sonMethod();無法調用
		info();
	}
	public void info(){
		System.out.println(age);
	}
}
public class Son extends Father{
	int age = 24;
	public Son(int age) {
		// TODO Auto-generated constructor stub
		this.age = age;
	}
	@Override
	public void info() {
		// TODO Auto-generated method stub
		System.err.println(age);
	}
	public static void main(String[] args) {
		new Son(28);
	}
        //子類特有的方法
        public void sonMethod(){
                 System.out.println("Son method");
        }
}

    按照我們正常推斷,通過子類隱式的調用父類的構造器,而在父類的構造器中調用了info()方法(注意:我這里沒有說調用父類的),按道理來說是輸出了父類的age實例變量,打印結果預計是50,但實際輸出的結果為0,分析原因:
   1)java對象的內存分配不是在構造器中完成的,構造器只是完成了初始化賦值的過程,也就是在調用父類的構造器之前,jvm已經給這個Son對象分類好了內存空間,這個空間存放了兩個age屬性,一個是子類的age,一個是父類的age。
   2)在調用new Son(28)的時候,當前的this對象代表著是子類Son的對象,我們可以通過把對象.getClass()打印出來就會得到class com.zlc.array.Son的結果,但是當前初始化過程又是在父類的構造器中進行的,通過this.sonMethod()又無法被調用,這是因為this的編譯類型是Father的緣故。

   3)在變量的編譯時類型和運行時類型不同時,通過該變量訪問它的引用對象的實例變量時,該實例變量的值由聲明該變量的類型決定,但通過該變量調用它引用的對象的實例方法時,該方法的行為由它實際引用的對象決定,所以這里調用的是子類的info方法,所以打印的是子類的age,由于age還沒來得急初始化所以打印默認值0。
    通俗的來說也就是,當聲明的類型和真正new的類型不一致的時候,使用的屬性是父類的,調用的方法是子類的。
    通過javap -c我們更能直接的體會為什么繼承屬性和方法會有很大的區別,如果我們把上面例子里面,子類Son的info重寫方法去掉,這個時候調用的會是父類的info方法,是因為在進行編譯的時候會把父類的info方法編譯轉移到子類里面去,而聲名的成員變量會留在父類中不進行轉移,這樣子類和父類擁有了同名的實例變量,而如果子類重寫了父類的同名方法,則子類的方法會完全覆蓋掉父類的方法(至于為什么java要這么設計,個人也不太清楚)。同名變量能同時存在不覆蓋,同名方法子類會徹底覆蓋父類同名方法。
    總的來說對于一個引用變量而言,當通過該變量訪問它所引用的對象的實例變量時,該實例變量的值取決于聲明該變量時類型,當通過該變量訪問它所引用的對象的方法時,該方法行為取決于它所實際引用的對象的類型。
最后拿個小case復習下:

package com.zlc.array;
class Animal{
	int age ;
	public Animal(){
		
	}
	public Animal(int age) {
		// TODO Auto-generated constructor stub
		this.age = age;
	}
	void run(){
		System.out.println("animal run "+age);
	}
}
class Dog extends Animal{
	int age;
	String name;
	public Dog(int age,String name) {
		// TODO Auto-generated constructor stub
		this.age = age;
		this.name = name;
	}
	@Override
	void run(){
		System.out.println("dog run "+age);
	}
}
public class TestExtends {
	public static void main(String[] args) {
		Animal animal = new Animal(5);
		System.out.println(animal.age);
		animal.run();
		
		Dog dog = new Dog(1, "xiaobai");
		System.out.println(dog.age);
		dog.run();
		
		Animal animal2 = new Dog(11, "wangcai");
		System.out.println(animal2.age);
		animal2.run();
		
		Animal animal3;
		animal3 = dog;
		System.out.println(animal3.age);
		animal3.run();
	}
}

     想要調用父類的方法:可以通過super來調用,但super關鍵字沒有引用任何對象,它不能當做真正的引用變量來使用,有興趣的朋友可以自己研究下。
     上面介紹的都是實例變量和方法,類變量和類方法要簡單多了,直接使用類名.方法就方便了很多,也不會遇到那么多麻煩。

四、final修飾符的使用(特別是宏替換)

   final可以修飾變量,被final修飾的變量被賦初始值之后,不能對他重新賦值。
   final可以修飾方法,被final修飾的方法不能被重寫。
   final可以修飾類,被final修飾的類不能派生子類。

 

被final修飾的變量必須顯示的指定初始值:
對于是final修飾的是實例變量,則只能在下列三個指定位置賦初始值。
    (1)定義final實例變量時指定初始值。
    (2)在非靜態塊中為final實例變量指定初始值。
    (3)在構造器中為final實例變量指定初始值。
     最終都會被提到構造器中進行初始化。
對于用final指定的類變量:只能在指定的兩個地方進行賦初始值。
    (1)定義final類變量的時候指定初始值。
    (2)在靜態塊中為final類變量指定初始值。
     同樣經過編譯器處理,不同于實例變量的是,類變量都是提到靜態塊中進行賦初始值,而實例變量是提到構造器中完成。
    被final修飾的類變量還有一種特性,就是“宏替換”,當被修飾的類變量滿足在定義該變量的時候就指定初始值,而且這個初始值在編譯的時候就能確定下來(比如:18、"aaaa"、16.78等一些直接量),那么該final修飾的類變量不在是一個變量,系統就會當成“宏變量”處理(就是我們常說的常量),如果在編譯的時候就能確定初始值,則就不會被提到靜態塊中進行初始化了,直接在類定義中直接使該初始值代替掉final變量。我們還是舉那個年齡減去year的例子:

package com.zlc.array;

 class TestStatic {
	//類成員 DEMO TestStatic實例
	final static TestStatic DEMO = new TestStatic(15);
	//類成員 age
	final static int age = 20;
	//實例變量 curAge
	int curAge;
	
	public TestStatic(int years) {
		// TODO Auto-generated constructor stub
		curAge = age - years;
	}
}
 public class Test{
	public static void main(String[] args) {
		System.out.println(TestStatic.DEMO.curAge);
		TestStatic static1 = new TestStatic(15);
		System.out.println(static1.curAge);
	}
}

    這個時候的age 被final修飾了,所以在編譯的時候,父類中所有的age都變成了20,而不是一個變量,這樣輸出的結果就能達到我們的預期。
    特別是在對字符串進行比較的時候更能顯示出

package com.zlc.array;

public class TestString {
	static String static_name1 = "java";
	static String static_name2 = "me";
	static String statci_name3 = static_name1+static_name2;
	
	final static String final_static_name1 = "java";
	final static String final_static_name2 = "me";
	//加final 或者不加都行 前面兩個能被宏替換就行了
	final static String final_statci_name3 = final_static_name1+final_static_name2;
	
	public static void main(String[] args) {
		String name1 = "java";
		String name2 = "me";
		String name3 = name1+name2;
		//(1)
		System.out.println(name3 == "javame");
		//(2)
		System.out.println(TestString.statci_name3 == "javame");
		//(3)
		System.out.println(TestString.final_statci_name3 == "javame");
	}
}

    用final修飾方法和類沒有什么好說的,只是一個不能被子類重寫(和private一樣),一個不能派生子類。
    用final修飾局部變量的時候,Java要求被內部類訪問的局部變量都是用final修飾,這個是有原因的,對于普通局部變量而言,它的作用域就停留在該方法內,當方法結束時,該局部變量也就消失了,但內部類可能產生隱式的“閉包”,閉包使得局部變量脫離他所在的方法繼續存在。
     有時候在會在一個方法里面new 一個線程,然后調用該方法的局部變量,這個時候需要把改變量聲明為final修飾的。
 

關于java中怎么控制對象和內存就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

文章名稱:java中怎么控制對象和內存
文章源于:http://www.js-pz168.com/article14/gcjpde.html

成都網站建設公司_創新互聯,為您提供自適應網站企業網站制作面包屑導航建站公司服務器托管軟件開發

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

綿陽服務器托管
久久99久久人婷婷精品综合_超碰aⅴ人人做人人爽欧美_亚洲电影第三页_日韩欧美一中文字暮专区_波多野结衣的一区二区三区_婷婷在线播放_人人视频精品_国产精品日韩精品欧美精品_亚洲免费黄色_欧美性猛交xxxxxxxx
中文字幕av一区二区三区免费看| 亚洲欧美激情插 | 国产老女人精品毛片久久| av在线播放一区二区三区| 久久av一区二区| 欧美性感一类影片在线播放| 久久蜜桃av一区精品变态类天堂 | 久久久三级国产网站| 亚洲制服丝袜av| 国产成人免费视频网站 | 亚洲男人的天堂一区二区| 麻豆传媒一区二区三区| 91老师国产黑色丝袜在线| 日韩欧美亚洲在线| 日韩一区二区中文字幕| 亚洲乱码国产乱码精品精的特点| 精品一区二区成人精品| 国产在线播放一区二区| 欧美三级资源在线| 中文字幕一区二区三区蜜月| 久草在线在线精品观看| 国产综合动作在线观看| 欧美女孩性生活视频| 亚洲图片激情小说| 国产成人精品免费| 日韩欧美手机在线| 亚洲精品一区二区三区四区高清| 午夜久久久久久电影| 97se亚洲国产综合在线| 色94色欧美sute亚洲线路一久 | 91丨porny丨户外露出| 中国成人亚色综合网站| 国产欧美日韩激情| 精品中文字幕一区二区| 免费看成人片| 日韩欧美二区三区| 日韩成人一区二区三区在线观看| 91精品网站| 欧美日韩你懂的| 一区二区三区在线观看欧美| 成人深夜福利app| 一本色道久久综合精品竹菊| 中文字幕精品一区二区精品绿巨人 | 不卡一区在线观看| 色综合天天视频在线观看| 国产欧美一区二区三区沐欲 | 99国产精品视频免费观看| 色综合天天综合网国产成人综合天| 久久精品欧美一区二区三区麻豆 | 97久久精品人人爽人人爽蜜臀| 在线亚洲美日韩| 国产精品久久久久影视| 大尺度一区二区| 一本一道久久a久久综合精品 | 91国产丝袜在线放| 欧美久久一区二区| 天堂蜜桃91精品| 国内一区在线| 久久亚洲二区三区| 国产制服丝袜一区| 无码免费一区二区三区免费播放 | 3d动漫精品啪啪一区二区竹菊| 亚洲国产精品久久一线不卡| 成人毛片网站| 欧美成人一区二区三区片免费| 麻豆精品蜜桃视频网站| 色综合久久久久久久久五月| 国产精品色眯眯| 99在线精品视频| 在线播放91灌醉迷j高跟美女| 午夜精品久久一牛影视| 精品午夜一区二区三区| 久久精品视频一区二区| 成人免费视频caoporn| 欧美三级电影网站| 日韩电影免费一区| 神马影院我不卡| 亚洲精品久久久蜜桃| 国产日韩二区| 国产婷婷色一区二区三区四区| 国产成人福利片| 在线成人av网站| 免费在线观看视频一区| 亚洲欧洲精品一区二区三区波多野1战4| 中文字幕在线观看一区| 成人久久18免费网站漫画| 久久综合中文字幕| 成人av在线资源网站| 日韩午夜电影在线观看| 国产伦精品一区二区三区免费迷| 欧洲精品一区二区三区在线观看| 亚洲电影你懂得| 日韩久久不卡| 亚洲韩国精品一区| 神马欧美一区二区| 亚洲国产精品一区二区尤物区| 欧美在线视频一区二区三区| 亚洲欧美日本在线| 精品国产一区二区三区四区vr| 国产精品萝li| 国产精品久久久久久久天堂第1集 国产精品久久久久久久免费大片 国产精品久久久久久久久婷婷 | 97精品国产露脸对白| 精品国产一区二区精华| 成人av资源网站| 精品国产91乱码一区二区三区| 成人黄色小视频在线观看| 欧美zozozo| 91在线精品一区二区| 久久色在线观看| 51国偷自产一区二区三区的来源| 久久免费美女视频| 操人视频欧美| 中文天堂在线一区| 国产专区一区二区三区| **性色生活片久久毛片| 欧美lavv| 亚洲在线观看免费| 中国成人在线视频| 久久国产麻豆精品| 69成人精品免费视频| 国产99久久久久久免费看农村| 日韩欧美电影在线| 99r精品视频| 中国色在线观看另类| 精品视频免费观看| 一区二区三区精品视频| 亚洲一区二区三区欧美| 蜜桃在线一区二区三区| 欧美区在线观看| 成人爽a毛片一区二区免费| 久久久电影一区二区三区| 国产精品一区二区三区四区五区 | 国产精品一区二区免费| 亚洲欧美日韩一区二区三区在线观看| 欧美一区二区三区四区夜夜大片| 亚欧色一区w666天堂| 欧美在线观看一二区| 国产激情视频一区二区三区欧美 | 色呦呦国产精品| 韩国视频一区二区| 精品久久人人做人人爱| 国产成人精品免费视频大全最热| 亚洲免费观看高清| 一区二区三区欧美在线| 国产一区不卡精品| 久久综合给合久久狠狠狠97色69| 国产精品一区二区三区精品| 亚洲制服丝袜av| 欧美日韩小视频| 99久久久久免费精品国产 | av一区二区三区四区电影| 综合久久久久久| 亚洲精品欧美精品| 国产乱码精品1区2区3区| 久久久久国色av免费看影院| 免费久久一级欧美特大黄| 日本中文字幕一区二区有限公司| 91精品视频网| 国产精品美女黄网| 三级不卡在线观看| 日韩欧美在线1卡| 精品国产乱码久久久久久丨区2区| 亚洲国产日日夜夜| 4438亚洲最大| 精品国产一区二区三区日日嗨 | 国产精品免费av| 亚洲人成网站在线观看播放| 国产福利一区二区三区视频 | 日韩一区二区三区视频在线观看| 99re国产视频| 午夜久久久久久久久久一区二区| 欧美人妖巨大在线| 国产精品久久久对白| 婷婷久久综合九色综合绿巨人| 日韩一二三区视频| 欧美 日韩 国产在线| 九色综合国产一区二区三区| 久久久久久久久久久久久女国产乱 | 久久综合综合久久综合| 国产日产欧产精品推荐色| 亚洲精品一卡二卡三卡四卡| 国产成人鲁色资源国产91色综| 日韩一区欧美小说| 欧美日韩国产天堂| 国产原创精品| 狠狠色丁香久久婷婷综合_中| 国产人成亚洲第一网站在线播放 | 韩国成人av| 精品制服美女久久| 国产精品久久久久永久免费观看| 在线观看网站黄不卡| 国产v亚洲v天堂无码| 久久激情综合网| 国产精品国产三级国产aⅴ入口| 欧美私人免费视频| 国外成人在线视频网站| 国产在线日韩欧美| 一区二区三区四区在线播放| 这里只有精品免费| 天堂一区二区三区|