Java向上/向下类型转换问题、关于所有事情都在类中完成的思考

本文详细解析了Java作为纯面向对象语言的特点,介绍了其封装特性的应用,并通过具体实例讲解了向上转型和向下转型的概念及操作方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为什么Java所有事情都要在类中完成?

其实这很简单,因为Java是纯面向对象语言(oop),所有对象都是由类封装起来的,这也是面向对象很重要的封装特性。至于之前学过的比如C++语言,它并不是纯面向对象,所以可以看到比如它的main方法不是在类中完成

Java向上转型、向下转型

1、向上转型

将子类对象转化为父类对象

Animal t = new Dog();
父类Animal
package com.xxxx;

public class Animal {
    //睡觉方法
    public void sleep() {
        System.out.println("Animal sleep");
    }

    //吃方法
    public void eat() {
        System.out.println("Animal eat");
    }
}
子类Dog
package com.xxxx;

public class Dog extends Animal {
    //睡觉方法
    public void sleep() {
        System.out.println("Dog sleep");
    }

    //玩方法
    public void play() {
        System.out.println("Dog play");
    }
}
启动类
package com.xxxx;

public class main {

    public static void main(String[] args) {
        //向上转型
        Animal t=new Dog();
        t.sleep();//子类的sleep
        t.eat();//父类的eat
    }

}

这里写图片描述

此时子类对象Dog转化为父类对象Animal,这时t这个引用调用的方法是子类方法

注意:向上转型时,子类单独定义的方法会丢失,比如Dog类的play方法无法访问了
package com.xxxx;

public class main {

    public static void main(String[] args) {
        //向上转型
        Animal t=new Dog();
        t.sleep();//子类的sleep
        t.eat();//父类的eat
        t.play();
    }

}

这里写图片描述

注意:子类引用不能指向父类对象
Dog t = (Dog)new Animal()//报错  
向上转型好处:
  • 减少重复代码

    比如很多动物都会睡觉,不用向上转型的话,就要每个动物都写睡觉的方法

    public void sleep(Cat c){
    c.sleep();
    }

    public void sleep(Dog d){
    d.sleep();
    }

    sleep(new Cat());
    sleep(new Cat());
    sleep(new Dog());

而使用向上转型,则不需要每个动物都写睡觉方法

public void sleep(Animal a){
    a.sleep();
}

sleep(new Cat());
sleep(new Cat());
sleep(new Dog());

向下转型

把父类对象转为子类对象

Animal t = new Dog();
Dog g = Dog(t);
启动类
package com.xxxx;

public class main {

    public static void main(String[] args) {
        //向下转型
        Animal t = new Dog();
        Dog g = (Dog)t;

        g.eat();
        g.sleep();
        g.play();
    }

}

这里写图片描述

可以看出,向下转型前提是:父类对象指向子类对象,所以得先向上转型

下面是一个案例感觉类型转换instanceof

public void eat(Animal a){
    if(a instanceof Dog){  
        Dog d = (Dog)a;
        d.eat();
        d.run();    
    } 
    if(a instanceof Cat){  
        Cat c = (Cat)a;
        c.eat();
        c.run();
    } 
    a.eat();//其他动物只会吃
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值