理解繼承是理解面向對象程序設計的關鍵.在Java中,通過關鍵字extends繼承一個已有的類,被繼承的類稱為父類(超類,基類),新的類稱為子類(派生類).在Java中不允許多繼承.code:
class Animal
{
?int height,weight;
?void eat()
?{
? System.out.println("Animal eat!");
?}
?void sleep()
?{
? System.out.println("Animal sleep!");
?}
?void breathe()
?{
? System.out.println("Animal breathe!");
?}
}
class Fish extends Animal
{
?
}
class DoMain
{
?public static void main(String[] args)
?{
? Animal an=new Animal();
? Fish fn=new Fish();
?
? an.breathe();
? fn.breathe();
? fn.height=30;
? fn.weight=20;
?}
}
Result:
F:\Java Develop>javac Animal.java
F:\Java Develop>java DoMain
Animal breathe!
Animal breathe!
(這說明派生類繼承了父類的所有方法和成員變量.)
方法的覆蓋(override)
在子類中定義一個與父類同名,返回類型,參數類型均相同的一個方法,稱為方法的覆蓋,方法的覆蓋發生在子類與父類之間.
code:
class Animal
{
?int height,weight;
?void eat()
?{
? System.out.println("Animal eat!");
?}
?void sleep()
?{
? System.out.println("Animal sleep!");
?}
?void breathe()
?{
? System.out.println("Animal breathe!");
?}
}
class Fish extends Animal
{
?int weight,height;?? //隱藏了父類的weight,height;
?void breathe()? //override method breathe()
?{
? super.breathe();? //用super調用父類的構造方法
? System.out.println("Fish bubble");
?}
}
class DoMain
{
?public static void main(String[] args)
?{
?// Animal an=new Animal();
? Fish fn=new Fish();
?
? an.breathe();
? fn.breathe();
? fn.height=30;
? fn.weight=20;
?}
}
輸出結果:
F:\Java Develop>javac Animal.java
F:\Java Develop>java DoMain
Animal breathe!
Fish bubble
特殊變量super
* 使用特殊變量super提供對父類的訪問
* 可以使用super訪問父類被子類隱藏的變量或覆蓋的方法
* 每個子類構造方法的第一條語句都是隱含的調用super,如果父類沒有這種形式的構造函數就會報錯.
code:
class Animal
{
?int height,weight;
?Animal()
?{
? System.out.println("Animal construct");
?}
?void eat()
?{
? System.out.println("Animal eat!");
?}
?void sleep()
?{
? System.out.println("Animal sleep!");
?}
?void breathe()
?{
? System.out.println("Animal breathe!");
?}
}
class Fish extends Animal
{
?Fish()
?{
? System.out.println("Fish construct");
?}
?void breathe()? //override method breathe()
?{
? System.out.println("Fish bubble");
?}
}
class DoMain
{
?public static void main(String[] args)
?{
? //Animal an=new Animal();
? Fish fn=new Fish();
?
? //an.breathe();
? //fn.breathe();
? //fn.height=30;
? //fn.weight=20;
?}
}
輸出結果:
F:\Java Develop>javac Animal.java
F:\Java Develop>java DoMain
Animal construct
Fish construct
?通過覆蓋父類的方法來實現,在運行時根據傳遞對象的引用,來調用相應的方法.
code:
class Animal
{
?int height,weight;
?Animal()
?{
? System.out.println("Animal construct");
?}
?void eat()
?{
? System.out.println("Animal eat!");
?}
?void sleep()
?{
? System.out.println("Animal sleep!");
?}
?void breathe()
?{
? System.out.println("Animal breathe!");
?}
}
class Fish extends Animal
{
?Fish()
?{
? System.out.println("Fish construct");
?}
?void breathe()? //override method breathe()
?{
? System.out.println("Fish bubble");
?}
}
class DoMain
{
?static void fn(Animal an)
?{
? an.breathe();
?}
?public static void main(String[] args)
?{
? //Animal an=new Animal();
? Fish fh=new Fish();
? Animal an;
? an=fh;
? DoMain.fn(an);
?}
}