Java 继承与多态:代码重用与灵活性的巧妙结合
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 继承与多态:代码重用与灵活性的巧妙结合的更多相关文章
- Java 继承和多态
Java 继承和多态 Java 继承 继承的概念 继承是java面向对象编程技术的一块基石,因 ...
- Java 继承、多态与类的复用
摘要: 本文结合Java的类的复用对面向对象两大特征继承和多态进行了全面的介绍. 首先,我们介绍了继承的实质和意义,并探讨了继承,组合和代理在类的复用方面的异同.紧接着,我们依据继承引入了多态.介绍了 ...
- Java继承和多态实例
我们知道面向对象的三大特性是封装.继承和多态.然而我们有时候总是搞不清楚这些概念.下面对这些概念进行整理, 为以后面向抽象的编程打下坚实的基础. 封装的概念还是很容易理解的.如果你会定义类,那么相信你 ...
- Java继承与多态
感慨一下,到了现在感觉Java里面很多东西都是模模糊糊,不能这样了,一点点解决吧.今天看了继承与多态的一些内容,感觉看得很浅,先写下来,算是巩固,如果后面看到更好的内容,再慢慢加上去. 继承与多态,他 ...
- Java继承,多态,组合应用
继承: 面向对象的三大特征之一: 是类和类之间的一种拓展关系,是一种从一般到特殊的关系; 格式: sub extends Super, 我们把sub称为子类或者拓展类, 把supe ...
- java继承和多态
父类和子类 如果类C1扩展自另一个类C2,那么C1称为子类或派生类,C2称为父类或基类.派生类可以从它的基类中继承可访问的数据域和方法,还可添加新数据域和新方法 例如:实现一个几何图形基类; clas ...
- 四. Java继承和多态8.Java final关键字:阻止继承和多态
在 Java 中,声明类.变量和方法时,可使用关键字 final 来修饰.final 所修饰的数据具有“终态”的特征,表示“最终的”意思.具体规定如下: final 修饰的类不能被继承. final ...
- 四. Java继承和多态4. 多态和动态绑定
在Java中,父类的变量可以引用父类的实例,也可以引用子类的实例. 请读者先看一段代码: public class Demo { public static void main(String[] ar ...
- 四. Java继承和多态10. Java Object类
Object 类位于 java.lang 包中,是所有 Java 类的祖先,Java 中的每个类都由它扩展而来. 定义Java类时如果没有显示的指明父类,那么就默认继承了 Object 类.例如: p ...
- 四. Java继承和多态6. 多态对象的类型转换
这里所说的对象类型转换,是指存在继承关系的对象,不是任意类型的对象.当对不存在继承关系的对象进行强制类型转换时,java 运行时将抛出 java.lang.ClassCastException 异常. ...
随机推荐
- 【LeetCode二叉树#20】二叉搜索树转换为累加树,巩固二叉树的遍历(特殊的中序遍历)
将二叉搜索树转换为累加树 力扣题目链接(opens new window) 给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 no ...
- toml格式配置文件介绍
toml官方wik toml官方文档 此次文档是以v1.0.0为例,进行说明的.如果使用到的版本不同,直接去官方文档中找对应的版本即可. 谈到配置文件,大家都能说出来好几种,比如常见的ini.xml. ...
- javascript浮点数相减、相乘出现一长串小数
149.7 * 100 = 14969.999999999998 3.57 - 2.33 = 1.2399999999999998 这是JavaScript浮点运算采用IEEE 754标准导致的Bug ...
- Dockerfile编写(备份)
1-使用#注释 2-Dockerfile 主体内容分为四部分:基础镜像信息. 维护者信息. 镜像操作指令和容器启动时执行指令 简单示例: FROM xxx:latest #基于xxx:late ...
- 可视化技术在 Nebula Graph 中的应用
本文首发于 Nebula Graph Community 公众号 本文整理自 #可视化 on Live 主题直播,在本期直播中 3 位可视化嘉宾讲述了他们眼中的可视化,以及他们在可视化项目实践中踩过的 ...
- Nebula Graph 在众安保险的图实践
本文首发于 Nebula Graph Community 公众号 互联网金融的借贷同传统信贷业务有所区别,相较于传统信贷业务,互联网金融具有响应快.数据规模大.风险高等特点.众安保险主要业务是做信用保 ...
- Sliver C2通关渗透攻击红队内网域靶场2.0
准备 2012 server 第一台机器开机后,要在C:\Oracle\Middleware\Oracle_Home\user_projects\domains\base_domain手动运行下 s ...
- CompletableFuture Demo
CompletableFuture Demo 题目:有一个数据库client,从数据库中取数据A和数据B,然后求和.请使用并发的知识,尽快的完成操作. /** * {@code @author:} k ...
- Spring事务(六)-只读事务
@Transactional(readOnly=true)就可以把事务方法设置成只读事务.设置了只读事务,事务从开始到结束,将看不见其他事务所提交的数据.这在某种程度上解决了事务并发的问题.一个方法内 ...
- BKP备份寄存器&RTC实时时钟
UNIX时间戳 time.h 三条路,上面主要作为系统时钟,中间的作为RTC时钟,下面的作为看门狗的时钟 与RTC有关的外部晶振(主电源断电不停)一般都i是32.768KHZ 2^15=32 ...