多态性的向上转型和向下转型

向上转型:

即声明为父类,实际运行时为子类。

若调用对象pet,实例变量是Pet类的。

而调用方法时,运行Dog类重写后的方法,局部变量也是Dog类的。

不能调用父类没有的方法。
//向上转型
        Pet pet = new Dog();
        //调用变量:
        System.out.println(pet.nickname);//小黑
        pet.setNickname("小白");
        System.out.println(pet.nickname);//小白
        //调用方法:
        System.out.println(pet.getNickname());//xiaobai
        pet.eat();//狗子xiaobai啃骨头
        // pet.watchHouse();//不能调用父类没有的方法 watchHouse
 

向下转型(向上后的逆变换):

调用对象d,实例变量都是Dog子类的。

若get方法没有在子类重写,则父类方法返回的局部变量来自父类。

若get方法已重写,则局部变量来自子类。

若set方法重写了,实例变量才改;否则仍来自Dog子类。

*若pet2运行时非Dog(),则报错ClassCastException

        Pet pet2 = new Dog();//多态后
        //向下转型
        Dog d = (Dog) pet2;
        System.out.println(d.nickname);//xiaobai
        System.out.println(d.getNickname());//xiaobai 若不重写则小黑

        d.setNickname("maomao");
        System.out.println(d.nickname);//maomao 若set不重写则xiaobai
        System.out.println(d.getNickname());//maomao 若get重写,set不重写,则xiaobai
        d.eat();//狗子maomao啃骨头
        d.watchHouse();//看家

完整代码:

package test;


class Pet {
    public String nickname = "小黑"; //昵称

    public String getNickname() {
        return this.nickname;
    }

    public void setNickname(String nickname) {
        this.nickname = nickname;
    }

    public void eat() {
        System.out.println(nickname + "吃东西");
    }
}


class Dog extends Pet {
    //子类重写父类的方法
    public String nickname = "xiaobai"; //昵称

    @Override
    public void eat() {
        System.out.println("狗子" + getNickname() + "啃骨头");
    }

    @Override
    public String getNickname() {
        return this.nickname;
    }

    @Override
    public void setNickname(String nickname) {
        this.nickname = nickname;
    }

    //子类扩展的方法
    public void watchHouse() {
        System.out.println("看家");
    }
}

public class Test {
    public static void main(String[] args) {
        //向上转型
        Pet pet = new Dog();
        //调用变量:
        System.out.println(pet.nickname);//小黑
        pet.setNickname("小白");
        System.out.println(pet.nickname);//小白
        //调用方法:
        System.out.println(pet.getNickname());//xiaobai
        pet.eat();//狗子xiaobai啃骨头
        // pet.watchHouse();//不能调用父类没有的方法 watchHouse

        System.out.println();
        Pet pet2 = new Dog();//多态后
        //向下转型
        Dog d = (Dog) pet2;
        System.out.println(d.nickname);//xiaobai
        System.out.println(d.getNickname());//xiaobai 若不重写则小黑

        d.setNickname("maomao");
        System.out.println(d.nickname);//maomao 若不重写则xiaobai
        System.out.println(d.getNickname());//maomao
        d.eat();//狗子maomao啃骨头
        d.watchHouse();//看家
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
向上转型是指将一个子类对象赋值给父类类型的变量,通过向上转型可以实现继承的多态性多态性是指同一类型的对象在不同情况下表现出不同的行为。在向上转型中,父类对象可以引用子类对象,但只能调用父类中定义的方法和属性。这样做的好处是可以提高代码的灵活性和可复用性。通过向上转型,可以实现对父类对象的统一管理,只需要一个父类类型的引用变量就可以操作不同子类的对象,这样可以避免编写大量重复的代码。同时,向上转型还可以实现动态绑定,即在运行时根据对象的实际类型来确定调用哪个类的方法。这样可以实现不同子类的不同行为,提高了程序的扩展性和可维护性。因此,继承的多态性通过向上转型可以实现动态绑定和统一管理不同子类对象的优势。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [从向上转型走进java多态性](https://blog.csdn.net/daocaowuwu/article/details/121713221)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [Day10 Java多态性继承关系中'向上转型'和'向下转型(还原)'的演示例子与作用及规则的详解.](https://blog.csdn.net/chinatopno1/article/details/103376577)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值