Java 继承(子类和超类)

在 Java 中,可以从一个类继承属性和方法到另一个类。我们将“继承概念”分为两类:

子类(child): 从另一个类继承的类

超类(parent): 被继承的类

要从一个类继承,使用 extends 关键字。

示例:

class Vehicle {
protected String brand = "Ford"; // Vehicle 属性
public void honk() { // Vehicle 方法
System.out.println("Tuut, tuut!");
}
} class Car extends Vehicle {
private String modelName = "Mustang"; // Car 属性
public static void main(String[] args) { // 创建 myCar 对象
Car myCar = new Car(); // 在 myCar 对象上调用 honk() 方法(来自 Vehicle 类)
myCar.honk(); // 显示来自 Vehicle 类的 brand 属性的值和来自 Car 类的 modelName 的值
System.out.println(myCar.brand + " " + myCar.modelName);
}
}

输出:

Tuut, tuut!
Ford Mustang

注意:

  • 在上面的示例中,Vehicle 类是超类,Car 类是子类。
  • Car 类继承了 Vehicle 类的 brand 属性和 honk() 方法。
  • Car 类还可以添加自己的属性和方法,例如 modelName。

何时使用继承:

  • 代码重用:在创建新类时,重用现有类的属性和方法。
  • 代码的组织:将相关的类组织在一起,使其更容易理解和维护。

final 关键字:

如果不想让其他类从一个类继承,可以使用 final 关键字。

示例:

final class Vehicle {
...
} class Car extends Vehicle {
...
}

输出:

Main.java:9: error: cannot inherit from final Vehicle
class Main extends Vehicle {
^
1 error

一些额外的说明:

  • 一个类只能有一个超类。
  • 子类可以访问超类的所有非私有成员(属性和方法)。
  • 子类可以覆盖超类的方法,以提供不同的实现。
  • 子类可以扩展超类的功能,添加新的属性和方法。

Java 多态

多态 意味着“多种形式”,它发生在我们有许多通过继承相互关联的类时。

继承允许我们从另一个类继承属性和方法。多态使用这些方法执行不同的任务。这使我们能够以不同的方式执行单个操作。

示例:

假设有一个名为 Animal 的超类,它具有一个名为 animalSound() 的方法。Animal 的子类可以是 Pig、Cat、Dog、Bird - 它们也有它们自己的实现动物声音的方法(猪发出哼哼声,猫发出喵喵声等):

class Animal {
public void animalSound() {
System.out.println("The animal makes a sound");
}
} class Pig extends Animal {
public void animalSound() {
System.out.println("The pig says: wee wee");
}
} class Dog extends Animal {
public void animalSound() {
System.out.println("The dog says: bow wow");
}
}

现在我们可以创建 Pig 和 Dog 对象,并在它们两者上调用 animalSound() 方法:

class Animal {
public void animalSound() {
System.out.println("The animal makes a sound");
}
} class Pig extends Animal {
public void animalSound() {
System.out.println("The pig says: wee wee");
}
} class Dog extends Animal {
public void animalSound() {
System.out.println("The dog says: bow wow");
}
} class Main {
public static void main(String[] args) {
Animal myAnimal = new Animal(); // 创建 Animal 对象
Animal myPig = new Pig(); // 创建 Pig 对象
Animal myDog = new Dog(); // 创建 Dog 对象
myAnimal.animalSound();
myPig.animalSound();
myDog.animalSound();
}
}

输出:

The animal makes a sound
The pig says: wee wee
The dog says: bow wow

何时以及为何使用“继承”和“多态”?

  • 代码重用: 在创建新类时,重用现有类的属性和方法。
  • 代码的组织: 将相关的类组织在一起,使其更容易理解和维护。
  • 灵活性: 允许代码以不同的方式执行,而无需更改代码本身。

多态的优点:

  • 代码更简洁:只需要编写一次代码,就可以在不同的类上使用。
  • 代码更易于维护:如果需要更改代码,只需更改一次,所有使用它的类都会自动更新。
  • 代码更易于扩展:可以轻松添加新的类,而无需更改现有的代码。

一些额外的说明:

  • 多态是面向对象编程的重要概念之一。
  • 多态可以使代码更简洁、更易于维护和扩展。
  • 抽象类和接口是实现多态的重要工具。

一些额外的思考:

  • 您可以想象其他可以利用多态的示例吗?
  • 多态在现实世界中有哪些应用?

最后

为了方便其他设备和平台的小伙伴观看往期文章:

微信公众号搜索:Let us Coding,关注后即可获取最新文章推送

看完如果觉得有帮助,欢迎 点赞、收藏、关注

Java 继承与多态:代码重用与灵活性的巧妙结合的更多相关文章

  1. Java 继承和多态

                                                        Java  继承和多态 Java 继承 继承的概念 继承是java面向对象编程技术的一块基石,因 ...

  2. Java 继承、多态与类的复用

    摘要: 本文结合Java的类的复用对面向对象两大特征继承和多态进行了全面的介绍. 首先,我们介绍了继承的实质和意义,并探讨了继承,组合和代理在类的复用方面的异同.紧接着,我们依据继承引入了多态.介绍了 ...

  3. Java继承和多态实例

    我们知道面向对象的三大特性是封装.继承和多态.然而我们有时候总是搞不清楚这些概念.下面对这些概念进行整理, 为以后面向抽象的编程打下坚实的基础. 封装的概念还是很容易理解的.如果你会定义类,那么相信你 ...

  4. Java继承与多态

    感慨一下,到了现在感觉Java里面很多东西都是模模糊糊,不能这样了,一点点解决吧.今天看了继承与多态的一些内容,感觉看得很浅,先写下来,算是巩固,如果后面看到更好的内容,再慢慢加上去. 继承与多态,他 ...

  5. Java继承,多态,组合应用

    继承:  面向对象的三大特征之一:    是类和类之间的一种拓展关系,是一种从一般到特殊的关系;    格式: sub   extends Super,  我们把sub称为子类或者拓展类, 把supe ...

  6. java继承和多态

    父类和子类 如果类C1扩展自另一个类C2,那么C1称为子类或派生类,C2称为父类或基类.派生类可以从它的基类中继承可访问的数据域和方法,还可添加新数据域和新方法 例如:实现一个几何图形基类; clas ...

  7. 四. Java继承和多态8.Java final关键字:阻止继承和多态

    在 Java 中,声明类.变量和方法时,可使用关键字 final 来修饰.final 所修饰的数据具有“终态”的特征,表示“最终的”意思.具体规定如下: final 修饰的类不能被继承. final ...

  8. 四. Java继承和多态4. 多态和动态绑定

    在Java中,父类的变量可以引用父类的实例,也可以引用子类的实例. 请读者先看一段代码: public class Demo { public static void main(String[] ar ...

  9. 四. Java继承和多态10. Java Object类

    Object 类位于 java.lang 包中,是所有 Java 类的祖先,Java 中的每个类都由它扩展而来. 定义Java类时如果没有显示的指明父类,那么就默认继承了 Object 类.例如: p ...

  10. 四. Java继承和多态6. 多态对象的类型转换

    这里所说的对象类型转换,是指存在继承关系的对象,不是任意类型的对象.当对不存在继承关系的对象进行强制类型转换时,java 运行时将抛出 java.lang.ClassCastException 异常. ...

随机推荐

  1. 【LeetCode二叉树#20】二叉搜索树转换为累加树,巩固二叉树的遍历(特殊的中序遍历)

    将二叉搜索树转换为累加树 力扣题目链接(opens new window) 给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 no ...

  2. toml格式配置文件介绍

    toml官方wik toml官方文档 此次文档是以v1.0.0为例,进行说明的.如果使用到的版本不同,直接去官方文档中找对应的版本即可. 谈到配置文件,大家都能说出来好几种,比如常见的ini.xml. ...

  3. javascript浮点数相减、相乘出现一长串小数

    149.7 * 100 = 14969.999999999998 3.57 - 2.33 = 1.2399999999999998 这是JavaScript浮点运算采用IEEE 754标准导致的Bug ...

  4. Dockerfile编写(备份)

    1-使用#注释 2-Dockerfile 主体内容分为四部分:基础镜像信息. 维护者信息. 镜像操作指令和容器启动时执行指令 简单示例: FROM   xxx:latest   #基于xxx:late ...

  5. 可视化技术在 Nebula Graph 中的应用

    本文首发于 Nebula Graph Community 公众号 本文整理自 #可视化 on Live 主题直播,在本期直播中 3 位可视化嘉宾讲述了他们眼中的可视化,以及他们在可视化项目实践中踩过的 ...

  6. Nebula Graph 在众安保险的图实践

    本文首发于 Nebula Graph Community 公众号 互联网金融的借贷同传统信贷业务有所区别,相较于传统信贷业务,互联网金融具有响应快.数据规模大.风险高等特点.众安保险主要业务是做信用保 ...

  7. Sliver C2通关渗透攻击红队内网域靶场2.0

    准备 2012 server 第一台机器开机后,要在C:\Oracle\Middleware\Oracle_Home\user_projects\domains\base_domain​手动运行下 s ...

  8. CompletableFuture Demo

    CompletableFuture Demo 题目:有一个数据库client,从数据库中取数据A和数据B,然后求和.请使用并发的知识,尽快的完成操作. /** * {@code @author:} k ...

  9. Spring事务(六)-只读事务

    @Transactional(readOnly=true)就可以把事务方法设置成只读事务.设置了只读事务,事务从开始到结束,将看不见其他事务所提交的数据.这在某种程度上解决了事务并发的问题.一个方法内 ...

  10. BKP备份寄存器&RTC实时时钟

    UNIX时间戳    time.h 三条路,上面主要作为系统时钟,中间的作为RTC时钟,下面的作为看门狗的时钟 与RTC有关的外部晶振(主电源断电不停)一般都i是32.768KHZ   2^15=32 ...