day_16 多态、抽象类、接口

多态

什么是多态

同一个对象,在不同时刻表现出来的不同形态。
我们可以说猫是猫:Cat cat = new Cat();
也可以说猫是动物:Animal cat = new Cat();
这里猫在不同时刻表现出来了不同的形态,就是多态

多态的前提

1. 要有继承/实现关系;
2. 要有方法的重写;
3. 要有父类引用指向子类对象;

多态的特点

需要继承关系
方法重写
父类引用子类对象
public static void main(String[] args){
   
	Animal cat = new Cat();
	Animal Dog = new Dog();
	System.out.println(cat.leg); //2
	System.out.println(dog.leg); //2
	cat.eat();//猫吃鱼
	dog.eat();//狗吃肉
}

多态访问成员变量的特点

在多态中,如果在子类和父类中出现同名的成员变量,则使用的是父类的成员变量
	成员变量的访问:编译看左边,运行看左边
在多态中,如果子类重写了父类的方法。则使用的是子类的方法
	成员方法的访问:编译看左边,运行看右边

如果编译时类型和运行时类型不一致,就出现了对象的多态性

多态情况下的成员方法:

看左边:看的是父类的引用(父类中不具备子类特有的方法)
看右边:看的是子类对象(实际运行的是子类重写父类的方法)
成员变量不具有多态性,只看引用变量所声明的类

使用多态来调用方法 只能调用子类和父类都有的方法(必须存在方法的重写)。而不能调用子类 特有的方法

多态的好处和弊端(记忆)

好处

提高程序的扩展性。定义方法的时候,使用父类作为参数,使用具体的子类型参与操作

弊端

不能使用子类特有的成员
public class Person {
   
    // 人要饲养一只动物  使用父类作为参数  当引用的时候 传入具体所指的真实 子类
    public void  siyang(Animal  animal){
   
        animal.eat();
    }
}
    public static void main(String[] args) {
   
//        Animal a = new Animal();
//        Cat c = new Cat();
        // 父类引用指向子类对象
        Animal cat = new Cat();
        Animal dog = new Dog();
        System.out.println(cat.leg);//2
        System.out.println(dog.leg);//2
        cat.eat();//猫吃鱼
        dog.eat();// 狗吃骨头
        Person person = new Person();
        person.siyang(cat);// 传入真实的所引用的对象
        person.siyang(dog);//传入真实 的所引用的对象
    }

对子类特有成员的访问

// 只有真实的类型对象 才能调用当前子类中特有的 方法
Cat c = new Cat();
Dog d = new Dog();
c.play();
d.work();
// 进行类型转换
Cat  cc = (Cat) cat;
cc.play();
Dog dd = (Dog) dog;
dd.work();

类型转换

类型提升:将父类型的引用  执行子类对象   由小到大   进行自动转换(多态)
造型:将父类型的引用对象  转换为子类型的对象  由大到小  强制转换

	1. 从子类到父类可以自动进行类型转化
	2. 从父类到子类的类型转换必须通过造型实现
	3. 无继承关系的引用类型间的转换是非法的

在类型转换中(造型)

Dog dog1 = (Dog) cat;
dog1.work();

在这里插入图片描述

类型转换异常

如何解决类型转换异常的出现:

instanceof:判断一个引用是否是某一个类的实例对象
if(cat instanceof Dog){
   
	Dog dog1 = (Dog)cat;
	dog1.work();
}else{
   
	System.out.print("类型不匹配");
}

方法的重载与重写

重载,是指允许存在多个同名方法,而这些方法的参数不同。 编译器根据方法不同的参数表, 对同名方法的名称做修饰。对于编译器而言,这些同名方法就成了不同的方法。 它们的调用地址在编译期就绑定了。 Java的重载是可以包括父类和子类的,即子类可以重载父类的同名不同参数的方法。所以: 对于重载而言,在方法调用之前,编译器就已经确定了所要调用的方法,这称为 “早绑定” 或 “静态绑定”

而对于多态,只有等到方法调用的那一刻, 解释运行器才会确定所要调用的具体方法,这称为 “晚绑定”“动态绑定”

案例:计算图形面积

定义三个类,父类GeometricObject代表几何形状,子类Circle代表圆形, MyRectangle代表矩形。
定义一个测试类GeometricTest, 编写equalsArea方法测试两个对象的面积是否相等(注意方法的参数类型,利用动态绑定技术),编写displayGeometricObject方法显示对象的面积(注意方法的参数类型,利用动态绑定技术)。

package cn.lanqiao.work;

public class GeometricObject {
   
    protected  String color;
    protected  double weitht;

    public GeometricObject(String color, double weitht) {
   
        this.color = color;
        this.weitht = weitht;
    }

    public String getColor() {
   
        return color;
    }

    public void setColor(String color) {
   
        this.color = color;
    }

    public double getWeitht
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值