繼上一篇Java核心技術第五章——1.類、超類、子類(1) 6.重載解析 假如調用ClassName.Method(args) 1.編譯器列出類ClassName所有名為Method的方法。 2.編譯器將查看調用方法提供的參數類型(args)。 3.根據參數類型匹配所有名為Method的方法。 4. ...
6.重載解析
假如調用ClassName.Method(args)
1.編譯器列出類ClassName所有名為Method的方法。
2.編譯器將查看調用方法提供的參數類型(args)。
3.根據參數類型匹配所有名為Method的方法。
4.如果編譯器沒有找到與參數類型匹配的方法,或者發現經過類型轉換後有多個方法與之匹配,就會報告一個錯誤。
7.阻止繼承:final類和方法。
1.final類:當你不希望別人利用某個類定義子類。那麼則使用final去修飾類。此類則不允許擴展,稱為final類。(final類的方法預設為final方法)
2.final方法:類中的方法也可以被聲明為final。如果這樣做,那麼子類就不能覆蓋這個方法(前提不是final類)
8.強制類型轉換
例如 : double x = 6.66; int nx = (int) x; //轉換成功 此表達式x的值轉成整數類型,捨棄了小數部分。
例如:
List<Object> obj = new ArrayList(); obj.add("hello"); obj.add(666); int i = (Integer)obj.get(0);//error 類型轉換錯誤 ClassCastException
假如你不清楚obj數組引用的對象。那麼可以使用instanceof進行檢查
if( obj.get(0) instanceof Integer){//如果屬於Integer類型再進行強制類型轉換。 int i = (Integer) obj.get(0); }
綜上所述:
1.只能在繼承層次內進行強制類型轉換
2.在將超類轉換成子類之前,應該使用instanceof進行檢查。
8.抽象類
抽象方法充當占位符的角色,它們的具體實現在子類中。擴展抽象類(子類)可以有兩種選擇。一種是在子類中定義部分抽象類方法或不定義抽象類方法,這樣就必須將子類也標記為抽象類;另一種是定義全部的抽象方法。這樣子類就不是抽象的了。
抽象類:
public abstract class Person { public abstract String getDescription(); private String name; public Person(String name){ this.name = name; } public String getName() { return name; } }
抽象子類:沒有重寫抽象父類的方法
public abstract class Student extends Person {
public Student(String name) { super(name); } }
非抽象子類:重寫了抽象父類的所有方法
public class Employee extends Person{
public Employee(String name) { super(name); } @Override public String getDescription() { return String.format("我的名字是xxx"); } }
1. 抽象類不能被實例化,只有抽象類的非抽象子類可以創建對象。
2. 抽象類中不一定包含抽象方法,但是有抽象方法的類必定是抽象類。
3. 抽象類中的抽象方法不會具體實現該方法。可實現部分或不實現方法。
4. 構造方法和類方法不能聲明為抽象方法。若抽象父類含有有參的構造方法。那麼在子類的構造方法必須顯示調用super(param)
5. 抽象類的子類必須給出抽象類中的抽象方法的具體實現,除非該子類也是抽象類。
參數 |
抽象類 |
介面 |
預設的方法實現 |
它可以有預設的方法實現 |
介面完全是抽象的。它根本不存在方法的實現 |
實現 |
子類使用extends關鍵字來繼承抽象類。如果子類不是抽象類的話,它需要提供抽象類中所有聲明的方法的實現。 |
子類使用關鍵字implements來實現介面。它需要提供介面中所有聲明的方法的實現 |
構造器 |
抽象類可以有構造器 |
介面不能有構造器 |
與正常Java類的區別 |
除了你不能實例化抽象類之外,它和普通Java類沒有任何區別 |
介面是完全不同的類型 |
訪問修飾符 |
抽象方法可以有public、protected和default這些修飾符 |
介面方法預設修飾符是public。你不可以使用其它修飾符。 |
main方法 |
抽象方法可以有main方法並且我們可以運行它 |
介面沒有main方法,因此我們不能運行它。 |
多繼承 |
抽象方法可以繼承一個類和實現多個介面 |
介面只可以繼承一個或多個其它介面 |
速度 |
它比介面速度要快 |
介面是稍微有點慢的,因為它需要時間去尋找在類中實現的方法。 |
添加新方法 |
如果你往抽象類中添加新的方法,你可以給它提供預設的實現。因此你不需要改變你現在的代碼。 |
如果你往介面中添加方法,那麼你必須改變實現該介面的類。 |
此表格取自http://www.importnew.com/12399.html
9.受保護訪問
1. private 僅對本類可見
2.不需要修飾符/defa 對本包可見
3.protected 對本包和所有子類可見(包括不在本包的子類)
4.public 對所有類可見
希望大家指出文章的不足之處,Thanks♪(・ω・)ノ