设Animal(动物)是超类 ,Dog(狗)是子类
一. 可以将一个子类对象赋给超类变量
写法一:
Animal animal=new Animal();
Dog dog= new Dog();
animal = dog; //(boss是子类) 注意赋值是右传左
写法二:
Animal animal = new Dog();
二. 然而不能将超类的引用赋值给子类变量
Dog dog= new Animal();
所有狗都是动物,但动物并不一定是狗。
三.例子:
Animal animal = new Dog();
animal 将直接调用父类的方法,当然如果子类重写了父类的方法,那么调用的就是子类的方法!
这条语句的好处是有多个子类时,不用每个子类去写一个相同方法,直接父类中写一个就行了。
坏处就是animal 不能调用子类中有而父类中没有的方法(即子类特有的方法)
那么应该怎么办呢?向下转型
Animal animal=new Dog();
animal.eat(); //子类重写
animal.wangwang(); //父类独有
/*判断是否可以转型*/
if (animal instanceof Dog){
System.out.println(true);
//animal向下转型为dog
Dog dog = (Dog)animal;
dog.game(); //子类独有
dog.eat(); //子类重写
}
用这个dog 对象去调用子类特有的方法!!!
当子类对象调用重写的方法时,调用的是子类的方法,而不是父类中被子类重写的方法。
要想调用父类中被子类重写的方法,则必须使用关键字 super。
public class Animal {
public String name = "小白";
public void eat() {
System.out.println("动物吃饭");
}
public void wangwang() {
System.out.println("动物叫");
}
}
public class Dog extends Animal{
public int age = 20;
@Override
public void eat() {
System.out.println("小狗吃饭");
}
//特有
public void game() {
System.out.println("小狗玩游戏");
}
public void fathereat() {
super.eat();
}
public static void main(String[] args) {
Animal animal=new Dog();
System.out.println(animal.name);
// System.out.println(animal.age);
animal.eat(); //子类重写
animal.wangwang(); //父类独有
/*判断是否可以转型*/
if (animal instanceof Dog){
System.out.println(true);
//animal向下转型为dog
Dog dog = (Dog)animal;
dog.game(); //子类独有
dog.eat(); //子类重写
dog.fathereat();//使用super调用父类eat
System.out.println(dog.age);
System.out.println(dog.name);
}
}
}