面向对象——继承与多态

继承

好处:

  • 避免重复的代码
  • 定义一个公共的类的契约

创建继承树

特点:

  • 子类继承了父类所有的成员变量和方法
  • 可以增加成员变量和成员方法
  • 可以覆盖父类的成员方法
  • 不可以覆盖父类的成员变量

问题:子类继承了父类所有的成员变量和方法,包括父类的私有变量吗?

抽象类与抽象方法

抽象类本身没有用,除非他被继承,有了子类。抽象类的子类可以实例化。

  • 非抽象类不可以有抽象方法
  • 抽象类中可以有非抽象方法

抽象类:
12
抽象类不可实例化,但其子类可以实例化。
抽象方法:
在这里插入图片描述
可以没有方法内容

  • 抽象⽅法的存在就是为了多态
  • 具体的类必须实现所有的抽象⽅法
  • 实现抽象⽅法就像⼦类覆盖⽗类⽅法⼀样

多态

任何一个子类的对象都可以当做父类来看待
一个所有类的父类:Object
多态的代价:Object只能赋给Object对象
关键:

  • 编译时,编译器决定你是否能调用某个方法
    • 依据引用变量的类型,而不是引用变量指向的对象的类型
  • 执行时,JVM虚拟机决定实际哪个方法被调用
    • 依据实际引用变量指向的对象的类型

每一个对象都是其父类的对象,也就是说,每个对象都是Object的对象
强制类型转换:可以将父类引用变量向子类变量进行强制类型转换

多态的思想:
  • 多态通过分离“做什么”和“怎么做”,从另⼀⻆度将接⼝和实现分离开来。
  • ⽽多态的作⽤则是消除类型之间的耦合关系多态⽅法调⽤允许⼀种类型表现出与其他相似类型之间的区别,只要它们都是从同⼀基类导出⽽来的。这种区别是根据⽅法⾏为的不同来⽽表示出来的,虽然这些⽅法都可以通过同⼀个基类来调⽤。
  • 多态可以表达不同的计算类型,并且在运⾏的时候动态的确定正确的计算。
  • 多态是指多个⽅法使⽤同⼀个名字有多种解释,当使⽤这个名字去调⽤⽅法时,系统将选择重载⾃动的选择其中的⼀个⽅法。在多态中只关⼼⼀个对象做什么,⽽不关⼼如何去做。

多态引用变量:(超类==父类)
在这里插入图片描述
方法重载与重写的区别
Overriding方法重载(让方法处理不同数据类型)

  • 返回值必须一致
  • 方法的可达性不能降低

注意:在Java中重写私有方法是无效的,因为父类的私有方法是“自动结束的,并且对派生类隐藏”

class Base {
  public void callFoo() {
      foo();
  }
  private void foo() {
      System.out.print("AHA");
  }
}
class Child extends Base {
  private void foo() {
  }
}
class A{
  public static void main(String[] args){
      Child c = new Child();
      c.callFoo();
  }
}
//输出:”AHA“ 
//证明方法没有被重写

方法调用的字节码

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值