当父类引用指向一个子类对象时,便是向上转型。
使用格式:
父类类型 变量名 =new 子类类型();
eg: Animal a = new Cat();
使用格式:
子类类型 变量名 =(子类类型) 父类变量名;
eg: Cat c =(Cat) a;
当使用多态方式调用方法时,首先检查父类中是否有该方法, 即不能调用子类拥有而父类没有的方法,
演示
定义类
public abstract class Animal {
public abstract void eat();
}
class Cat extends Animal{
public void eat(){
System.out.println("吃鱼");
}
public void cacatMouse(){
System.out.println("抓老鼠");
}
}
class Dog extends Animal{
public void eat(){
System.out.println("吃骨头");
}
public void watchhouse(){
System.out.println("看大门");
}
}
测试类
public static void main(String[] args) {
// 向上转型
Animal a =new Cat();
a.eat(); // 调用的是cat的eat
//向下转型
Cat c =(Cat)a;
c.cacatMouse(); // 调用的是cat的方法
// 向上转型
Animal b=new Dog();
b.eat(); // 调用的是dog的eat
//向下转型
Dog d =(Dog) b;
d.watchhouse();// 调用的是dog的方法
}
interface USb {
void open();
void close();
}
// 定义鼠标类
class Mouse implements USb{
public void open(){
System.out.println("鼠标开启,红灯闪一闪");
}
public void close(){
System.out.println("鼠标关闭,红灯熄灭");
}
public void click(){
System.out.println("鼠标点击");
}
}
// 定义键盘类:
class KeyBoard implements USb{
public void open(){
System.out.println("键盘开启,绿灯闪一闪");
}
public void close(){
System.out.println("键盘关闭,绿灯熄灭");
}
public void type(){
System.out.println("键盘打字");
}
}
// 定义笔记本类
class Laptop{
public void run(){
System.out.println("笔记本运行");
}
public void useUSB(USb uSb){
if (uSb !=null){
uSb.open();
if (uSb instanceof Mouse){
Mouse m=(Mouse) uSb;
m.click();
}else if (uSb instanceof KeyBoard){
KeyBoard kb =(KeyBoard) uSb;
kb.type();
}
uSb.close();
}
}
public void shutdown(){
System.out.println("笔记本关闭");
}
}
// 测试类
public class Test{
public static void main(String[] args) {
Laptop lt =new Laptop();
lt.run();
USb u =new Mouse();
lt.useUSB(u);
KeyBoard kb =new KeyBoard();
lt.useUSB(kb);
lt.shutdown();
}
}
原文:https://www.cnblogs.com/yuanjian-work/p/13757315.html