java | 多态

1.多态(多种状态)基本介绍

方法或对象具有多种形态,是面向对象的第三大特征,多态是建立在封装和继承的基础上的

2.多态的具体实现

1)方法的多态

A a=new A();//方法重载体现多态
//这里我们传入不同的参数,就会调用不同的sum方法,就体现出多态
System.out.println(a.sum(10,20));
System.out.println(a.sum(10,20,30));
B b=new B();//方法重写体现多态
a.say();
b.say();

2)对象的多态

(重要!)

  • 一个对象的编译类型和运行类型可以不一致

Animal animaI=new Dog();  [animal编译类型是Animal,运行类型是Dog]

  • 编译类型在定义对象时,就确定了,不能改变
  • 运行类型是可以改变的

animal=new Cat(); [animal的运行类型变成了Cat,编译类型依然是Animal]

  • 编译类型看定义时=的左边,运行类型看=的右边

3.多态的注意事项和细节

多态的前提:两个对象(类)存在继承关系

  • 多态的向上转型:

1)本质:父类的引用指向了子类的对象

2)语法:父类类型   引用名 = new 子类对象();

3)特点:编译类型看左边,运行类型看右边。可以调用父类中的所有成员(需遵守访问权限)。不能调用子类中的特有成员;最终运行结果看子类中的具体实现。 

  • 多态的向下转型:

Cat cat=(Cat)animal;

1)语法:子类类型  引用名 = (子类类型) 父类引用

2)只能强转父类的引用,不能强转父类的对象

3)要求父类的引用必须指向的是当前目标类型的对象

4)可以调用子类类型中的所有成员

  • 属性没有重写之说!属性的值看编译类型
public class PolyDetails {
    public static void main(String[] args) {
        //属性没有重写之说,属性的值看编译类型
        Base base=new Sub();//向上转型
        System.out.println(base.count);//10
    }
}
class Base {
    int count=10;//属性
}
class Sub extends Base{
    int count =20;
}
  • instanceOf比较操作符,用于判断对象的运行类型是否为XXL类型或XX类型的子类型
public class PolyDetails02 {
    public static void main(String[] args) {
//        BB bb = new BB();
//        System.out.println(bb instanceof BB);//true
//        System.out.println(bb instanceof AA);//true
        AA aa=new BB();//编译类型是AA,运行类型是BB
        System.out.println(aa instanceof AA);//true
        System.out.println(aa instanceof BB);//true

    }
}
class AA{}
class BB extends AA{}

练习:

 4.java的动态绑定机制(重要)

dynamic动态的

 Java的动态绑定机制!

1.当调用对象方法时候,该方法会和该对象的内存地址/运行类型绑定

2.当调用对象属性时,没有动态绑定机制,哪里声明哪里使用


举例如下,好好体会

public class Test {
    public static void main(String[] args) {
        Worker tom = new Worker("tom", 100);
        Manager xiaoyu = new Manager("xiaoyu", 15000, 5000);
        Test test = new Test();//new一个test对象
        test.showEmpAnnual(tom);//调用方法
        test.showEmpAnnual(xiaoyu);
        test.testWork(tom);
        test.testWork(xiaoyu);
    }

    public void showEmpAnnual(Employee e){
        System.out.println(e.getAnnual());//动态绑定
    }

    public void testWork(Employee e) {
        if (e instanceof Worker) {//向下转型
            ((Worker) e).work();
        } else if(e instanceof Manager){
            ((Manager) e).manage();
        }
    }
}

【Day 108】
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值