您的位置:首页 > 编程语言 > Java开发

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

2017-02-24 10:49 302 查看
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类和父类,也没有使用多态看效果!

        

        //第一组没有采用向上转型       
4000

        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

    }

}

结果图



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

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

今天的多态学习到此!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: