复习之java基础---->多态:向上转型

本文深入浅出地介绍了Java中的多态概念,通过具体代码示例解释了向上转型、方法覆盖等核心知识点,并展示了多态在不同场景下的应用。

1.什么是多态,什么是向上转型

java的多态:允许将子类变量赋值给父类对象(参考百度百科)

向上转型:父类对象引用了子类变量(和多态一个意思的)


2.不知道我在说什么?请看以下代码

father f=new son();  (father指的是父类 son指的是子类)


3.作用是啥?

父类可以调用子类中覆盖父类的方法.


4.听不懂我在说什么?

看代码!

一.

package try1;

父类
class father{
    public father() {
        System.out.println("我是爸爸");
    }
    public String name="林世杰";
    public String age="30岁";
    public void money() {
        System.out.println("老爸身家10元");
    }
    public void caharacter() {
        System.out.println("勤劳刻苦");

    }
    
}


子类

class son extends father{
    public son() {
        System.out.println("我是儿子 ");
    }
    
    public String name="林困困";
    public String age="15";
    @Override//这个是一个mark annotation类型,用作标注方法.说明了被他标注的方法是已经重载了父类中的方法,(重载仅限于方法当中,属性不存在重载),并起到断言作用.当我们视图覆盖父类方法时却又写错了方法名,此时由于@override的存在,方法名会报错.
    public void money() {
        System.out.println("儿子身家100元");
    }
    public void bycar() {
        System.out.println("儿子有汽车");
    }
}


测试类
public class one{
    
    public static void  money(father f1) {
        f1.money();
    }
    public static void main(String[] args) {
        //我给出两组(以money为例:因为money是被子类覆盖掉的):
        
        //第一组没有采用向上转型       
        father f=new father();
        f.money();
        //第二组采用了向上转型
        father f1=new son();//这就是向上转型:父类变量引用了子类对象
        f1.money();
    }
}


结果图




第一组没有采用多态:连子类的构造函数都没有输出来

第二组:采用了多态:首先父类的构造和子类的构造都输出来了,而且父类方法变成了被子类覆盖掉的方法.


二.接下来:我只是初始化son类和父类,也没有使用多态看效果!

public class one{
    
    public static void  money(father f1) {
        f1.money();
    }
    public static void main(String[] args) {
        //接下来:我只是初始化son类和父类,也没有使用多态看效果!
        
        //第一组没有采用向上转型       
        System.out.println("第一组结果:");
        son s=new son();
        s.money();
        
        System.out.println("----------分割线------------");
        //第二组采用了向上转型
        System.out.println("第二组结果:");
        father f1=new son();//这就是向上转型:父类变量引用了子类对象
        f1.money();
    }
}


结果是和使用了多态一样的效果.但是单纯使用子类实例化比使用多态的功能更多:比如子类本身拥有的单独方法和属性


三,另外还有人这么使用多态

   将拥有返回值的静态方法中放入父类对象,在输出的时候放入子类对象,结果也是一个多态表现

  看一下代码:   我为上述例子爸爸类添加了身高,妻子;但设定儿子有身高方法,没有妻子(即没有妻子方法)------>子类中覆盖了父类方法和没有覆盖父类方法的区别

package try1

class father{
    public father() {
        System.out.println("我是爸爸");
    }
    public String name="林世杰";
    public String age="30岁";
    public void money() {
        System.out.println("老爸身家10元");
    }
    public void character() {
        System.out.println("勤劳刻苦");
    }
    public void hight() {
        System.out.println("老爸身高1.75m");
    }
    public void wife() {
        System.out.println("老爸有个漂亮的老妈");

    }
}
class son extends father{
    public son() {
        System.out.println("我是儿子 ");
    }
    
    public String name="林困困";
    public String age="15";
    @Override
    public void money() {
        System.out.println("儿子身家100元");
    }
    @Override
    public void character() {
        System.out.println("勤劳刻苦+聪明能干");
    }
    @Override
    public void hight() {
        System.out.println("儿子身高1.8m");
    }
    public void nowife() {
        System.out.println("还是条单身狗");

    }
}


运行类
public class one{
    
    public static void  money(father f1) {//此处用静态方法引入父类对象
        f1.money();
        f1.character();
        f1.hight();
        f1.wife();//儿子是单身狗没有wife
    }
    public static void main(String[] args) {
        son s=new son();
        money(s);//此处用子类变量替代父类对象,以达到多态效果
    }
}


结果图:


结果确实达到了多态方法效果,如果你还没有看明白,我再给你一次对比效果:使用一次显示多态和这个静态方法引用多态做一个对比


测试类
public class one{
    
    public static void  money(father f1) {
        f1.money();
        f1.character();
        f1.hight();
        f1.wife();//儿子是单身狗没有wife
    }
    public static void main(String[] args) {
        son s=new son();
        money(s);
        System.out.println("--------分割线---------");
        //使用一次显示的多态
        father f1=new son();
        f1.character();
        f1.hight();
        f1.wife();//儿子是单身狗没有wife
    }
}


结果图


你看:参数中引用父类对象,实际应用中放入子类变量却也是一种多态.


四.总结:总之记住一句话:父类变量引用子类对象就是一种多态. (引用百度百科的原话:简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针)



今天的多态学习到此!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值