派生類一般格式:
[類的修飾符] class 子類名 extends 父類名{
成員變量定義
成員方法定義
}
public class AutoMobileTest { public static void main(String args[]) { AutoMobile car=new AutoMobile(); car.showNumber(); Truck toto=new Truck(); toto.showNumber(); car.testdefault(); } } class AutoMobile { public int publicNum; int defaultNum; protected int protectedInt; private int privateInt; public void showNumber() { System.out.println("AutoMobile Number is :"+defaultNum); } public void setNumber(int newNumber) { defaultNum=newNumber; } void testdefault() { System.out.println("It works"); } } class Truck extends AutoMobile{ @Override public void showNumber() { //重寫。重寫showNumber System.out.println("truck number is:"+defaultNum); } }
重寫override:將父類的方法重新定義,static方法無法重寫
要調用超類的同名方法,使用super.method();
調用超類的構造方法(顯式)使用super()
2、繼承下的構造方法和finalize方法
構造方法是從父類的父類,直到Object類(所有類的父類)開始的;
可顯式(super(...))可隱式,
阻止繼承:final關鍵字
public class SupetTest { public static void main(String args[]) { Graduate xiaoming =new Graduate(); xiaoming.run(); } } class Human{ public Human(){ System.out.println("Human constructor"); } public void run() {System.out.println("Human run");} } class Student extends Human{ static String se="se"; public Student() { System.out.println("student constructor"); } public void run() { System.out.println("Student run"); } } class Graduate extends Student{ public Graduate() { System.out.println("Graduates constructor"); } public void run() { super.run(); System.out.println("Gradute run"); } }
finalize則從子類的finalize方法開始,往上執行,
在子類的finalize方法中最后應調用父類的finalize方法:super.finalize()
3、超類和子類的問題
若子類直接繼承父類的變量,可能會賦予其非法值。
所以:子類方法應依賴於超類的服務接口而不是實現。
(將變量設置成private,再使用public方法進行訪問)
4、繼承層次中對象間的關系
子類對象可以視為超累的對象,將子類對象賦給超類變量
Circle circle1=new Circle(); Point point1=new Point(); Point pointRef=new Circle();
5、抽象類 方法
abstract
抽象類至少含有一個抽象方法。只能作為超類被繼承
關鍵字abstract,抽象類,抽象方法(不提供方法體)。
靜態方法不能作為抽象方法
。
抽象類的所有具體子類必須提供抽象方法的具體實現。
6、接口
接口用於聲明一組類的公共操作(功能)
接口由:一組常量+一組抽象方法 組成
一個類可以實現多個接口 類名 [extends 父類名] implements 接口1,接口2,接口3
接口的聲明
[public ] interface 接口名 [extends 父接口名]{
[public] [static] [final] 類型 常量名 = 常量值;常量定義
[public] [abstract] 返回類型 方法名(參數);抽象方法定義
}
public interface 的public決定是否可包外訪問
public static final 類型 常量名 的修飾符都可缺省不寫,因為必定public。static。final
public abstract 也可缺省不寫
如何訪問接口中的常量
public class VisitVariable implements A{ static int k = 0; public static void main(String[] args) { VisitVariable test = new VisitVariable(); k = test.i;//實現了接口的類對象來訪問 k = VisitVariable.i;//實現了接口的類名來訪問 k = A.i;//接口名來訪問 } } interface A { int i = 10;//接口中的常量 }
7、final 方法 和 final 類
子類不能重寫超類中的final方法,final隱式地為private方法。
final類不能為超類,其中的所有方法都隱式地為final方法
final類可以防止創建繞過安全限制的子類
8、內部類
聲明
[修飾符]class outerClass{ 。。。 [修飾符]class innerClass{ 。。。 } 。。。 }
內部類主要用於事件處理,可以訪問外部類內定義的所有成員
9、匿名內部類
在定義匿名內部類的地方直接創建該類的一個對象。往往用於注冊Java組件的事件處理對象
new object(){
....\\內部類的定義
}
嵌套類編譯時文件名:OutterClassName$InnerClassName.class
匿名內部類編譯時文件名:OuterClassName$#.class(#從1開始,往上遞增)
內部類可以使用OuterClassName.this訪問外部類的this
如何創建內部類的對象:
先創建一個外部類對象outref
然后:
OuterClassName.InnerClassName.innerRef = outref.new InnerClassName()