父类:
public class Animal {
public void eat(){
System.out.println("吃");
}
public void run(){
System.out.println("跑");
}
public void sleep(){
System.out.println("睡");
}
public void show(){
System.out.println("hello");
}
}
子类:
package com.hspedu.ploy_.ployDetail;
public class Cat extends Animal{
public void eat(){
System.out.println("猫吃鱼");
}
public void Mouse(){
System.out.println("猫捉老鼠");
}
}
主方法及使用细节
public class ployDetail { public static void main(String[] args) { //向上转型,父类的引用指向了子类的对象 Animal animal = new Cat(); // 可以调用父类的所有成员(需要遵守访问规则) // 但是不能调用子类特有的成员,因为在编译阶段,能调用哪些成员,是由编译器决定的 // 例如, animal.Mouse(); 报错 // 最终运行的效果,要看子类的具体实现 animal.eat(); // 父类中有eat方法,但是子类中具体实现的eat方法为输出 猫吃鱼。 animal.run(); animal.sleep(); animal.show(); // 希望可以引用子类特有的成员 // 通过多态的 向下转型 // 语法: 子类类型 名字 = (子类类型)父类引用名 Cat cat = (Cat) animal; // 个人理解:对子类创建一个新的引用,然后将父类引用强制转换成子类类型 // 强制转换的类型,必须是父类的引用指向的类型 // 例如,上面创建animal时,指向的是Cat,因此可以转换成Cat进行向下转型 // 但是要把animal 转换成 Dog类型是错误的, Dog dog = (Dog) animal; 错误 cat.Mouse(); } }