面向对象 - 继承

面向对象 - 继承

为什么需要继承

一个小问题 , 还是看个程序com.edu.extend_ 包: Extends01.java , 提出代码复用的问题.

我们编写了两个类,一个是 Pupil 类(小学生),一个是 Graduate(大学毕业生) 问题: 两个类的属性和方法有很多是相同的,怎么办 ?

解 决 方 案 : 用继承来解决代码的复用性

 

●继承基本介绍

继承可以解决代码复用, 让我们的编程更加靠近人类思维, 当多个类存在相同的属性(变量) 和方法时, 可以从这些类中抽象出父类, 在父类中定义这些相同的属性和方法, 所有的子 类不需要重新定义这些属性和方法只需要通过extends声明继承父类即可。

●继承的基本语法

class 子类 extends 父类{ }

  1. 子类就会自动拥有父定义的属性和方法

  2. 父类又叫 超类,基类。

  3. 子类又叫 派生类。(子类之后也可以再去分出子类)

继承给编程带来的便利

  1. 代码的复用性提高了

  2. 代码的扩展性和维护性提高了

 

继承的深入讨论/细节问题

  1. 子类继承了所有的属性和方法,非私有的属性和方法可以在子类直接访问, 但是私有属性和方法不能在子类直接访 问,要通过父类提供公共的方法去访问

  2. 子类必须调用父类的构造器, 完成父类的初始化

  3. 当创建子类对象时,不管使用子类的哪个构造器,默认情况下总会去调用父类的无参构造器,如果父类没有提供无 参构造器,则必须在子类的构造器中用 super 去指定使用父类的哪个构造器完成对父类的初始化工作,否则,编译不会通过

  4. 如果希望指定去调用父类的某个构造器,则显式的调用一下 : super(参数列表)

  5. super 在使用时,必须放在构造器第一行(super 只能在构造器中使用)

  1. super() 和 this() 都只能放在构造器第一行,因此这两个方法不能共存在一个构造器

  2. java 所有类都是 Object 类的子类, Object 是所有类的基类.

  3. 父类构造器的调用不限于直接父类!将一直往上追溯直到 Object 类(顶级父类)

  4. 子类最多只能继承一个父类(指直接继承),即 java 中是单继承机制。

    思考:如何让 A 类继承 B 类和 C 类? 【A 继承 B, B 继承 C】

  5. 不能滥用继承,子类和父类之间必须满足 is-a

 

继承的本质分析

案例

看一个案例来分析当子类继承父类,创建子类对象时,内存中到底发生了什么?

提示: 对象创建好后 ,建立查找的关系

package com.edu.extend_;

//讲解继承的本质
public class ExtendsTheory {
  //Theory:理论原理
  public static void main(String[] args) {
      Son son = new Son();//内存的布局
      System.out.println(son.name);
  // 这时请注意,要按照查找关系来返回信息
  //(1) 首先看子类是否有该属性
  //(2) 如果子类有这个属性,并且可以访问,则返回信息
  //(3) 如果子类没有这个属性,就看父类有没有这个属性(如果父类有该属性,并且可以访问,就返回信息..)
  //(4) 如果父类没有就按照(3)的规则,继续找上级父类,直到 Object...
  }
}

class GrandPa { //爷类
  String name = "大头爷爷";
  String hobby = "旅游";
}

class Father extends GrandPa {//父类
  String name = "大头爸爸";
  int age = 39;
//   public int getAge() {
//       return age;
//   }
}
class Son extends Father { //子类
  String name = "大头儿子";
}
 
posted @   comia  阅读(30)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示