面向对象(关于多态)

多态
1.什么是多态?
某一事物,在不同时刻表现出来的不同状态。
举例:
Cat c = new Cat();
Animal a = new Cat();
猫可以是猫类型。猫 m = new 猫();
同时猫也是一种动物, 动物 d = new 猫();
定义一个变量,这个变量属于父类,却指向子类。
2.多态的前提
a.要有继承关系
b.要有方法重写。没有方法重写就没有意义
c.要有父类引用指向子类对象
父 f = new 子();
3.多态的好处
a.提高了代码的维护性(继承保护)
b.提高了代码的扩展性(由多态保证)
4.多态的弊端
a.不能使用子类特有的功能
b.如何解决这个问题?
向下转型:即把父类的引用强制转换为子类的引用。
5.例题
(1)什么是多态?
package hcn9;
public class Fu {
public void show() {
System.out.println(“fu show”);
}
}

package hcn9;
public class Zi extends Fu {
public void show() {
System.out.println(“zi show”);
}
public void method() {
System.out.println(“zi method”);
}
}

package hcn9;
public class MyText {
public static void main(String[] args){
Zi f = new Zi(); //
Fu a = f; //这两条语句等价于下一条语句
// Fu f = new Zi();
((Zi) a).method(); //向下转型,父类引用转成子类引用,这样才可以调用子类独有的方法
a.show();
}
}

运行结果为:
zi method
zi show

(2)孔子装爹
孔子爹,是一个高级讲师,会讲授java,李四闻名而来,请孔子爹到家里给他将java
就留孔子一个人在家,这时候张三也来让孔子爹来讲java 孔子爹这时候不在家,那孔子又不想失去这个学生
所以孔子,假扮成他爹,给张三 讲论语
讲完之后,孔子好累,去玩王者荣耀

public class MyTest {
public static void main(String[] args) {
孔子爹 坑爹 = new 孔子();
System.out.println(坑爹.age);
坑爹.teache();
孔子 k = (孔子) 坑爹; //向下转型
System.out.println(k.age);
k.playGame();
}
}

class 孔子爹 {
int age = 60;
public void teache() {
System.out.println(“讲授java”);
}
}

class 孔子 extends 孔子爹 {
int age = 30;
@Override
public void teache() {
System.out.println(“讲授论语”);
}
public void playGame() {
System.out.println(“玩王者荣耀”);
}
}

运行结果为:
60
讲授论语
30
玩王者荣耀

(3).动物例题

package hcn10;
public class MyText {
public static void main(String[] args) {
Cat cat = new Cat();
Animal an=cat; //多态就是向上转型
an.eat();
// an.cacheMouse(); 此句报错,因为an属于Animal,而Animal中没有cacheMouse方法
Cat c= (Cat) an; //向下转型
c.eat();
c.cacheMouse();
System.out.println("----------");
Animal d = new Dog();
// an=dog;
Dog dog= (Dog) d; //向下转型
dog.lookDoor();
d.eat();
an=new Tiger();
Tiger t= (Tiger) an;
//ClassCastException 类型转换异常
t.goSwimming();
}
}

class Animal{
public void eat(){
System.out.println(“吃饭”);
}
}

class Cat extends Animal{
@Override
public void eat() {
System.out.println(“猫吃鱼”);
}
public void cacheMouse(){
System.out.println(“猫抓老鼠”);
}
}

class Dog extends Animal{
@Override
public void eat() {
System.out.println(“狗吃骨头”);
}
public void lookDoor(){
System.out.println(“狗看门”);
}
}

class Tiger extends Animal{
@Override
public void eat() {
System.out.println(“老虎不吃素”);
}
public void goSwimming(){
System.out.println(“老虎去游泳”);
}
}

运行结果为:

猫吃鱼
猫吃鱼
猫抓老鼠


狗看门
狗吃骨头
老虎去游泳

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值