1. 程式人生 > >java中類的多型

java中類的多型

多型:將父類引用指向子類物件

是通過子類重寫父類的方法實現

通過多型,可以將子類物件定義為父類型別,如果子類沒有進行方法重寫,則預設呼叫父類方法。

否則呼叫子類重寫父類方法。

也就是說,如果在子類中沒有重寫父類的方法,則不能使用子類的方法。

package myMoreState;

public class MoreState {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Animal ani1=new Dog();
		ani1.eat();
		System.out.println("11111");
	}

}
class Animal{
	String name;
	int age;
	public void eat() {
		System.out.println("這是Animal的吃的方法");
	}
}

class Dog extends Animal{
	String color;
//	@Override //重寫
//	public void eat() {
//		System.out.println("這個是Dog的吃的方法");
//	}
}

輸出結果為:

這是Animal的吃的方法
11111

如果將父類中的eat()方法改為靜態的,則子類eat()方法不能被重寫。所以也不能進行多型。

多型後的物件不能直接呼叫子類自己的靜態方法,可以呼叫父類中的靜態方法,但是會被提示警告。

static方法不能被重寫,所以無法進行多型。

如果想要判斷多型後的物件到底是哪個類的例項:使用instanceof關鍵字

使用如下:

package myMoreState;

public class MoreState {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
//		Animal ani1=new Dog();
//		ani1.eat();
//		System.out.println("");
		
		Animal ani =new Dog();
		MoreState more=new MoreState();
		more.isDog(ani);
	}
	public void isDog(Animal ani) {
		if(ani instanceof Dog) {
			Dog dog=(Dog)ani;
			dog.eat();
			System.out.println("這是一個轉換的方法");
		}
	}

}
class Animal{
	String name;
	int age;
	public void eat() {
		System.out.println("這是Animal的吃的方法");
	}
}

class Dog extends Animal{
	String color;
	@Override //重寫
	public void eat() {
		System.out.println("這個是Dog的吃的方法");
	}
}

執行結果為:

這個是Dog的吃的方法
這是一個轉換的方法

使用instanceof可以減少程式碼量,但是並不完整。

下面有另一種判斷的方法

package myMoreState;

public class MoreState {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
//		Animal ani1=new Dog();
//		ani1.eat();
//		System.out.println("");
		
		Animal ani =new Dog();
		Animal ani1=new Cat();
		ani.name="嘯天";
		ani1.name="小花";
		MoreState more=new MoreState();
		more.isDog(ani);
		isDog1(ani);
		isDog1(ani1);
	}
	public void isDog(Animal ani) {
		if(ani instanceof Dog) {
			Dog dog=(Dog)ani;
			dog.eat();
			System.out.println("這是一個轉換的方法");
		}
	}
	public static void isDog1(Animal ani) {
		if(ani.getClass().getName().equals(Dog.class.getName())) {
			//此處的強制轉換為向下轉換
		Dog dog=(Dog)ani;
		System.out.println(dog.name+"is Dog");
	}else {
		System.out.println(ani.name+"is not Dog");
	}
	}

}
class Animal{
	String name;
	int age;
	public void eat() {
		System.out.println("這是Animal的吃的方法");
	}
}

class Dog extends Animal{
	String color;
	@Override 
	public void eat() {
		System.out.println("這個是Dog的吃的方法");
	}
}
class Cat extends Animal{
	String color;
	public void eat() {
		System.out.println("小貓吃魚");
	}
}

執行結果為: