java面向对象基础代码_JAVA基础知识点之Java面向对象
特點:1:將復雜的事情簡單化。
2:面向對象將以前的過程中的執行者,變成了指揮者。
3:面向對象這種思想是符合現在人們思考習慣的一種思想。
過程和對象在我們的程序中是如何體現的呢?
過程其實就是函數;
對象是將函數等一些內容進行了封裝。
匿名對象使用場景:
1:當對方法只進行一次調用的時候,可以使用匿名對象。
2:當對象對成員進行多次調用時,不能使用匿名對象。必須給對象起名字。
在類中定義其實都稱之為成員。成員有兩種:
1:成員變量:其實對應的就是事物的屬性。
2:成員函數:其實對應的就是事物的行為。
所以,其實定義類,就是在定義成員變量和成員函數。但是在定義前,必須先要對事物進行屬性和行為的分析,才可以用代碼來體現。
private?int?age;//私有的訪問權限最低,只有在本類中的訪問有效。
注意:私有僅僅是封裝的一種體現形式而已。
私有的成員:其他類不能直接創建對象訪問,所以只有通過本類對外提供具體的訪問方式來完成對私有的訪問,
可以通過對外提供函數的形式對其進行訪問。
好處:可以在函數中加入邏輯判斷等操作,對數據進行判斷等操作。
總結:開發時,記住,屬性是用于存儲數據的,直接被訪問,容易出現安全隱患,所以,類中的屬性通常被私有化,并對外提供公共的訪問方法。
這個方法一般有兩個,規范寫法:對于屬性?xxx,可以使用setXXX(),getXXX()對其進行操作。
類中怎么沒有定義主函數呢?
注意:主函數的存在,僅為該類是否需要獨立運行,如果不需要,主函數是不用定義的。
主函數的解釋:保證所在類的獨立運行,是程序的入口,被jvm調用。
成員變量和局部變量的區別:
1:成員變量直接定義在類中。
局部變量定義在方法中,參數上,語句中。
2:成員變量在這個類中有效。
局部變量只在自己所屬的大括號內有效,大括號結束,局部變量失去作用域。
3:成員變量存在于堆內存中,隨著對象的產生而存在,消失而消失。
局部變量存在于棧內存中,隨著所屬區域的運行而存在,結束而釋放。
構造函數:用于給對象進行初始化,是給與之對應的對象進行初始化,它具有針對性,函數中的一種。
特點:
1:該函數的名稱和所在類的名稱相同。
2:不需要定義返回值類型。
3:該函數沒有具體的返回值。
記住:所有對象創建時,都需要初始化才可以使用。
注意事項:一個類在定義時,如果沒有定義過構造函數,那么該類中會自動生成一個空參數的構造函數,
為了方便該類創建對象,完成初始化。如果在類中自定義了構造函數,那么默認的構造函數就沒有了。
一個類中,可以有多個構造函數,因為它們的函數名稱都相同,所以只能通過參數列表來區分。所以,
一個類中如果出現多個構造函數。它們的存在是以重載體現的。
構造函數和一般函數有什么區別呢?
1:兩個函數定義格式不同。
2:構造函數是在對象創建時,就被調用,用于初始化,而且初始化動作只執行一次。
一般函數,是對象創建后,需要調用才執行,可以被調用多次。
什么時候使用構造函數呢?
分析事物時,發現具體事物一出現,就具備了一些特征,那就將這些特征定義到構造函數內。
構造代碼塊和構造函數有什么區別?
構造代碼塊:是給所有的對象進行初始化,也就是說,所有的對象都會調用一個代碼塊。只要對象一建立。就會調用這個代碼塊。
構造函數:是給與之對應的對象進行初始化。它具有針對性。
Person?p?=?new?Person();
創建一個對象都在內存中做了什么事情?
1:先將硬盤上指定位置的Person.class文件加載進內存。
2:執行main方法時,在棧內存中開辟了main方法的空間(壓棧—進棧),然后在main方法的棧區分配了一個變量p。
3:在堆內存中開辟一個實體空間,分配了一個內存首地址值。new
4:在該實體空間中進行屬性的空間分配,并進行了默認初始化。
5:對空間中的屬性進行顯示初始化。
6:進行實體的構造代碼塊初始化。
7:調用該實體對應的構造函數,進行構造函數初始化。()
8:將首地址賦值給p?,p變量就引用了該實體。(指向了該對象)
封?裝(面向對象特征之一):是指隱藏對象的屬性和實現細節,僅對外提供公共訪問方式。
好處:將變化隔離;便于使用;提高重用性;安全性。
封裝原則:將不需要對外提供的內容都隱藏起來,把屬性都隱藏,提供公共方法對其訪問。
this:代表對象。就是所在函數所屬對象的引用。
this到底代表什么呢?哪個對象調用了this所在的函數,this就代表哪個對象,就是哪個對象的引用。
開發時,什么時候使用this呢?
在定義功能時,如果該功能內部使用到了調用該功能的對象,這時就用this來表示這個對象。
this?還可以用于構造函數間的調用。
調用格式:this(實際參數):
this對象后面跟上 . 調用的是成員屬性和成員方法(一般方法);
this對象后面跟上 ()?調用的是本類中的對應參數的構造函數。
注意:用this調用構造函數,必須定義在構造函數的第一行。
因為構造函數是用于初始化的,所以初始化動作一定要執行。否則編譯失敗。
static:?關鍵字,是一個修飾符,用于修飾成員(成員變量和成員函數)。
特點:
1:想要實現對象中的共性數據的對象共享。可以將這個數據進行靜態修飾。
2:被靜態修飾的成員,可以直接被類名所調用。也就是說,靜態的成員多了一種調用方式。類名.靜態方式。
3:靜態隨著類的加載而加載。而且優先于對象存在。
弊端:
1:有些數據是對象特有的數據,是不可以被靜態修飾的。因為那樣的話,特有數據會變成對象的共享數據。這樣對事物的描述就出了問題。所以,在定義靜態時,必須要明確,這個數據是否是被對象所共享的。
2:靜態方法只能訪問靜態成員,不可以訪問非靜態成員。
因為靜態方法加載時,優先于對象存在,所以沒有辦法訪問對象中的成員。
3:靜態方法中不能使用this,super關鍵字。
因為this代表對象,而靜態在時,有可能沒有對象,所以this無法使用。
4:主函數是靜態的。
什么時候定義靜態成員呢?或者說:定義成員時,到底需不需要被靜態修飾呢?
成員分兩種:
1:成員變量。(數據共享時靜態化)
該成員變量的數據是否是所有對象都一樣:
如果是,那么該變量需要被靜態修飾,因為是共享的數據。
如果不是,那么就說這是對象的特有數據,要存儲到對象中。
2:成員函數。(方法中沒有調用特有數據時就定義成靜態)
如果判斷成員函數是否需要被靜態修飾呢?
只要參考,該函數內是否訪問了對象中的特有數據:
如果有訪問特有數據,那方法不能被靜態修飾。
如果沒有訪問過特有數據,那么這個方法需要被靜態修飾。
成員變量和靜態變量的區別:
1:成員變量所屬于對象。所以也稱為實例變量。
靜態變量所屬于類。所以也稱為類變量。
2:成員變量存在于堆內存中。
靜態變量存在于方法區中。
3:成員變量隨著對象創建而存在。隨著對象被回收而消失。
靜態變量隨著類的加載而存在。隨著類的消失而消失。
4:成員變量只能被對象所調用?。
靜態變量可以被對象調用,也可以被類名調用。
所以,成員變量可以稱為對象的特有數據,靜態變量稱為對象的共享數據。
靜態的注意:靜態的生命周期很長。
靜態代碼塊:就是一個有靜態關鍵字標示的一個代碼塊區域。定義在類中。
作用:可以完成類的初始化。靜態代碼塊隨著類的加載而執行,而且只執行一次(new?多個對象就只執行一次)。如果和主函數在同一類中,優先于主函數執行。
Public:訪問權限最大。
static:不需要對象,直接類名即可。
void:主函數沒有返回值。
Main:主函數特定的名稱。
(String[]?args):主函數的參數,是一個字符串數組類型的參數,jvm調用main方法時,傳遞的實際參數是?new?String[0]。
jvm默認傳遞的是長度為0的字符串數組,我們在運行該類時,也可以指定具體的參數進行傳遞。可以在控制臺,運行該類時,在后面加入參數。參數之間通過空格隔開。jvm會自動將這些字符串參數作為args數組中的元素,進行存儲。
靜態代碼塊、構造代碼塊、構造函數同時存在時的執行順序:靜態代碼塊 ———> 構造代碼塊 ———> 構造函數;
生成Java幫助文檔:命令格式:javadoc?–d?文件夾名?–auther?–version?*.java
//格式
/**
*類描述
*@author?作者名
*@version?版本號
*/
/**
*方法描述
*@param??參數描述
*@return??返回值描述
*/
繼?承(面向對象特征之一)
好處:
1:提高了代碼的復用性。
2:讓類與類之間產生了關系,提供了另一個特征多態的前提。
父類的由來:其實是由多個類不斷向上抽取共性內容而來的。
java中對于繼承,java只支持單繼承。java雖然不直接支持多繼承,但是保留了這種多繼承機制,進行改良。
單繼承:一個類只能有一個父類。
多繼承:一個類可以有多個父類。
為什么不支持多繼承呢?
因為當一個類同時繼承兩個父類時,兩個父類中有相同的功能,那么子類對象調用該功能時,運行哪一個呢?因為父類中的方法中存在方法體。
但是java支持多重繼承。A繼承B??B繼承C??C繼承D。
多重繼承的出現,就有了繼承體系。體系中的頂層父類是通過不斷向上抽取而來的。它里面定義的該體系最基本最共性內容的功能。
所以,一個體系要想被使用,直接查閱該系統中的父類的功能即可知道該體系的基本用法。那么想要使用一個體系時,需要建立對象。建議建立最子類對象,因為最子類不僅可以使用父類中的功能。還可以使用子類特有的一些功能。
簡單說:對于一個繼承體系的使用,查閱頂層父類中的內容,創建最底層子類的對象。
子父類出現后,類中的成員都有了哪些特點:
1:成員變量。
當子父類中出現一樣的屬性時,子類類型的對象,調用該屬性,值是子類的屬性值。
如果想要調用父類中的屬性值,需要使用一個關鍵字:super
This:代表是本類類型的對象引用。
Super:代表是子類所屬的父類中的內存空間引用。
注意:子父類中通常是不會出現同名成員變量的,因為父類中只要定義了,子類就不用在定義了,直接繼承過來用就可以了。
2:成員函數。
當子父類中出現了一模一樣的方法時,建立子類對象會運行子類中的方法。好像父類中的方法被覆蓋掉一樣。所以這種情況,是函數的另一個特性:覆蓋(復寫,重寫)
什么時候使用覆蓋呢?當一個類的功能內容需要修改時,可以通過覆蓋來實現。
3:構造函數。
發現子類構造函數運行時,先運行了父類的構造函數。為什么呢?
原因:子類的所有構造函數中的第一行,其實都有一條隱身的語句super();
super():?表示父類的構造函數,并會調用于參數相對應的父類中的構造函數。而super():是在調用父類中空參數的構造函數。
為什么子類對象初始化時,都需要調用父類中的函數?(為什么要在子類構造函數的第一行加入這個super()?)
因為子類繼承父類,會繼承到父類中的數據,必須要看父類是如何對自己的數據進行初始化的。
所以子類在進行對象初始化時,先調用父類的構造函數,這就是子類的實例化過程。
注意:
子類中所有的構造函數都會默認訪問父類中的空參數的構造函數,因為每一個子類構造內第一行都有默認的語句super();
如果父類中沒有空參數的構造函數,那么子類的構造函數內,必須通過super語句指定要訪問的父類中的構造函數。
如果子類構造函數中用this來指定調用子類自己的構造函數,那么被調用的構造函數也一樣會訪問父類中的構造函數。
問題:super()和this()是否可以同時出現的構造函數中。
兩個語句只能有一個定義在第一行,所以只能出現其中一個。
super()或者this():為什么一定要定義在第一行?
因為super()或者this()都是調用構造函數,構造函數用于初始化,所以初始化的動作要先完成。
繼承的細節:
什么時候使用繼承呢?
當類與類之間存在著所屬關系時,才具備了繼承的前提。a是b中的一種。a繼承b。狼是犬科中的一種。
英文書中,所屬關系:"?is?a?"
注意:不要僅僅為了獲取其他類中的已有成員進行繼承。
所以判斷所屬關系,可以簡單看,
如果繼承后,被繼承的類中的功能,都可以被該子類所具備,那么繼承成立。如果不是,不可以繼承。
細節二:
在方法覆蓋時,注意兩點:
1:子類覆蓋父類時,必須要保證,子類方法的權限必須大于等于父類方法權限可以實現繼承。否則,編譯失敗。
2:覆蓋時,要么都靜態,要么都不靜態。?(靜態只能覆蓋靜態,或者被靜態覆蓋)
繼承的一個弊端:打破了封裝性。對于一些類,或者類中功能,是需要被繼承,或者復寫的。
這時如何解決問題呢?介紹一個關鍵字,final:最終。
final特點:
1:這個關鍵字是一個修飾符,可以修飾類,方法,變量。
2:被final修飾的類是一個最終類,不可以被繼承。
3:被final修飾的方法是一個最終方法,不可以被覆蓋。
4:被final修飾的變量是一個常量,只能賦值一次。
其實這樣的原因的就是給一些固定的數據起個閱讀性較強的名稱。
不加final修飾不是也可以使用嗎?那么這個值是一個變量,是可以更改的。加了final,程序更為嚴謹。常量名稱定義時,有規范,所有字母都大寫,如果由多個單詞組成,中間用?_?連接。
抽象類:abstract
抽象:不具體,看不明白。抽象類表象體現。
在不斷抽取過程中,將共性內容中的方法聲明抽取,但是方法不一樣,沒有抽取,這時抽取到的方法,并不具體,需要被指定關鍵字abstract所標示,聲明為抽象方法。
抽象方法所在類一定要標示為抽象類,也就是說該類需要被abstract關鍵字所修飾。
抽象類的特點:
1:抽象方法只能定義在抽象類中,抽象類和抽象方法必須由abstract關鍵字修飾(可以描述類和方法,不可以描述變量)。
2:抽象方法只定義方法聲明,并不定義方法實現。
3:抽象類不可以被創建對象(實例化)。
4:只有通過子類繼承抽象類并覆蓋了抽象類中的所有抽象方法后,該子類才可以實例化。否則,該子類還是一個抽象類。
抽象類的細節:
1:抽象類中是否有構造函數?有,用于給子類對象進行初始化。
2:抽象類中是否可以定義非抽象方法?
可以。其實,抽象類和一般類沒有太大的區別,都是在描述事物,只不過抽象類在描述事物時,有些功能不具體。所以抽象類和一般類在定義上,都是需要定義屬性和行為的。只不過,比一般類多了一個抽象函數。而且比一般類少了一個創建對象的部分。
3:抽象關鍵字abstract和哪些不可以共存?final?, private?,?static
4:抽象類中可不可以不定義抽象方法?可以。抽象方法目的僅僅為了不讓該類創建對象。
接?口:
1:是用關鍵字interface定義的。
2:接口中包含的成員,最常見的有全局常量、抽象方法。
注意:接口中的成員都有固定的修飾符。
成員變量:public?static?final
成員方法:public?abstract
interface Inter{
public?static?final int?x?=?3;
public?abstract void?show();
}
3:接口中有抽象方法,說明接口不可以實例化。接口的子類必須實現了接口中所有的抽象方法后,該子類才可以實例化。否則,該子類還是一個抽象類。
4:類與類之間存在著繼承關系,類與接口中間存在的是實現關系。
繼承用extends??;實現用implements?;
5:接口和類不一樣的地方,就是,接口可以被多實現,這就是多繼承改良后的結果。java將多繼承機制通過多現實來體現。
6:一個類在繼承另一個類的同時,還可以實現多個接口。所以接口的出現避免了單繼承的局限性。還可以將類進行功能的擴展。
7:其實java中是有多繼承的。接口與接口之間存在著繼承關系,接口可以多繼承接口。
接口都用于設計上,設計上的特點:(可以理解主板上提供的接口)
1:接口是對外提供的規則。
2:接口是功能的擴展。
3:接口的出現降低了耦合性。
抽象類與接口:
抽象類:一般用于描述一個體系單元,將一組共性內容進行抽取,特點:可以在類中定義抽象內容讓子類實現,可以定義非抽象內容讓子類直接使用。它里面定義的都是一些體系中的基本內容。
接口:一般用于定義對象的擴展功能,是在繼承之外還需這個對象具備的一些功能。
抽象類和接口的共性:都是不斷向上抽取的結果。
抽象類和接口的區別:
1:抽象類只能被繼承,而且只能單繼承。
接口需要被實現,而且可以多實現。
2:抽象類中可以定義非抽象方法,子類可以直接繼承使用。
接口中都有抽象方法,需要子類去實現。
3:抽象類使用的是??is?a?關系。
接口使用的?like?a?關系。
4:抽象類的成員修飾符可以自定義。
接口中的成員修飾符是固定的,全都是public的。
在開發之前,先定義規則,A和B分別開發,A負責實現這個規則,B負責使用這個規則。至于A是如何對規則具體實現的,B是不需要知道的。這樣這個接口的出現就降低了A和B直接耦合性。
多?態(面向對象特征之一):函數本身就具備多態性,某一種事物有不同的具體的體現。
體現:父類引用或者接口的引用指向了自己的子類對象。//Animal?a?=?new?Cat();
多態的好處:提高了程序的擴展性。
多態的弊端:當父類引用指向子類對象時,雖然提高了擴展性,但是只能訪問父類中具備的方法,不可以訪問子類中特有的方法。(前期不能使用后期產生的功能,即訪問的局限性)
多態的前提:
1:必須要有關系,比如繼承、或者實現。
2:通常會有覆蓋操作。
多態的出現思想上也做著變化:以前是創建對象并指揮對象做事情。有了多態以后,我們可以找到對象的共性類型,直接操作共性類型做事情即可,這樣可以指揮一批對象做事情,即通過操作父類或接口實現。
——————————————————————————————————————————————————————class?畢姥爺{
void?講課(){
System.out.println("企業管理");
}
void?釣魚(){
System.out.println("釣魚");
}
}
class?畢老師?extends?畢姥爺{
void?講課(){
System.out.println("JAVA");
}
void?看電影(){
System.out.println("看電影");
}
}
class?{
public?static?void?main(String[]?args)?{
畢姥爺?x?=?new?畢老師();?**//畢老師對象被提升為了畢姥爺類型。**
// x.講課();
// x.看電影();??**//錯誤.**
畢老師?y?=?(畢老師)x;?**//將畢姥爺類型強制轉換成畢老師類型。**
y.看電影();//在多態中,自始自終都是子類對象在做著類型的變化。
}
}
——————————————————————————————————————————————————————
如果想用子類對象的特有方法,如何判斷對象是哪個具體的子類類型呢?
可以可以通過一個關鍵字?instanceof?;//判斷對象是否實現了指定的接口或繼承了指定的類
格式:?,判斷一個對象是否所屬于指定的類型。
Student?instanceof?Person?=?true;//student繼承了person類
多態在子父類中的成員上的體現的特點:
1:成員變量:在多態中,子父類成員變量同名。
在編譯時期:參考的是引用型變量所屬的類中是否有調用的成員。(編譯時不產生對象,只檢查語法錯誤)
運行時期:也是參考引用型變量所屬的類中是否有調用的成員。
簡單一句話:無論編譯和運行,成員變量參考的都是引用變量所屬的類中的成員變量。
再說的更容易記憶一些:成員變量?———?編譯運行都看?=?左邊。
2:成員函數。
編譯時期:參考引用型變量所屬的類中是否有調用的方法。
運行事情:參考的是對象所屬的類中是否有調用的方法。
為什么是這樣的呢?因為在子父類中,對于一模一樣的成員函數,有一個特性:覆蓋。
簡單一句:成員函數,編譯看引用型變量所屬的類,運行看對象所屬的類。
更簡單:成員函數?———?編譯看?=?左邊,運行看?=?右邊。
3:靜態函數。
編譯時期:參考的是引用型變量所屬的類中是否有調用的成員。
運行時期:也是參考引用型變量所屬的類中是否有調用的成員。
為什么是這樣的呢?因為靜態方法,其實不所屬于對象,而是所屬于該方法所在的類。
調用靜態的方法引用是哪個類的引用調用的就是哪個類中的靜態方法。
簡單說:靜態函數?———?編譯運行都看?=?左邊。
——————java.lang.Object
Object:所有類的直接或者間接父類,Java認為所有的對象都具備一些基本的共性內容,這些內容可以不斷的向上抽取,最終就抽取到了一個最頂層的類中的,該類中定義的就是所有對象都具備的功能。
具體方法:
1:boolean?equals(Object?obj):用于比較兩個對象是否相等,其實內部比較的就是兩個對象地址。
而根據對象的屬性不同,判斷對象是否相同的具體內容也不一樣。所以在定義類時,一般都會復寫equals方法,建立本類特有的判斷對象是否相同的依據。public?boolean?equals(Object?obj){
if(!(obj?instanceof?Person))
return?false;
Person?p?=?(Person)obj;
return?this.age?==?p.age;
}
2:String?toString():將對象變成字符串;默認返回的格式:類名@哈希值?=?getClass().getName()?+?'@'?+?Integer.toHexString(hashCode())
為了對象對應的字符串內容有意義,可以通過復寫,建立該類對象自己特有的字符串表現形式。public?String?toString(){
return?"person?:?"+age;
}
3:Class?getClass():獲取任意對象運行時的所屬字節碼文件對象。
4:int?hashCode():返回該對象的哈希碼值。支持此方法是為了提高哈希表的性能。
通常equals,toString,hashCode,在應用中都會被復寫,建立具體對象的特有的內容。
內部類:如果A類需要直接訪問B類中的成員,而B類又需要建立A類的對象。這時,為了方便設計和訪問,直接將A類定義在B類中。就可以了。A類就稱為內部類。內部類可以直接訪問外部類中的成員。而外部類想要訪問內部類,必須要建立內部類的對象。class?Outer{
int?num?=?4;
class??Inner?{
void?show(){
System.out.println("inner?show?run?"+num);
}
}
public?void?method(){
Inner?in?=?new?Inner();//創建內部類的對象。
in.show();//調用內部類的方法。
}
}
當內部類定義在外部類中的成員位置上,可以使用一些成員修飾符修飾?private、static。
1:默認修飾符。
直接訪問內部類格式:外部類名.內部類名?變量名?=??外部類對象.內部類對象;
Outer.Inner?in?=?new?Outer.new?Inner();//這種形式很少用。
但是這種應用不多見,因為內部類之所以定義在內部就是為了封裝。想要獲取內部類對象通常都通過外部類的方法來獲取。這樣可以對內部類對象進行控制。
2:私有修飾符。
通常內部類被封裝,都會被私有化,因為封裝性不讓其他程序直接訪問。
3:靜態修飾符。
如果內部類被靜態修飾,相當于外部類,會出現訪問局限性,只能訪問外部類中的靜態成員。
注意;如果內部類中定義了靜態成員,那么該內部類必須是靜態的。
內部類編譯后的文件名為:“外部類名$內部類名.java”;
為什么內部類可以直接訪問外部類中的成員呢?
那是因為內部中都持有一個外部類的引用。這個是引用是?外部類名.this
內部類可以定義在外部類中的成員位置上,也可以定義在外部類中的局部位置上。
當內部類被定義在局部位置上,只能訪問局部中被final修飾的局部變量。
匿名內部類:沒有名字的內部類。就是內部類的簡化形式。一般只用一次就可以用這種形式。匿名內部類其實就是一個匿名子類對象。想要定義匿名內部類:需要前提,內部類必須繼承一個類或者實現接口。
匿名內部類的格式:new?父類名&接口名(){?定義子類成員或者覆蓋父類方法?}.方法。
匿名內部類的使用場景:
當函數的參數是接口類型引用時,如果接口中的方法不超過3個。可以通過匿名內部類來完成參數的傳遞。
其實就是在創建匿名內部類時,該類中的封裝的方法不要過多,最好兩個或者兩個以內。//E.G:
**//1**
new?Object(){
void?show(){
System.out.println("show?run");
}
}**.show();**
**//2**
Object?obj?=?new?Object(){
void?show(){
System.out.println("show?run");
}
};
obj.show();
1和2的寫法正確嗎?有區別嗎?說出原因。
寫法是正確,1和2都是在通過匿名內部類建立一個Object類的子類對象。
區別:
第一個可是編譯通過,并運行。
第二個編譯失敗,因為匿名內部類是一個子類對象,當用Object的obj引用指向時,就被提升為了
Object類型,而編譯時檢查Object類中是否有show方法,所以編譯失敗。class?InnerClassDemo6?{
**+(static)**class?Inner{
void?show(){}
}
public?void?method(){
**this.**new?Inner().show();//可以
}
public?static?void?main(String[]?args)?{//static不允許this
This.new?Inner().show();//錯誤,Inner類需要定義成static
}
}
interface?Inter{
void?show();
}
class?Outer{//通過匿名內部類補足Outer類中的代碼。
public?static?Inter?method(){
return?new?Inter(){
public?void?show(){}
};
}
}
class?InnerClassDemo7?{
public?static?void?main(String[]?args)?{
**Outer.method().show();**
/*
Outer.method():意思是:Outer中有一個名稱為method的方法,而且這個方法是靜態的。
Outer.method().show():當Outer類調用靜態的method方法運算結束后的結果又調用了show方法,意味著:method()方法運算完一個是對象,而且這個對象是Inter類型的。*/
function?(new?Inter(){
public?void?show(){}
});?//匿名內部類作為方法的參數進行傳遞。
}
public?static?void?function(Inter?in){
in.show();
}
}
總結
以上是生活随笔為你收集整理的java面向对象基础代码_JAVA基础知识点之Java面向对象的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ACM 博弈专题(5种模板)
- 下一篇: Java Apple_GitHub -