作用域 | 當前類 | 同一package | 子孫類 | 其他package |
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
default | √ | √ | × | × |
private | √ | × | × | × |
關于overload與override的區別:
overload是重載,意思是我們可以定義一些名稱相同的方法,通過定義不同的輸入參數來區分這些方法,然后再調用時,VM就會根據不同的參數樣式,來選擇合適的方法執行。 方法重載支持多態性,因為它是Java 實現“一個接口,多個方法”范型的一種方式。要理解這一點,考慮下面這段話:在不支持方法重載的語言中,每個方法必須有一個惟一的名字。但是,你經常希望實現數據類型不同但本質上相同的方法。
1)使用重載時必須使用不同的參數樣式
2)對于繼承來說,如果某一方法在父類中是訪問權限是private,那么就不能在子類對其進行重載,如果定義的話,也只是定義了一個新方法,而不會達到重載的效果。
override是重寫(比如說對接口的重寫,繼承中子類重寫父類的方法)。
1)覆蓋的方法的標志必須要和被覆蓋的方法的標志完全匹配,才能達到覆蓋的效果;
2)覆蓋的方法的返回值必須和被覆蓋的方法的返回一致;
3)覆蓋的方法所拋出的異常必須和被覆蓋方法的所拋出的異常一致,或者是其子類;
4)被覆蓋的方法不能為private,否則在其子類中只是新定義了一個方法,并沒有對其進行覆蓋。
關于抽象類(abstract)所有的對象都是通過類來描述的,然而,所有的類不一定是通過對象來描述清楚,因此不能描述的這些類定義為抽象類 。
抽象類與接口緊密相關。然接口又比抽象類更抽象,這主要體現在它們的差別上:1)類可以實現無限個接口,但僅能從一個抽象(或任何其他類型)類繼承,從抽象類派生的類仍可實現接口,從而得出接口是用來解決多重繼承問題的。2)抽象類當中可以存在非抽象的方法,可接口不能且它里面的方法只是一個聲名必須用public來修飾沒有具體實現的方法。3)抽象類中的成員變量可以被不同的修飾符來修飾,可接口中的成員變量默認的都是靜態常量(static final)。4)這一點也是最重要的一點本質的一點"抽象類是對象的抽象,然接口是一種行為規范"。
package core_java;
abstract class Ch{
public abstract void doSome();
}
class A extends Ch{
public void doSome(){
System.out.println("a");
}
}
class B extends Ch{
public void doSome(){
System.out.println("b");
}
}
public class TestAbstract {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Ch aa = new A();
Ch bb = new B();
A aaa = new A();
B bbb = new B();
aa.doSome();
bb.doSome();
aaa.doSome();
bbb.doSome();
doSomething(aa);
doSomething(bb);
doSomething(aaa);
doSomething(bbb);
}
public static void doSomething(Ch a){
a.doSome();
}
}