面向对象——多态(个人笔记)

多(多种)态(状态):方法或对象具有多种形态是面向对象的第三大特征,多态是建立在封和继承的继承之上的。多态的前提是两个对象(类)存在继承关系。

具体体现:
1,方法的多态:重写和重载就体现多态;

2,对象多态:

一,一个对象的编译类型和运行类型可以不一样;

二,编译类型在定义对象的时候就确定了,不能改变;

三,运行类型是可以变化的;

四,编译类型看定义时“ = ”号的左边,运行类型看等号的右边。

Animal 是 Dog和Cat的父类

Animal animal = new Dog( );父类引用指向子类对象(向上转型)。animal是表面,Dog是实际。假如Animal和Dog里面都有cay方法,那animal.cay( )实际上运行的是Dog中的cay方法。animal = new Cat;animal.cay();这里把原本的Dog中的cay方法变成了Cat中的cay方法。体现第三点。

向上转型:

1,本质上是父类的引用指向子类对象;

2,语法:父类类型 引用名  [编译类型] = new 子类类型()【运行类型】;

3,特点:编译类型看左边,运行类型看右边。可以调用父类中的所有成员(属性和方法,同时需要遵守访问权限),不能调用子类中独有的成员。这是因为在编译时,能调用那些成员是有编译类型决定的(编译看编译类型)。运行时即调用方法是从运行类型(子类)开始查找方法,再往上级查找直到找到方法或者到顶级Object,具体调用规则与继承笔记里面的调用规则一致(运行看运行类型)。

4,编译由javac执行,运行有java执行,所以才会编译看编译类型,运行看运行类型。

向下转型:

一,语法:子类类型 引用名 = (子类类型)父类引用。Animal 是 Dog和Cat的父类。

Animal animal = new Cat();(向上转型)变成向下转型--> Cat cat = (Cat) animal;(cat的编译类型是Cat,运行类型还是Cat);

二,只能强转父类引用,不能强转父类的对象。

三,父类的引用必须指向的是当前目标类型的对象。即原本Animal animal = new Cat();向下转型只能转成Cat cat = (Cat) animal;不能转成Dog dog = (Dog)animal;

 (二,三)实际上就是将cat指向animal创建的Cat对象(cat和animal指向同一对象),cat拥有和animal一样的成员,向下转型后animal还在(编译类型还是Animal,运行类型还是Cat)并且依然不能使用子类Cat的独有方法,但是cat在拥有和animal一样的成员的基础上能使用子类Cat的独有方法(仅个人理解)。

四,向下转型后,就可以调用子类类型中的所有成员。

3,属性:

一,属性没有重写的说法,属性的值取决于编译类型;

class A  { int asd = 10;}      class B extends A  {int asd = 20;}    A a = new B();  a.asd的值是10而不是20.

instanceOf:比较操作符用于判断对象的运行类型是否为XX类型或XX类型的子类类型。

System.out.println(a instanceof A} //true

java动态绑定机制:

1,当调用对象方法的时候,该方法会和该对象的内存地址  /  运行类型绑定。即:在调用方法的时候都会从运行类型的类开始寻找该方法,找不到再往上级寻找。

2,当调用对象属性的时候,没有动态绑定机制,哪里声明,哪里调用。即:如果父类和子类均有相同的属性是,调用的方法是那个类的就用那个类的属性,方法在父类中就用父类中和子类同名的该属性,在子类中就用子类的属性。

以上截图来源于B站up韩顺平。以上内容仅个人笔记以及部分属于个人理解,如有错误欢迎指出。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值