1.什么是類和對象?
EVERYTHING IS OBJECT(萬物皆對象)所有的事物都有兩個方面:
- 有什么(屬性):用來描述對象。
- 能夠做什么(方法):告訴外界對象有那些功能。
- 對象:對現實世界中的實體的抽象。在計算機中,是指可標識的存儲區域。
- 類:具有共同屬性和行為的對象的抽象。類是創建對象的模板。
2.為什么要使用面向對象?
首先,面向對象符合人類看待事物的一般規律。 對象的方法的實現細節對其他對象是屏蔽的。 我們通過類來看待對象,類是對象的抽象。
其次,采用面向對象方法可以使系統各部分各司其職、各盡所能。 對象之間的耦合性一定要低。這樣才能使每個對象本身做成最好的。
對於對象的要求:高內聚、低耦合,這樣容易拼裝成為一個系統。
實現高內聚就是要最大限度低提高復用性(復用性好是因為高內聚)。可復用性是OOP的基礎。
3.面向過程思想和面向對象思想比較?
面向過程的思想:由過程、步驟、函數組成,以過程為核心;
面向對象的思想:以對象為中心,先開發類,得到對象,通過對象之間相互通信實現功能。
4.實例變量和局部變量的比較
- 實例變量:定義在類中但在任何方法之外。(New出來的均有初值)
- 局部變量:定義在方法之中的變量。
- 局部變量要先賦值,再進行運算,而實例變量均已經賦初值。這是局部變量和實例變量的一大區別。實例變量的對象賦值為null。
- 不允許在同一作用域內定義兩個相同名稱的實例變量和局部變量,但實例變量和局部變量允許命名沖突。
- 區分實例變量和局部變量時一定要寫this。
5.介紹一下對構造函數的理解
構造方法是當用類生成對象時,系統在生成對象的過程中利用的方法。
- 注意:構造方法在生成對象的時候會被調用,但並不是構造方法生成了對象。
- 構造方法沒有返回值。格式為:public 方法名。
- 構造方法的方法名與類名相同。
- 構造方法是在對象生成的過程中自動調用,不可能利用指令去調用。
- 在一個對象的生成周期中構造方法只用一次,一旦這個對象生成,那么這個構造方法失效。
- 注意:在對象變量中存放的是引用(地址);在簡單變量中存放的是數值。
- 可以構造多個構造方法,但多個構造方法的參數表一定不同,參數順序不同即屬於不同的構造方法:
- 如果我們未給類提供一個構造方法,那么系統會自動提供一個為空的構造方法。
6.面向對象方法的重載(Overloading)和覆蓋(Overriding)
Overloading在一個類中可以定義多個同名方法,各個方法的參數表一定不同。但修飾詞可能相同,返回值也可能相同。 overloading是編譯時的多態。
Overriding指子類與父類之間的同名方法,參數表順序一定相同,但修飾符和返回值可能不同,構造函數無法覆蓋。Overriding是運行時多態。
7.this關鍵字
This表示當前對象。
特別注意:用this調用其他構造方法時,this必須為第一條語句,然后才是其他語句。
8.面向對象三大特性之封裝
Java中提供4個修飾符來進行對象屬性和方法的訪問權限控制:
- private :類內部可見
- default :包內部可見
- protected :包內部或子類可見
- public :所有可見
9.面向對象三大特性之繼承
- 父類的非私有化屬性和方法可以默認繼承到子類。
- 父類的構造方法子類不可以繼承,更不存在覆蓋的問題。(非構造方法可以)
- 如果子類訪問父類的構造方法,則在編譯的時候提示訪問不到該方法。
- JAVA中不允許多繼承,一個類有且只有一個父類(單繼承)。
- JAVA的數據結構為樹型結構,而非網狀。(JAVA通過接口和內部類實現多繼承)
- 對於方法的修飾詞,子類方法要比父類的方法范圍更加的寬泛。父類為public,那么子類為private則出現錯誤。
- super()表示調用父類的構造方法。super()也和this一樣必須放在第一行。this()用於調用本類的構造方法。如果沒有定義構造方法,那么就會調用父類的無參構造方法,即super()。
當構造一個對象的時候,系統先構造父類對象,再構造子類對象。構造一個對象的順序:(注意:構造父類對象的時候也是這幾步)
- 遞歸地構造父類對象;
- 順序地調用本類成員屬性賦初值語句;
- 本類的構造方法。
10.面向對象三大特性之多態
多態指的是編譯時類型不變化,而運行時類型變化。 多態分兩種:
- 編譯時多態:編譯時動態重載;
- 運行時多態:指一個對象可以具有多個類型。
11.修飾符static
static定義的是一塊為整個類共有的一塊存儲區域,其發生變化時訪問到的數據都是變化之后的。其變量可以通過類名去訪問:類名.變量名。與實例對象訪問變量為等價的。 static 可修飾屬性、方法和代碼塊:
- static修飾的屬性為一個類的共享變量,屬於整個類,在不實例化對象的情況下就能訪問。
- static修飾方法表明此方法為類方法(靜態方法),靜態方法不需要有對象,可以使用類名調用,靜態方法不能訪問非靜態成員,包括成員的變量和方法,因為此時是通過類調用的,沒有對象的概念。this是不可用的。
- 當static修飾代碼塊時(注:此代碼塊要在此類的任何一個方法之外),那么這個代碼塊在代碼被裝載進虛擬機生成對象的時候可被裝載一次,以后再也不執行了,一般靜態代碼塊被用來初始化靜態成員。
一般情況下,主方法是靜態方法,所以可調用靜態方法,主方法為靜態方法是因為它是整個軟件系統的入口,而進入入口時系統中沒有任何對象,只能使用類調用。 覆蓋不適用於靜態方法,靜態方法不可被覆蓋。(允許在子類中定義同名靜態方法,但是沒有多態,嚴格的講,方法間沒有多態就不能稱為覆蓋。
12.修飾符final
final可修改類、屬性、方法:
- 當用final修飾類的時候,此類不可被繼承,即final類沒有子類。這樣可以用final保證用戶調用時動作的一致性,可以防止子類覆蓋情況的發生。
- 利用final修飾一個屬性(變量)的時候,此時的屬性成為常量。常量的地址不可改變,但在地址中保存的值(即對象的屬性)是可以改變的。
- 利用final定義方法:這樣的方法為一個不可覆蓋的方法。如果在父類中有final定義的方法,那么在子類中繼承同一個方法。
對於在構造方法中利用final進行賦值的時候,此時在構造之前系統設置的默認值相對於構造方法失效。 常量(這里的常量指的是實例常量:即成員變量)賦值:
- 在初始化的時候通過顯式聲明賦值。final int x=3;
- 在構造的時候賦值(定義時不賦值)。
局部變量可以隨時賦值。 注:如果一個方法前有修飾詞private或static,則系統會自動在前面加上final。即private和static方法默認均為final方法。Java中使用final和static組合,聲明常量標識符(固定語法)。final並不涉及繼承,繼承取決於類的修飾符是否為private、default、protected還是public。也就是說,是否繼承取決於這個方法對於子類是否可見。
13.抽象修飾符abstract
- abstract(抽象)可以修飾類、方法
- 如果將一個類設置為abstract,則此類不可生成對象,必須被繼承使用。
- abstract可以將子類的共性最大限度的抽取出來,放在父類中,以提高程序的簡潔性。
- abstract雖然不能生成對象,但是可以聲明,作為編譯時類型,但不能作為運行時類型。
- final和abstract永遠不會同時出現。
- 當abstract用於修飾方法時,此時該方法為抽象方法,此時方法不需要實現,實現留給子類覆蓋,子類覆蓋該方法之后方法才能夠生效。
- abstract和static不能放在一起,否則便會出現錯誤。(這是因為static不可被覆蓋,而abstract為了生效必須被覆蓋。)
14.接口和抽象類的比較
- 接口和抽象類都用於抽象,接口是抽象類的抽象。 接口和抽象類都不能被實例化。
- 接口中只有方法聲明,沒有實現;在接口中聲明的方法具有public和abstract屬性,一個類可以實現多個接口(即多繼承),接口以‘,’分隔;接口中的方法必須全部實現。
- 抽象類可以有部分方法實現,抽象類必須通過繼承才能使用。
- 表現目的不同:接口用來聲明功能和消息,抽象類用來抽象類,達到代碼復用。
15.內部類
注:所有使用內部類的地方都可以不用內部類,使用內部類可以使程序更加的簡潔,便於命名規范和划分層次結構。內部類是一個編譯時的概念,一旦編譯成功,就會成為完全不同的兩類。 內部類是指在一個外部類的內部再定義一個類。內部類作為外部類的一個成員,並且依附於外部類而存在的。
內部類同時具有成員和類的特性(特性不沖突)。 內部類的分類:
- 成員內部類
- 局部內部類
- 靜態內部類
- 匿名內部類(圖形是要用到,必須掌握)
a.成員內部類
作為外部類的一個成員存在,與外部類的屬性、方法並列。
內部類和外部類的實例變量可以共存。在內部類中訪問實例變量:this.屬性,在內部類訪問外部類的實例變量:外部類名.this.屬性。
成員內部類的優點:
⑴內部類作為外部類的成員,可以訪問外部類的私有成員或屬性。(即使將外部類聲明為PRIVATE,但是對於處於其內部的內部類還是可見的。)
⑵用內部類定義在外部類中不可訪問的屬性。這樣就在外部類中實現了比外部類的private還要小的訪問權限。
成員內部類不可以有靜態屬性。
建立內部類對象時應注意: 在外部類的內部可以直接使用inner s=new inner();(因為外部類知道inner是哪個類,所以可以生成對象。)而在外部類的外部,要生成(new)一個內部類對象,需要首先建立一個外部類對象(外部類可用),然后在生成一個內部類對象。
Outer outer = new Outer; Outer.Inner in=outer.new Inner();
錯誤的定義方式: Outer.Inner in=new Outer.Inner()。
注意:當Outer是一個private類時,外部類對於其外部訪問是私有的,所以就無法建立外部類對象,進而也無法建立內部類對象。
b.局部內部類
在方法中定義的內部類稱為局部內部類。與局部變量類似,在局部內部類前不加修飾符public和private,其范圍為定義它的代碼塊。
注意:局部內部類不僅可以訪問外部類實例變量,還可以訪問外部類的局部變量(但此時要求外部類的局部變量必須為final)??
在類外不可直接生成局部內部類(保證局部內部類對外是不可見的)。
要想使用局部內部類時需要生成對象,對象調用方法,在方法中才能調用其局部內部類。
c.靜態內部類
注意:前三種內部類與變量類似,所以可以對照參考變量,靜態內部類定義在類中,任何方法外,用static定義。
靜態內部類只能訪問外部類的靜態成員。
生成(new)一個靜態內部類不需要外部類成員:這是靜態內部類和成員內部類的區別。
靜態內部類的對象可以直接生成:Outer.Inner in=new Outer.Inner(); 而不需要通過生成外部類對象來生成。這樣實際上使靜態內部類成為了一個頂級類。
靜態內部類不可用private來進行定義。
注意:當類與接口(或者是接口與接口)發生方法命名沖突的時候,此時必須使用內部類來實現。用接口不能完全地實現多繼承,用接口配合內部類才能實現真正的多繼承。
d. 匿名內部類
匿名內部類是一種特殊的局部內部類,它是通過匿名類實現接口。
注:一個匿名內部類一定是在new的后面,用其隱含實現一個接口或實現一個類,沒有類名,根據多態,我們使用其父類名。 因其為局部內部類,那么局部內部類的所有限制都對其生效。
匿名內部類是唯一一種無構造方法類。
匿名內部類在編譯的時候由系統自動起名Out$1.class。
如果一個對象編譯時的類型是接口,那么其運行的類型為實現這個接口的類。因匿名內部類無構造方法,所以其使用范圍非常的有限。
15、運行時異常與普通異常
異常表示程序運行過程中可能出現的非正常狀態,運行時異常表示虛擬機的通常操作中可能遇到的異常,是一種常見運行錯誤。java編譯器要求方法必須聲明拋出可能發生的非運行時異常,但是並不要求必須聲明拋出未被捕獲的運行時異常。
- Error:表示由JVM所偵測到的無法預期的錯誤,由於這是屬於JVM層次的嚴重錯誤,導致JVM無法繼續執行,因此,這是不可捕捉到的,無法采取任何恢復的操作,頂多只能顯示錯誤信息。
- Exception:表示可恢復的例外,這是可捕捉到的。
- checked異常:也就是我們經常遇到的IO異常,以及SQL異常都是這種異常。對於這種異常,JAVA編譯器強制要求我們必需對出現的這些異常進行catch。所以,面對這種異常不管我們是否願意,只能自己去寫一大堆catch塊去處理可能的異常。
- runtime exception,也稱運行時異常,我們可以不處理。當出現這樣的異常時,總是由虛擬機接管。比如:我們從來沒有人去處理NullPointerException異常,它就是運行時異常,並且這種異常還是最常見的異常之一。
16、Java命名規范
必須以英文字母、下划線(’_’)或’$’開始,其余可以有數字但不允許包含空格,且組合后的名稱不能是Java關鍵字或保留字。
- 匈牙利命名法:以m開始為類成員變量,以g開始為全局變量,以v開始為本地局部變量,常量命名一般不以下划線、美元符開始。
- 駝峰命名:一般稱由多個單詞或縮寫組成的變量名,並且該變量名每個單詞首字母均為大寫(一般類名全部首字母大寫,方法或屬性名第一個字母小寫)的稱為駝峰命名。