Java面向对象之多态

Java学习ing,整理一些知识,希望对大家有所帮助,也请大佬多多指教!

一、多态描述

多态概述 : 同一操作作用于不同对象,可以产生不同的执行结果。
例子:父类:宠物类
叫()
子类:
猫 叫()-----喵喵喵
狗 叫()-----汪汪汪
都是叫,但产生了不同的结果
多态前提:
1、继承
2、方法的重写
多态实现:
父类 对象名 = new 子类();

public class DuoTaiDemo {
    public static void main(String[] args) {
        //多态
        Pets pets = new Cat();
        pets.voice();//喵喵喵

        Pets pets1 = new Dog();
        pets1.voice();//汪汪汪
    }
}
//父类
class Pets{
    public void voice(){
        System.out.println("发出叫声");
    }
}
//子类
class Dog extends Pets{
    public void voice(){
        System.out.println("汪汪汪");
    }
}

class Cat extends Pets{
    public void voice(){
        System.out.println("喵喵喵");
    }
}

二、多态成员的访问特点

1、成员变量
编译看父类(左边),运行看父类(左边)

public class DuoTaiDemo2 {
    public static void main(String[] args) {
        Fu1 fu1 = new Zi1();
       System.out.println(fu1.num);//10
class Fu1{
    //成员变量
    public int num = 10;
   }
class Zi1 extends Fu1{
    public int num = 20;
}

2、成员方法
编译看父类(左边),运行看子类(右边)

public class DuoTaiDemo2 {
    public static void main(String[] args) {
        Fu1 fu1 = new Zi1();
        fu1.method();//Zi method(),运行的结果为子类方法的结果
        //而调用子类单独的方法就会报错
        //fu1.method2();报错
    }
}
//父类
class Fu1{
       //成员方法
    public void method(){
        System.out.println("Fu method()");
    }
//子类
class Zi1 extends Fu1{
       //成员方法
    public void method(){
        System.out.println("Zi method()");
    }
    public void method2(){
    System.out.println("Fu method2()");   
    }
}

3、static方法
编译看父类(左边),运行看父类(左边)

public class DuoTaiDemo2 {
    public static void main(String[] args) {
        Fu1 fu1 = new Zi1();
        Fu1.staticMethod();//Fu staticMethed()
}
class Fu1{
    public static void staticMethod(){
        System.out.println("Fu staticMethod()");
    }
}
class Zi1 extends Fu1{
    public static void staticMethod(){
        System.out.println("Zi staticMethod()");
    }
}

三、多态的优缺点

1、多态的优点
提高了代码的维护性(由继承来保证);
提高了代码的扩展性(由多态来保证)
2、多态的缺点
不能访问子类特有的功能,所以如果要访问子类特有功能,就要用到多态中的转型。
向上转型:由父到子,父类的引用指向子类的对象
父类 引用名 = new 子类();
向下转型:由父到子,父类的引用转换为子类引用
子类 引用名 = (子类)父类引用

public class DuoTaiDemo5 {
    public static void main(String[] args) {
        Pet5 pet5 = new Dog5();
        pet5.eat();
        pet5.sleep();
        Dog5 dog5 = (Dog5) pet5;
        dog5.dogMethod();//调用狗类特有的方法,吃骨头

        Pet5 pet51 = new Cat5();
        pet51.eat();
        pet51.sleep();
        Cat5 cat5 = (Cat5) pet51;
        cat5.catMethod();//调用猫类特有的方法,吃鱼
    }
}
class Pet5{
    public void eat(){
        System.out.println("吃东西");
    }
    public void sleep(){
        System.out.println("睡觉");
    }
}
class Dog5 extends Pet5{
    public void dogMethod(){
        System.out.println("吃骨头");
    }
}
class Cat5 extends Pet5{
    public void catMethod(){
        System.out.println("吃鱼");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值