最近利用下班的時候看了看的think in java感覺再看 和第一次看大不一樣
接下來說一下java中對象和引用的關係,以及內部類的概念。
1、java中一切都是物件
在java中是什麼來操作者物件呢?答案是引用,就好比C或C++中的指標。
如果用擁有一個引用,那麼此時你必須讓其和一個物件關聯在一起,否則這個引用並不會像你想像的那樣任由你的控制,例如你創建了一個String的引用:
String s ;
而此時並未與任何物件關聯,如果此時你去做一些操作,如調用String的一些方法,肯定是會出現問題,(一些基本類型除外,因為你在定義的時候,它們就會賦予初始值的),所以在使用錢必須和物件進行關聯:
String s = new String();
或
String s = “my name is ajun”;
像這樣就可以了。
2、怎麼和對象進行關聯
在java中通常會透過new來創建一個對象,來和引用進行關聯,如:
String s = new String("my name is ajun")
這樣不僅創建了一個對象和引用s進行關聯,同事也進行初始化,同時我們也可以創造屬於自己的物件類型。
3、儲存位置
(1)堆疊:一般儲存參考和基本型別變量,堆疊主要是透過堆疊指標上下移動來對記憶體進行分配和釋放。
基本類型變數並不適應於new進行創建,因為其所佔的記憶體較小。
(2)堆:用來儲存java對象,當程式執行new的時候,堆就會分配一個空間給這個對象,記住堆進行記憶體的分配和釋放是比堆疊進行儲存和釋放記憶體消耗更多的時間,這就是基本型別變數要存在堆疊中了,因為基本型別變數是用的最頻繁的,頻繁的儲存和釋放內存,在消耗更多的時候,效能可想而知的。
4、內部類別
(1)、內部類別基礎知識:
一般定義在java類別內部的類別成為內部類別
內部類別可以分為:定義在方法體外部的類別、定義方法內部的類別、靜態內部類別(只能定義在方法外部),匿名內部類別
說明:
定義在方法外面的類別:
類別的成員變數(靜態、非靜態)可以訪問,為了保證能夠正確的引用的類別的成員變量,所以必須先實例化外部類別的對象,才可以實例化內部類別的對象
存取權限可以任何,可以把它看成類別的成員變量,這樣理解就好多來了。
定義在方法體內的類;
類的成員變量(靜態、非靜態)可以訪問,為了保證能夠正確的引用的類的成員變量,所以必須先實例化外部類的對象,才可以實例化內部類的物件
存取權限不可以有,把他看成方法的局部變數就可以了。
靜態內部類別:
只能訪問類別的靜態成員變數
訪問權限任何
匿名內部類別:
類別的成員變數(靜態、非靜態)可以訪問,為了保證能夠正確的引用的類別的成員變量,所以必須先實例化外部類別的對象,才可以實例化內部類別的物件
存取權限不可以有
(2)、內部類別的作用
內部類別可以很好的隱藏類,一般類別不允許有private protect default存取權限。
內部類別可以實現多重繼承,彌補了java不能多繼承的特點
(3)、例子
package com.ajun.test.innerclass.example; /** * 水果内容 * @author Administrator * */ public interface Contents { String value(); } package com.ajun.test.innerclass.example; /** * 水果目的地 * @author Administrator * */ public interface Destination { //目的地 String readLabel(); } package com.ajun.test.innerclass.example; public class Goods { private String des="is ruit!!"; //方法外部 private class Content implements Contents{ private String name = "apple "+des; @Override public String value() { return name; } } //方法外部 private class GDestination implements Destination{ private String label ; private GDestination(String label){ this.label= label; } @Override public String readLabel() { return label; } } //匿名内部类 public Destination getdestination(final String label){ return new Destination(){ @Override public String readLabel() { return label; } }; } public Destination dest(String s){ return new GDestination(s); } public Contents content(){ return new Content(); } public Destination dest2(String s){ class GDestination implements Destination{ private String label; private GDestination(String label){ this.label= label; } @Override public String readLabel() { return label; } } return new GDestination(s); } } package com.ajun.test.innerclass.example; public class Test { public static void main(String [] a){ Goods gs = new Goods(); Contents c = gs.content(); Destination d = gs.dest("Beijing"); System.out.println(c.value()); System.out.println(d.readLabel()); Destination d1 = gs.getdestination("Shanghai"); System.out.println(d1.readLabel()); System.out.println(gs.dest2("Tianjin").readLabel()); } }
其中Content和Gdestination得到了很好的隱藏,外面調用的時候,根本就不知道調用的是具體哪個類,使這個類別擁有多繼承的特性。
apple is ruit!! Beijing Shanghai Tianjin
更多對Java的面對對象編程中對象和引用以及內部類的理解相關文章請關注PHP中文網!