05繼承與多態
一、 繼承條件下的構造方法調用
1、運行 TestInherits.java 示例,觀察輸出,註意總結父類與子類之間構造方法的調用關系修改Parent構造方法的代碼,顯式調用GrandParent的另一個構造函數,註意這句調用代碼是否是第一句,影響重大!
源代碼:
package lianxi7;
class GrandParent
{
public GrandParent()
{
System.out.println("GrandParent Created");
}
public GrandParent(String string)
{
System.out.println("GrandParent Created.String:"+string);
}
}
class Parent extends GrandParent{
public Parent(){
super("sdg");
System.out.println("Parent Created");
}
}
class Child extends Parent{
public Child(){
System.out.println("Child Created");
}
}
public class TestInherits {
public static void main(String[] args) {
// TODO Auto-generated method stub
Child c=new Child();
}
}
實驗結果截圖:
結論:通過 super 調用基類構造方法,必須是子類構造方法中的第一個語句,必須寫在第一個。
2、為什麽子類的構造方法在運行之前,必須調用父類的構造方法?能不能反過來?為什麽不能反過來?
子類是通過父類繼承過來的,所以子類有父類的屬性和方法,如果不調用父類的構造方法,那麽怎麽初始化父類中定義的屬性,即怎麽給父類的屬性分配內存空間
二、神奇的“+”號
註意最後一句,一個字串和一個對象“相加”,得到以下結果:
在“+”運算中,當任何一個對象與一個String對象,連接時,會隱式地調用其toString()方法,默認情況下,此方法返回“類名 @ + hashCode”。為了返回有意義的信息,子類可以重寫toString()方法。
三、請自行編寫代碼測試以下特性: 在子類中,若要調用父類中被覆蓋的方法,可以使用super關鍵字。
源代碼:
class GrandParent
{
public GrandParent()
{
System.out.println("GrandParent Created");
}
public GrandParent(String string)
{
System.out.println("GrandParent Created.String:"+string);
}
}
class Parent extends GrandParent{
public Parent(){
super("sdg");
System.out.println("Parent Created");
}
}
class Child extends Parent{
public Child(){
System.out.println("Child Created");
}
}
public class TestInherits {
public static void main(String[] args) {
// TODO Auto-generated method stub
Child c=new Child();
}
}
實驗截圖為:
未添加super("sdg")之前的結果:
課後作業一:接口多態:使用接口代替抽象基類
一、源代碼
package zoo4;
import java.util.Vector;
public class Zoo2 {
public static void main(String args[]) {
Feeder f = new Feeder("小李");
Vector<Animal> ans = new Vector<Animal>();//可隨時向其中加入或移除對象
//飼養員小李餵養一只獅子
ans.add(new Lion());
//飼養員小李餵養十只猴子
for (int i = 0; i < 10; i++) {
ans.add(new Monkey());
}
//飼養員小李餵養5只鴿子
for (int i = 0; i < 5; i++) {
ans.add(new Pigeon());
}
f.feedAnimals(ans);
}
}
class Feeder {
public String name;
Feeder(String name) {
this.name = name;
}
public void feedAnimals(Vector<Animal> ans) {
for (Animal an : ans) {
an.eat();
}
}
}
interface Animal {
public void eat();
}
class Lion implements Animal {
public void eat() {
System.out.println("我不吃肉誰敢吃肉!");
}
}
class Monkey implements Animal {
public void eat() {
System.out.println("我什麽都吃,尤其喜歡香蕉。");
}
}
class Pigeon implements Animal {
public void eat() {
System.out.println("我要減肥,所以每天只吃一點大米。");
}
}
二、實驗運行截圖
驗證:
①TestInstanceof.java
代碼
public class TestInstanceof
{
public static void main(String[] args)
{
//聲明hello時使用Object類,則hello的編譯類型是Object,Object是所有類的父類
//但hello變量的實際類型是String
Object hello = "Hello";
//String是Object類的子類,所以返回true。
System.out.println("字符串是否是Object類的實例:" + (hello instanceof Object));
//返回true。
System.out.println("字符串是否是String類的實例:" + (hello instanceof String));
//返回false。
System.out.println("字符串是否是Math類的實例:" + (hello instanceof Math));
//String實現了Comparable接口,所以返回true。
System.out.println("字符串是否是Comparable接口的實例:" + (hello instanceof Comparable));
String a = "Hello";
//String類既不是Math類,也不是Math類的父類,所以下面代碼編譯無法通過
//System.out.println("字符串是否是Math類的實例:" + (a instanceof Math));
}
}
運行結果截圖:
②TestCast.java
代碼如下:
class Mammal{}
class Dog extends Mammal {}
class Cat extends Mammal{}
public class TestCast
{
public static void main(String args[])
{
Mammal m;
Dog d=new Dog();
Cat c=new Cat();
m=d;
//d=m;
d=(Dog)m;
//d=c;
//c=(Cat)m;
}
}
運行結果沒有出錯!
③Zoo.java
代碼如下:
package zoo4;
import java.util.Vector;
public class Zoo {
public static void main(String args[]) {
Feeder f = new Feeder("小李");
Vector<Animal> ans = new Vector<Animal>();//可隨時向其中加入或移除對象
//飼養員小李餵養一只獅子
ans.add(new Lion());
//飼養員小李餵養十只猴子
for (int i = 0; i < 10; i++) {
ans.add(new Monkey());
}
//飼養員小李餵養5只鴿子
for (int i = 0; i < 5; i++) {
ans.add(new Pigeon());
}
f.feedAnimals(ans);
}
}
class Feeder {
public String name;
Feeder(String name) {
this.name = name;
}
public void feedAnimals(Vector<Animal> ans) {
for (Animal an : ans) {
an.eat();
}
}
}
abstract class Animal {
public abstract void eat();
}
class Lion extends Animal {
public void eat() {
System.out.println("我不吃肉誰敢吃肉!");
}
}
class Monkey extends Animal {
public void eat() {
System.out.println("我什麽都吃,尤其喜歡香蕉。");
}
}
class Pigeon extends Animal {
public void eat() {
System.out.println("我要減肥,所以每天只吃一點大米。");
}
}
運行結果截圖:
05繼承與多態