什么是多态

什么是多态?

同一个对象在不同时刻表现出来的不同的状态

多态的条件:

  • 要有继承关系
  • 要有方法重写
  • 要有父类引用指向子类对象

好处:

  • 提高了代码的维护性(集成保证)
  • 提高了代码的扩展性

多态的特点

  • 使用父类类型的引用指向子类的对象; 
  • 该引用只能调用父类中定义的方法和变量; 
  • 如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;(动态连接、动态调用) 

被子类重写的父类方法,在父类引用调用时调用的是子类的方法,如果想调用父类的,只能通过子类的方法用super去调用父类的被重写的方法

多态中成员访问的特点

父类引用指向子类对象 Father f = new Son ();或者说向上转型

构造方法:创建子类对象的时候,访问父类的构造方法,对父类的数据进行初始化(继承保证)

成员变量:编译看左边,运行看左边

因为任何域访问操作都由编译器解析,因此不算多态。一般我们都变量私有化。

可以调的是父类的成员变量(只针对public类型,私有不能调用)

不能调用子类的变量,多态弊端,如果想使用则必须向下转型

成员方法:编译看左边,运行看右边(动态绑定)

          只能调用重写父类的方法和继承父类的方法,重写的前提是继承

父类私有的不能继承则不能重写,重写了(其实不是)则是子类特有的,子类特有的方法不能通过多态调用,多态弊端,如果想使用则必须向下转型

静态方法编译看左边(父类),运行看左边(父类)静态和类相关,所以算不上重写, 相当于类名调用静态方法所以这算不上多态。所以,访问还是左边的。只有非静态的成员方法,编译看左边, 运行看右边,

多态的弊端是不能使用子类特有的功能(父类引用指向子类对象)

如果是自己的方法,那么父类对象指向子类的引用需要向下转型SuperMan sm =   (SuperMan)p;

我的理解,多态对成员变量和成员方法的理解。多态利用的是向上转型,一个父类有多个子类,当有一个公用方法的参数是子类的时候,若果写子类的类型,这个方法则要被重载好多次,如果参数类型写成父类,则只有一次,任何子类的类型都可以做参数。此时,调用成员变量和成员方法则不能调用子类的特有的了(能调用就乱套了)。所以,成员变量只能调用父类让调用的成员方法,或者只能调用继承和重写父类的。强制调用子类特有的会出错,因为每个子类都有自己的特有,成员方法是后期绑定在编译期,编译器并不知道是哪个子类向上转型转为父类了。

父类引用指向子类的具体应用,就是在向上转型的时候,如果有多个子类,方法的参数都是这个父类的子类,则这个参数类型可以写成父类,就可以就收任何子类对象

如果一种语言想实现后期绑定,就必须具有某种机制,以便在运行时能判断对象的类型,从而调用恰当的方法。也就是说,编译器一直不知道对象的类型,但是方法调用机制能找到正确的方法体,并加以调用。

Java中除了static方法和final方法(Private放大属于final方法)之外,其他所有的方法都是后期绑定,既动态绑定。

关键字 instanceof 判断前边的引用是否是后边的数据类型 if( a instanceof Cat)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值