Java学习——多态02(向上转型)

向上转型——查看方法  

先创建两个类:

        一个动物类,有属性/方法

public class Animal {
String name = "动物";
int age = 10;
public void sleep(){
    System.out.println("睡");
}
public void run(){
    System.out.println("跑");
}
public void eat(){
    System.out.println("吃");
}
public void show(){
    System.out.println("hello,你好");
}
}

        一个猫类,有方法

public class Cat extends Animal {
public void eat(){//方法重写
    System.out.println("猫吃鱼");
}
public void catchMouse(){//Cat 特有方法
    System.out.println("猫抓老鼠");
}
}

在创建一个测试类:

public class PolyDetail {
public static void main(String[] args) {
//向上转型: 父类的引用指向了子类的对象
//语法:父类类型引用名 = new 子类类型();
Animal animal = new Cat();
Object obj = new Cat();//可以吗? 可以 Object 也是 Cat 的父类
//向上转型调用方法的规则如下:
//(1)可以调用父类中的所有成员(需遵守访问权限)
//(2)但是不能调用子类的特有的成员
//(#)因为在编译阶段,能调用哪些成员,是由编译类型来决定的
//animal.catchMouse();错误
//(4)最终运行效果看子类(运行类型)的具体实现, 即调用方法时,按照从子类(运行类型)开始查找方法
//,然后调用,规则我前面我们讲的方法调用规则一致。
animal.eat();//猫吃鱼..
animal.run();//跑
animal.show();//hello,你好
animal.sleep();//睡

}
}

错误原因,该方法是在子类里面有,但是先编译的是父类,可以理解为会先去父类里面查找 catchMouse方法,父类里面没有,就在编译这关过不了,所以不行。

//animal.catchMouse();错误

没有运行父类的eat()是因为,到了运行阶段,是Cat(),所以会先从子类开始依次向父类开始,查找有无此方法。如果有,就用该类方法,如果在子类直接找到,则直接使用。

animal.eat();//猫吃鱼..

向上转型——查看属性 

假使创建一个随机类

public class Mian {
    public static void main(String[] args) {
        One one = new Two();
        System.out.println(one.count); //此时打印的是10
        
    }
}




public class One{
    int count  = 10;
}

public class Two {
    int count = 20;
}

根据上面的问题,为什么不是打印20,而是10,因为属性是没有重写这说的。

所以当编译类型是上面,那么这时候的向上转型就会打印编译类型的属性

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值