對Java的面對對象編程中對象和引用以及內(nèi)部類的理解
最近利用下班的時候看了看的think in java感覺再看 和第一次看大不一樣
接下來說一下java中對象和引用的關(guān)系,以及內(nèi)部類的概念。
1、java中一切都是對象
在java中是什么來操作者對象呢?答案是引用,這就好比C或者C++中的指針。
如果用擁有一個引用,那么此時你必須讓其和一個對象關(guān)聯(lián)在一起,否則這個引用并不會像你想象的那樣任由你的控制,例如你創(chuàng)建了一個String的引用:
String s ;
而此時并未與任何對象關(guān)聯(lián),如果此時你去做一些操作,如調(diào)用String的一些方法,肯定是會出現(xiàn)問題,(一些基本類型除外,因為你在定義的時候,它們就會賦予初始值的),所以在使用錢必須和對象進行關(guān)聯(lián):
String s = new String();
或者
String s = “my name is ajun”;
像這樣就可以了。
2、怎么和對象進行關(guān)聯(lián)
在java中通常會通過new來創(chuàng)建一個對象,來和引用進行關(guān)聯(lián),如:
String s = new String("my name is ajun");
這樣不僅創(chuàng)建了一個對象和引用s進行關(guān)聯(lián),同事也進行初始化,同時我們也可以創(chuàng)建屬于自己的對象類型。
3、存儲位置
(1)堆棧:一般存儲引用和基本類型變量,堆棧主要是通過堆棧指針上下移動來對內(nèi)存進行分配和釋放。
基本類型變量并不適應(yīng)于new進行創(chuàng)建,因為其所占的內(nèi)存較小。
(2)堆:用于存儲java對象,當程序執(zhí)行new的時候,堆就會分配一個空間給這個對象,記住堆進行內(nèi)存的分配和釋放是比堆棧進行存儲和釋放內(nèi)存消耗更多的時間,這就是基本類型變量要存在堆棧中了,因為基本類型變量是用的最頻繁的,頻繁的存儲和釋放內(nèi)存,在消耗更多的時候,性能可想而知的。
4、內(nèi)部類
(1)、內(nèi)部類基礎(chǔ)知識:
一般定義在java類內(nèi)部的類成為內(nèi)部類
內(nèi)部類可以分為:定義在方法體外部的類、定義方法內(nèi)部的類、靜態(tài)內(nèi)部類(只能定義在方法外部),匿名內(nèi)部類
說明:
定義在方法外面的類:
類的成員變量(靜態(tài)、非靜態(tài))可以訪問,為了保證能夠正確的引用的類的成員變量,所以必須先實例化外部類的對象,才可以實例化內(nèi)部類的對象
訪問權(quán)限可以任何,可以把它看成類的成員變量,這樣理解就好多來了。
定義在方法體內(nèi)的類;
類的成員變量(靜態(tài)、非靜態(tài))可以訪問,為了保證能夠正確的引用的類的成員變量,所以必須先實例化外部類的對象,才可以實例化內(nèi)部類的對象
訪問權(quán)限不可以有,把他看成方法的局部變量就可以了。
靜態(tài)內(nèi)部類:
只能訪問類的靜態(tài)成員變量
訪問權(quán)限任何
匿名內(nèi)部類:
類的成員變量(靜態(tài)、非靜態(tài))可以訪問,為了保證能夠正確的引用的類的成員變量,所以必須先實例化外部類的對象,才可以實例化內(nèi)部類的對象
訪問權(quán)限不可以有
(2)、內(nèi)部類的作用
內(nèi)部類可以很好的隱藏類,一般類不允許有private protect default訪問權(quán)限。
內(nèi)部類可以實現(xiàn)多重繼承,彌補了java不能多繼承的特點
(3)、例子
package com.ajun.test.innerclass.example;
/**
* 水果內(nèi)容
* @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;
}
}
//匿名內(nèi)部類
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得到了很好的隱藏,外面調(diào)用的時候,根本就不知道調(diào)用的是具體哪個類,使這個類擁有多繼承的特性。
輸出;
apple is ruit!! Beijing Shanghai Tianjin
相關(guān)文章
解讀SpringBoot接收List<Bean>參數(shù)問題(POST請求方式)
這篇文章主要介紹了解讀SpringBoot接收List<Bean>參數(shù)問題(POST請求方式),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-09-09
使用Spring Initializr方式如何快速構(gòu)建Spring Boot項目
Spring lnitializr是一個Web應(yīng)用,它提供了一個基本的項目結(jié)構(gòu),能夠幫助我們快速構(gòu)建一個基礎(chǔ)的Spring Boot項目,本文分步驟講解如何使用Spring Initializr方式構(gòu)建Spring Boot項目,感興趣的朋友跟隨小編一起看看吧2023-08-08
談?wù)凧ava利用原始HttpURLConnection發(fā)送POST數(shù)據(jù)
這篇文章主要給大家介紹java利用原始httpUrlConnection發(fā)送post數(shù)據(jù),設(shè)計到httpUrlConnection類的相關(guān)知識,感興趣的朋友跟著小編一起學習吧2015-10-10

