多態:將父類引用指向子類對象
是通過子類重寫父類的方法實現
通過多態,可以將子類對象定義爲父類類型,如果子類沒有進行方法重寫,則默認調用父類方法。
否則調用子類重寫父類方法。
也就是說,如果在子類中沒有重寫父類的方法,則不能使用子類的方法。
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("小貓吃魚");
}
}
運行結果爲: