java面向对象--多态

多态:

多态

1. 概念

多态是同一个行为具有多个不同表现形式或形态的能力。

举例:			Cat c=new Cat();
				Animal a=new Cat();
	猫可以是猫的类型。猫 m = new 猫();
	同时猫也是动物的一种,也可以把猫称为动物。动物 d = new 猫();
public class MyTest {
    public static void main(String[] args) {
    Animal an = new Dog();
        an.eat();
        an=new Cat();
        an.eat();
    }
}

class Animal{
    public void eat(){
        System.out.println("吃饭");
    }
}
class Cat extends Animal{
    public void eat() {
        System.out.println("吃小鱼干");
    }
}
class Dog extends Animal{
    public void eat() {
        System.out.println("狗吃骨头");
    }
}

2.多态的前提

  1. 多态的前提:要有继承,如果没有继承,那多态也无从谈起
  2. 多态要有方法重写,当然不重写,语法上来说,不报错,但是多态的存在就没有意义
  3. 父类引用指向子类对象:父 f = new 子();

3.多态成员访问特点

a:成员变量
	编译看左边,运行看左边。
b:构造方法
	创建子类对象的时候,会访问父类的构造方法,对父类的数据进行初始化。
c:成员方法
	编译看左边,运行看右边。
d:静态方法
	编译看左边,运行看左边。
	(静态和类相关,算不上重写,所以,访问还是左边的)
public class MyTest {
    public static void main(String[] args) {
     // Zi zi = new Zi();
        //  System.out.println(zi.num);
        //  zi.fuShow();
        //多态的形式访问成员变量的特点
        //多态的形式访问成员变量:编译看左边,运行看左边
        Fu fu = new Zi();
        System.out.println(fu.num);
        //多态的形式访问成员方法的特点:编译看左边,运行看右边 (子类重写了父类的方法)
        fu.fuShow();
        //静态方法:不参与重写
        fu.fuShow2();
        Fu.fuShow2();
        Zi.fuShow2();
    }
}
    class Fu {
    int num = 100;
    public void fuShow() {
        System.out.println("fu show");
    }
    public static void fuShow2() {
        System.out.println("fu 静态 show");
    }
}
class Zi extends Fu {
    int num = 200;
    public void fuShow() {
        System.out.println("zi show");
    }
    public static void fuShow2() {
        System.out.println("zi 静态 show");
    }
}

4.多态的好处

a:提高了代码的维护性(继承保证)
b:提高了代码的扩展性(由多态保证) 

5.多态的弊端和改进

弊端:不能使用子类特有的功能
解决方法:把父类的引用强制转换为子类的引用。(向下转型)

public class MyTest {
    public static void main(String[] args) {
    Student student1 = (Student) person;//向下转型
        student1.playGame();    
    }
}

class Person {
    public void eat() {
        System.out.println("吃饭");
    }
}
class Student extends Person {
    public void eat() {
        System.out.println("学生爱吃米饭");
    }
    public void playGame() {
        System.out.println("学生爱玩游戏");
    }
}

今天的学习到这里就结束啦~
I figure life’s a gift,and i don’t intend on wasting it.
我觉得人生是礼物,我不想白白浪费
—《泰坦尼克号》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值