[Java學習] 對Java的面對物件程式設計中物件和引用以及內部類的理解
阿新 • • 發佈:2019-01-25
最近利用下班的時候看了看的think in java感覺再看 和第一次看大不一樣
接下來說一下java中物件和引用的關係,以及內部類的概念。
1、java中一切都是物件
在java中是什麼來操作者物件呢?答案是引用,這就好比C或者C++中的指標。
如果用擁有一個引用,那麼此時你必須讓其和一個物件關聯在一起,否則這個引用並不會像你想象的那樣任由你的控制,例如你建立了一個String的引用:
- String s ;
- http://www.ynmxzx.com/sjxc/20160621/3729.html
而此時並未與任何物件關聯,如果此時你去做一些操作,如呼叫String的一些方法,肯定是會出現問題,(一些基本型別除外,因為你在定義的時候,它們就會賦予初始值的),所以在使用錢必須和物件進行關聯:
- http://www.ynmxzx.com/sjxc/20160621/3730.html
- String s = new String();
或者
- String s = “my name is ajun”;
像這樣就可以了。
2、怎麼和物件進行關聯
在java中通常會通過new來建立一個物件,來和引用進行關聯,如:
- http://www.ynmxzx.com/sjxc/20160621/3731.html
- String s = new String("my name is ajun");
這樣不僅建立了一個物件和引用s進行關聯,同事也進行初始化,同時我們也可以建立屬於自己的物件型別。
3、儲存位置
基本型別變數並不適應於new進行建立,因為其所佔的記憶體較小。
(2)堆:用於儲存java物件,當程式執行new的時候,堆就會分配一個空間給這個物件,記住堆進行記憶體的分配和釋放是比堆疊進行儲存和釋放記憶體消耗更多的時間,這就是基本型別變數要存在堆疊中了,因為基本型別變數是用的最頻繁的,頻繁的儲存和釋放記憶體,在消耗更多的時候,效能可想而知的。
4、內部類
(1)、內部類基礎知識:
一般定義在java類內部的類成為內部類
內部類可以分為:定義在方法體外部的類、定義方法內部的類、靜態內部類(只能定義在方法外部),匿名內部類
說明:
定義在方法外面的類:
類的成員變數(靜態、非靜態)可以訪問,為了保證能夠正確的引用的類的成員變數,所以必須先例項化外部類的物件,才可以例項化內部類的物件
訪問許可權可以任何,可以把它看成類的成員變數,這樣理解就好多來了。
定義在方法體內的類;
類的成員變數(靜態、非靜態)可以訪問,為了保證能夠正確的引用的類的成員變數,所以必須先例項化外部類的物件,才可以例項化內部類的物件
訪問許可權不可以有,把他看成方法的區域性變數就可以了。
靜態內部類:
只能訪問類的靜態成員變數
訪問許可權任何
匿名內部類:
類的成員變數(靜態、非靜態)可以訪問,為了保證能夠正確的引用的類的成員變數,所以必須先例項化外部類的物件,才可以例項化內部類的物件
訪問許可權不可以有
(2)、內部類的作用
內部類可以很好的隱藏類,一般類不允許有private protect default訪問許可權。
內部類可以實現多重繼承,彌補了java不能多繼承的特點
(3)、例子
- package com.ajun.test.innerclass.example;
- http://www.ynmxzx.com/sjxc/20160621/3732.html
- /**
- * 水果內容
- * @author Administrator
- *
- */
- public interface Contents {
- String value();
- }
- package com.ajun.test.innerclass.example;
- /**
- * 水果目的地
- * @author Administrator
- *
- */
- public interface Destination {
- http://www.ynmxzx.com/sjxc/20160621/3733.html
- //目的地
- 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;
- }
- }
- http://www.ynmxzx.com/zxzx/ybzx/20160621/3734.html
- //方法外部
- 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;
- }
- };
- }
- http://www.ynmxzx.com/qyd/20160621/3735.html
- 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);
- }
- }
- http://www.ynmxzx.com/qyd/20160621/3736.html
- 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());
- }
- }
- http://www.ynmxzx.com/qyd/20160621/3737.html
其中Content和Gdestination得到了很好的隱藏,外面呼叫的時候,根本就不知道呼叫的是具體哪個類,使這個類擁有多繼承的特性。
輸出;
- http://www.ynmxzx.com/qyd/20160621/3738.html
- apple is ruit!!
- Beijing
- Shanghai
- Tianjinwww.ynmxzx.com