面向?qū)ο笥心男┨卣鳎?/h2>
抽象:包括過程抽象和數(shù)據(jù)抽象。
繼承:允許和鼓勵類的重用厉斟。
封裝:類可以把自己的數(shù)據(jù)和方法只讓可信的類或者對象操作蓖谢,對不可信的進行信息隱藏。
多態(tài):包括參數(shù)化多態(tài)和包含多態(tài)员淫。具有靈活、抽象击敌、行為共享介返、代碼共享等優(yōu)勢,很好地解決了應(yīng)用程序同名的問題沃斤,
面對對象開發(fā)方式的優(yōu)點
1.較高的開發(fā)效率圣蝎。
2.保證軟件的魯棒性。
3.保證軟件的高可維護性衡瓶。
組合和繼承
繼承是一種is-a的關(guān)系徘公,組合是一種has-a的關(guān)系,比如car is vehicle哮针,car has tire关面。在Java語言中坦袍,能使用組合就盡量不使用繼承,除非是“is - a”關(guān)系缭裆。
多態(tài)實現(xiàn)的機制是什么事格?
Java中提供了兩種用于多態(tài)的機制犁享。編譯時多態(tài)和運行時多態(tài)脸侥。編譯時多態(tài)是通過方法的重載實現(xiàn)的独柑,運行時多態(tài)是通過方法的覆蓋(子類覆蓋父類的方法)實現(xiàn)的。
此外缝其,只有類的方法才有多態(tài)的概念挎塌,類中成員變量沒有多態(tài)的概念。
public class Test {
public static void main(String[] args) {
A a = new B();
System.out.println(a.i);
}
}
class A {
public int i = 1;
}
class B extends A {
public int i = 2;
}
程序運行結(jié)果為1
内边。
抽象類與接口有什么異同榴都?
相同點
1.都不能被實例化。
- 接口的實現(xiàn)類或抽象類的子類都只有實現(xiàn)了借口或抽象類中的方法后才能被實例化漠其。
不同點
1.Java 8 之前嘴高,接口只有定義,其方法不能再接口中實現(xiàn)和屎,而抽象類可以有定義與實現(xiàn)拴驮,即其方法可以在抽象類中實現(xiàn)。
java 8后柴信,接口中用defualt關(guān)鍵字修飾的方法可以被實現(xiàn)套啤,實現(xiàn)該接口的類可以直接使用該方法。
interface C {
default void getc(){
System.out.println("C");
}
}
- 一個類可以實現(xiàn)多個接口随常,但是只能繼承一個抽象類潜沦。
- 接口“has - a”,抽象類“is - a”绪氛。
- 接口中的成員變量默認為
public static final
唆鸡,只能夠有靜態(tài)的不能被修改的數(shù)據(jù)成員,而且枣察,必須給其賦初值喇闸。其所有的成員方法都是public、abstract
的询件,而且也只能被這兩個關(guān)鍵詞修飾。
而抽象類可以有自己的數(shù)據(jù)成員變量唆樊,也可以有非抽象的成員方法宛琅。而且抽象類中的成員變量默認為defualt
(本包可見),當然也可以被定義成public,protected,private
逗旁,這些成員變量可以在子類中重新定義嘿辟,也可以被重新賦值舆瘪。抽象類中的抽象方法(其前有abstract
修飾)不能用private,static,synchronized,native
等訪問修飾符修飾,同時方法必須以分好結(jié)尾红伦,并且不帶花括號英古。
此外接口可以繼承(extends
)接口,抽象類可以實現(xiàn)接口昙读,抽象類也可以繼承具體類召调。抽象類也可以有靜態(tài)的main方法。
內(nèi)部類有哪些
主要有以下4種:
1. 靜態(tài)內(nèi)部類
class outerClass {
static class innerClass{}
}
靜態(tài)內(nèi)部類是指被聲明為static的內(nèi)部類蛮浑,它可以不依賴外部類實例而被實例化唠叛,不能與外部類有相同的名字,不能訪問外部類的普通成員變量沮稚,只能訪問外部類中的靜態(tài)變量和靜態(tài)方法(包括私有類型)艺沼。
2. 成員內(nèi)部類
class outerClass {
class innerClass{}
}
它可以自由地引用外部類的屬性和方法,但是它與一個實例綁定在一起蕴掏,不可以定義靜態(tài)的屬性和方法障般。非靜態(tài)內(nèi)部類不能有靜態(tài)成員(包括變量和方法)。
3. 局部內(nèi)部類
class outerClass {
public void memberFunction {
class innerClass{}
}
}
局部內(nèi)部類是指定義在一個代碼塊內(nèi)的類盛杰,它的作用范圍是在其所在代碼塊挽荡。**局部內(nèi)部類像局部變量一樣,不能被public,protected,private,static
修飾饶唤,只能訪問方法中定義為final的局部變量徐伐。
4.匿名內(nèi)部類
public class MyFrame extends Frame {
public MyFrame(){
addWindowListener(new WindowAdapter() { //匿名內(nèi)部類
@Override
public void windowClosing(WindowEvent e) {
dispose();
System.exit(0);
}
});
}
}
在使用匿名內(nèi)部類時,需要牢記以下幾個原則:
- 不能有構(gòu)造函數(shù)募狂。
- 不能定義靜態(tài)成員办素、方法和類。
- 不能是
public,protected,private,static
祸穷。 - 只能創(chuàng)建匿名內(nèi)部類的一個實例性穿。
- 一個匿名內(nèi)部類一定是在new后面,這個匿名類必須繼承一個父類或者實現(xiàn)一個接口雷滚。
- 因為匿名內(nèi)部類為局部內(nèi)部類需曾,所以局部內(nèi)部類的所有限制都對其生效。
如何獲取父類的類名祈远?
可以使用getClass().getName()
方法來獲取類名呆万,但是不能調(diào)用super.getClass()
來獲取父類的類名,因為getClass()方法在Object類中被定義為final和native车份,所以不論是this.getClass()
還是super.getClass()
谋减,調(diào)用的都是Object類中的getClass()方法,該方法返回此Object的運行時類扫沼。
可以通過Java的反射機制出爹,使用getClass().getSuperclass().getName()
庄吼。