Java面向对象基础--多态

多态

目录

  • 运算符instanceof的用法

  • 对象的类型转换

  • 多态性

instanceof

  • instanceof运算符

判断一个引用类型的变量所引用的对象是否是一个类的实例

  • 一般形式

引用变量 instanceof 类

代码如下

public class InstanceOf {
    public static void main(String[] args) {
        InstanceOf io = new InstanceOf();
        Student s = new Student();
        //instanceof运算符
        //判断一个对象是不是由这个类型或者该类的父类类型创建的对象
        // 如果是则为true
        System.out.println(io instanceof InstanceOf);
        System.out.println(s instanceof InstanceOf);
        System.out.println(s instanceof Student);
        System.out.println(io instanceof Student);
    }

}
class Student extends InstanceOf{}

对象转型

  • 引用类型变量的类型转换

子类类型和父类类型之间的转换关系

前提:存在继承关系

  • 两种转换方法

    • 向上转型

      • 子类直接或间接给父类赋值

      • 父类类型引用变量指向子类对象

      • 自动转换

    • 向下转型

      • 父类直接或间接给子类赋值

      • 将父类对象强制转换为子类类型

      • 强制类型转换

      • 父类对象必须在子类对象中才可以向下转型 否则运行期报错

  • 可以用父类类型引用变量指向子类对象里的父类对象 但是不能用子类类型引用变量直接指向父类对象

代码如下

public class Father {
    public static void main(String[] args) {
        //对象类型之间也有类型转换 我们称为对象转型
        //对象转型分为两种
        //一种是向上转型
        //一种是向下转型
        //向上转型:子类的对象给父类的引用变量赋值 自动转换
        //实质:子类对象之中的小的父类对象给父类的引用变量赋值
        Father f1 = new Father();
        Son s1 = new Son();
        f1 = s1;
        Father f2 = new Son();
        //向下转型:父类的对象给子类的引用变量赋值 强制转换
        //向下转型必须保证父类对象在子类对象之中才能向下转型
        //要保证父类对象在子类对象之中 只能通过向上转型
        //所以要想保证向下转型好用 必须要先经过向上转型
        Father f3 = new Son();
        Son s3 = new Son();
        s3 = (Son)f3;
//        Father f3 = new Father();
//        Son s3 = new Son();
//        s3 = (Son)f3;
//        Son s4 = (Son)new Father();
    }
}
class Son extends Father{}

多态

  • 多态:同样的消息被不同类型的对象接收时导致不同的行为

  • 必要条件:有继承 有重写 使用父类引用指向子类对象(向上转型)

代码如下

//多态:同样的消息被不同类型的对象接收产生不同的行为
public class Animal {
    public void cry(){
        System.out.println("动物的叫声");
    }

    public static void main(String[] args) {
        //多态使用的条件是
        //1 要有继承
        //2 要有重写
        //3 要有向上转型
        Animal a1 = new Animal();
        Animal a2 = new Cat();
        Animal a3 = new Dog();
        a1.cry();
        a2.cry();
        a3.cry();
    }
}
class Cat extends Animal{
    @Override
    public void cry() {
        System.out.println("喵喵叫");
    }
}
class Dog extends Animal{
    @Override
    public void cry() {
        System.out.println("汪汪叫");
    }
}

方法的绑定

  • 一个引用类型变量声明为父类类型 引用子类对象 变量不能访问子类中独有的属性和方法

  • 方法绑定:建立方法调用和方法体之间的关联

    • 静态绑定:编译时编译器就能准确判断应该调用哪个方法

    • 动态绑定:编译时检查语法 运行时判断所引用对象的实际类型 根据实际类型调用相应的方法

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值