Java基础继承详解
Java基础继承详解
在Java中,继承是面向对象编程中的一个重要概念。通过继承,一个类可以从另一个类继承属性和方法,使代码重用和扩展更加方便。下面是关于Java基础继承的一些详解:
-
关键字: 使用
extends
关键字可以在一个类声明中指定其继承的父类。例如:class 子类名 extends 父类名 { ... }
。 -
子类和父类: 子类继承父类的属性和方法。子类可以访问父类的非私有成员(即
public
、protected
和包内可见的成员)。 -
构造方法: 子类可以调用父类的构造方法来初始化继承的属性。使用
super
关键字来调用父类构造方法。如果没有明确调用父类构造方法,Java会默认调用父类的无参构造方法。 -
方法覆盖(Override): 子类可以重写父类的方法,以实现自己的逻辑。重写时,方法名、参数列表和返回类型必须与父类方法一致。使用
@Override
注解可以提醒编译器你是有意重写方法。 -
super
关键字: 在子类中,使用super
关键字可以调用父类的成员(属性和方法)。例如:super.methodName()
。 -
继承链: Java支持多层继承,即一个子类可以继承自另一个子类。但要注意,不宜过多地延伸继承链,避免复杂性和耦合度增加。
-
final
关键字: 使用final
关键字可以禁止类被继承,或者阻止方法被重写。 -
abstract
关键字: 使用abstract
关键字可以定义抽象类和抽象方法。抽象类不能被实例化,而是用作其他类的基类。抽象方法只有方法声明,没有具体实现,在子类中必须被重写。 -
构造方法和继承: 子类的构造方法会隐式调用父类的构造方法,确保父类的属性被正确初始化。如果父类没有无参构造方法,子类构造方法必须显式调用父类的构造方法。
-
访问控制: 子类不能访问父类的私有成员。其他可见性修饰符(
public
、protected
和包内可见)在继承中有不同的作用范围。
继承是Java中实现代码重用和创建层次化结构的重要手段之一,但也要谨慎使用,以避免引入不必要的复杂性。
以下是一个简单的Java代码案例,演示了继承的基本概念:
// 父类
class Animal {String name;public Animal(String name) {this.name = name;}public void speak() {System.out.println("动物发出叫声");}
}// 子类继承父类
class Dog extends Animal {public Dog(String name) {super(name);}// 子类重写父类方法@Overridepublic void speak() {System.out.println(name + ":汪汪汪!");}// 子类特有方法public void fetch() {System.out.println(name + ":正在追赶飞盘");}
}// 子类继承父类
class Cat extends Animal {public Cat(String name) {super(name);}// 子类重写父类方法@Overridepublic void speak() {System.out.println(name + ":喵喵喵!");}// 子类特有方法public void climb() {System.out.println(name + ":正在爬树");}
}public class Main {public static void main(String[] args) {Dog dog = new Dog("小狗");dog.speak(); // 调用子类方法dog.fetch(); // 调用子类特有方法Cat cat = new Cat("小猫");cat.speak(); // 调用子类方法cat.climb(); // 调用子类特有方法}
}
在上面的代码中,我们定义了一个父类Animal
,它有一个属性name
和一个方法speak
。然后我们创建了两个子类Dog
和Cat
,它们分别继承了Animal
类,并在子类中重写了speak
方法,以及添加了各自特有的方法fetch
和climb
。在Main
类中,我们创建了Dog
和Cat
的实例,并调用了它们的方法来展示继承和方法重写的效果。
构造方法和继承:
当子类继承父类时,子类的构造方法会隐式调用父类的无参构造方法。如果父类没有无参构造方法,子类的构造方法必须显式调用父类的某个构造方法,使用super
关键字。
// 父类
class Animal {String name;public Animal(String name) {this.name = name;}
}// 子类继承父类
class Dog extends Animal {int age;public Dog(String name, int age) {super(name); // 调用父类构造方法this.age = age;}
}
super
关键字:
在子类中,可以使用super
关键字来访问父类的成员(属性和方法)。这在子类需要重写父类方法,但仍需要调用父类方法的情况下很有用。
class Animal {String name;public Animal(String name) {this.name = name;}public void speak() {System.out.println("动物发出叫声");}
}class Dog extends Animal {public Dog(String name) {super(name);}@Overridepublic void speak() {super.speak(); // 调用父类方法System.out.println(name + ":汪汪汪!");}
}
多层继承:
Java支持多层继承,即一个子类可以继承自另一个子类。这种继承链的结构可以通过逐级继承来实现。
class Animal {// ...
}class Mammal extends Animal {// ...
}class Dog extends Mammal {// ...
}
抽象类和抽象方法:
您理解得很正确!abstract
关键字在Java中用于定义抽象类和抽象方法,它们是面向对象编程的重要概念。让我再详细解释一下抽象类和抽象方法的使用和特点:
-
抽象类(Abstract Class):
抽象类是无法被实例化的类,它只能用作其他类的基类。抽象类可以包含普通的方法、属性以及抽象方法。抽象类通过使用abstract
关键字来声明。abstract class Shape {String color;public Shape(String color) {this.color = color;}abstract double area(); // 抽象方法void displayColor() {System.out.println("颜色:" + color);} }
-
抽象方法(Abstract Method):
抽象方法是只有方法声明而没有具体实现的方法。抽象方法必须在抽象类中声明,并且在子类中被具体实现。子类继承抽象类时,必须实现其抽象方法。abstract class Shape {abstract double area(); }class Circle extends Shape {double radius;public Circle(double radius) {this.radius = radius;}@Overridedouble area() {return Math.PI * radius * radius;} }
-
抽象类的使用:
抽象类用于建立一种模板,其中包含了一些通用的方法和属性,但其中的抽象方法需要在子类中根据实际需求进行实现。抽象类允许您在子类之间共享代码,但又保持了灵活性。public class Main {public static void main(String[] args) {Circle circle = new Circle(5.0);System.out.println("圆的面积:" + circle.area());} }
在这个示例中,Shape
是一个抽象类,它定义了一个抽象方法area()
,而Circle
是Shape
的子类,它必须实现area()
方法。通过创建Circle
的实例并调用area()
方法,我们可以计算出圆的面积。
抽象类和抽象方法的概念使得代码更具有可扩展性和可维护性,同时也促使了面向对象设计中的多态和继承等重要概念的应用。
方法重写与多态:
方法重写允许子类重写父类的方法,实现自己的逻辑。多态是指可以使用父类类型的引用指向子类对象,以实现不同的行为。通过方法重写和多态,可以实现更灵活的代码结构。
class Animal {void speak() {System.out.println("动物发出叫声");}
}class Dog extends Animal {void speak() {System.out.println("汪汪汪!");}
}public class Main {public static void main(String[] args) {Animal myDog = new Dog(); // 多态myDog.speak(); // 输出:"汪汪汪!"}
}6
final关键字:
使用final
关键字可以阻止类被继承,或者阻止方法被重写。在类声明前加上final
修饰符,或者在方法声明前加上final
修饰符,可以实现这种限制。
final class FinalClass {// ...
}class SubClass extends FinalClass { // 编译错误,无法继承final类// ...
}class Animal {final void eat() {System.out.println("动物进食");}
}class Dog extends Animal {// 编译错误,无法重写final方法// void eat() {// System.out.println("狗吃骨头");// }
}
这些概念和技巧可以帮助您更深入地理解Java中的继承机制,并能够更灵活地设计和组织您的面向对象程序。
您对构造方法和继承、以及访问控制的理解是准确的。让我进一步解释一下您提到的这两个重要概念:
构造方法和继承:
子类的构造方法会隐式调用父类的构造方法,确保在创建子类对象时父类的属性被正确初始化。如果父类没有无参构造方法,那么在子类的构造方法中必须显式调用父类的某个构造方法,以确保父类的状态正确初始化。这是因为在创建子类对象时,子类的构造方法会首先调用父类的构造方法,然后再执行子类的构造逻辑。
class Animal {String species;public Animal(String species) {this.species = species;}
}class Dog extends Animal {String name;public Dog(String species, String name) {super(species); // 调用父类的构造方法this.name = name;}
}
例子中,Dog
类继承自Animal
类。在Dog
类的构造方法中,我们使用super(species)
来显式调用父类Animal
的构造方法,以确保父类的属性species
被正确初始化。
访问控制:
在继承中,访问控制修饰符(public
、protected
、默认(包内可见)和private
)会影响子类对父类成员的访问权限。具体来说:
public
:父类的public
成员在子类中继承后可以被访问。子类的对象和其他类的对象都可以访问这些成员。protected
:父类的protected
成员在子类中继承后可以被访问。同时,子类的对象也可以访问,但其他类的对象只能在同一包内访问。- 默认(包内可见):如果父类成员没有使用访问修饰符,即默认访问修饰符,那么子类在继承后可以访问,但其他类的对象只能在同一包内访问。
private
:父类的private
成员不能被子类访问,只能在父类内部使用。
class Animal {public String publicField;protected String protectedField;String defaultField;private String privateField;
}class Dog extends Animal {void accessFields() {System.out.println(publicField); // 可以访问System.out.println(protectedField); // 可以访问System.out.println(defaultField); // 可以访问,因为在同一包内// System.out.println(privateField); // 不能访问,因为是私有成员}
}
例子中,子类Dog
可以访问父类Animal
中的public
、protected
和默认成员,但不能访问私有成员。
您对构造方法和方法覆盖的理解非常准确。让我为您提供更详细的解释和示例:
构造方法:
子类可以调用父类的构造方法来初始化继承的属性。使用 super
关键字来调用父类构造方法。如果没有明确调用父类构造方法,Java 会默认调用父类的无参构造方法。
class Animal {String species;public Animal(String species) {this.species = species;}
}class Dog extends Animal {String name;public Dog(String species, String name) {super(species); // 调用父类构造方法this.name = name;}
}
在这个例子中,Dog
类的构造方法使用 super(species)
来调用父类 Animal
的构造方法,以初始化继承的属性 species
。
方法覆盖(Override):
子类可以重写父类的方法,以实现自己的逻辑。重写时,方法名、参数列表和返回类型必须与父类方法一致。使用 @Override
注解可以提醒编译器你是有意重写方法。
class Animal {void speak() {System.out.println("动物发出叫声");}
}class Dog extends Animal {@Overridevoid speak() {System.out.println("汪汪汪!");}
}
在这个例子中,Dog
类重写了父类 Animal
的 speak()
方法,实现了独特的叫声。@Override
注解可以帮助开发者确保他们正在重写父类的方法,并在不小心写错方法名或参数列表时得到编译器的提醒。
这些概念在面向对象编程中非常重要,它们帮助您更好地利用继承和多态特性,以及确保您的代码在正确地进行方法覆盖时不会出现错误。
相关文章:

Java基础继承详解
Java基础继承详解 在Java中,继承是面向对象编程中的一个重要概念。通过继承,一个类可以从另一个类继承属性和方法,使代码重用和扩展更加方便。下面是关于Java基础继承的一些详解: 关键字: 使用extends关键字可以在一个…...

如何维护你的电脑:打造IT人的重要武器
文章目录 方向一:介绍我的电脑方向二:介绍我的日常维护措施1. 定期清理和优化2. 保持良好的上网习惯和安全防护3. 合理安排软件和硬件的使用4. 数据备份和系统还原 方向三:推荐的维护技巧1. 数据分区和多系统安装2. 内部清洁和散热优化3. 安全…...

【雕爷学编程】MicroPython动手做(31)——物联网之Easy IoT 3
1、物联网的诞生 美国计算机巨头微软(Microsoft)创办人、世界首富比尔盖茨,在1995年出版的《未来之路》一书中,提及“物物互联”。1998年麻省理工学院提出,当时被称作EPC系统的物联网构想。2005年11月,国际电信联盟发布《ITU互联网…...

Elasticsearch 快照和恢复
文章目录 简介快照存储库说明创建或更新存储库接口说明路径参数查询参数请求正文 使用 fs 方式创建存储库验证储存库获取存储库信息删除存储库清理储存库 快照创建快照路径参数查询参数请求正文示例 获取快照查询参数示例 克隆快照查询参数示例 获取快照状态示例 恢复快照查询参…...

Packet Tracer - 检验 IPv4 和 IPv6 编址
Packet Tracer - 检验 IPv4 和 IPv6 编址 地址分配表 设备 接口 IPv4 地址 子网掩码 默认网关 IPv6 地址/前缀 R1 G0/0 10.10.1.97 255.255.255.224 N/A 2001:DB8:1:1::1/64 N/A S0/0/1 10.10.1.6 255.255.255.252 N/A 2001:DB8:1:2::2/64 N/A 本地链路 F…...

PHP8的表达式-PHP8知识详解
表达式是 PHP 最重要的基石。在 PHP8中,几乎所写的任何东西都是一个表达式。简单但却最精确的定义一个表达式的方式就是"任何有值的东西"。 最基本的表达式形式是常量和变量。当键入"$a 5",即将值"5"分配给变量 $a。&quo…...

亚马逊云科技七项生成式AI新产品生成式AI,为用户解决数据滞后等难题
7月27日,亚马逊云科技在纽约峰会上一连发布了七项生成式AI创新,涵盖了从底层硬件到工具、软件、再到生态的全方位更新,成为它在该领域迄今最全面的一次升级展示,同时也进一步降低了生成式AI的使用门槛。 亚马逊云科技凭借自身端到…...

图片等比例显示全部,兼容不同宽高比例图片
功能描述:预览瀑布流图片 点击预览不同的尺寸图片 <!-- 预览页面 --><div class"sea"><img :src"seaobj.url" alt""></div> .sea {z-index: 100;position: fixed;top: 0;text-align: center;background-colo…...

·[K8S:使用calico网络插件]:解决集群节点NotReady问题
文章目录 一:安装calico:1.1:weget安装Colico网络通信插件:1.2:修改calico.yaml网卡相关配置:1.2.1:查看本机ip 网卡相关信息:1.2.2:修改calico.yaml网卡interface相关信…...

泊松损坏图像的快速尺度间小波去噪研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

服务器端开发-golang dlv 远程调试
1。需要root权限的服务器代码调试 sudo ./appps to get piddlv attach pid --headless --listen:40000 --api-version2 --accept-multiclientattach the golang IDE or other IDE 2。不需要root权限的服务器代码调试,另一种选择 dlv --listen:40000 --headlesstr…...

STM32F103——时钟配置
目录 1、认识时钟树 1.1 什么是时钟树 1.2 时钟系统解析 1.2.1 时钟源 1.2.2 锁相环PLL 1.2.3 系统时钟SYSCLK 1.2.4 时钟信号输出MCO 2、如何修改主频 2.1 STM32F1时钟系统配置 2.2 STM32F1 时钟使能和配置 下列进行举例的开发板是原子哥的战舰开发板STM32F103ZET…...

【Linux】信号捕捉
目录 信号捕捉1.用户态与内核态1.1关于内核空间与内核态:1.2关于用户态与内核态的表征: 2.信号捕捉过程 信号捕捉 1.用户态与内核态 用户态:执行用户代码时,进程的状态 内核态:执行OS代码时,进程的状态 …...

超详情的开源知识库管理系统- mm-wiki的安装和使用
背景:最近公司需要一款可以记录公司内部文档信息,一些只是累计等,通过之前的经验积累,立马想到了 mm-wiki,然后就给公司搭建了一套,分享一下安装和使用说明: 当前市场上众多的优秀的文档系统百…...

安卓:UDP通信
目录 一、介绍 网络通信的三要素: (1)、IP地址: IPv4: IPv6: IP地址形式: IP常用命令: IP地址操作类: (2)、端口: (3)、协议: UDP协…...

clickhouse安装
clickhouse安装 在线安装和离线安装 一、环境准备: 1.检查系统是否支持clickhouse安装 (向量化支持) grep -q sse4_2 /proc/cpuinfo && echo “SSE 4.2 supported” || echo “SSE 4.2 not supported.” 2.下载对应的clickhouse包 复制运行之后,就会将对应的包加入…...

Cpp学习——string(2)
目录 编辑 容器string中的一些函数 1.capacity() 2.reserve() 3.resize() 4.push_back()与append() 5.find系列函数 容器string中的一些函数 1.capacity() capacity是string当中表示容量大小的函数。但是string开空间时是如何开的呢?现在就来看一下。先写…...

python进阶编程
lambda匿名函数 python使用lambda表达式来创建匿名函数 语法 // lambda 参数们:对参数的处理 lambda x : 2 * x // x 是参数, 2*x 是返回值 //使用lambda实现求和 sum lambda arg1, arg2 : agr1 arg2 print(sum(10,20)) // 将匿名函数封装在一…...

算法练习--leetcode 链表
文章目录 合并两个有序链表删除排序链表中的重复元素 1删除排序链表中的重复元素 2环形链表1环形链表2相交链表反转链表 合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。 新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入&…...

Android性能优化—Apk瘦身优化
随着业务迭代,apk体积逐渐变大。项目中积累的无用资源,未压缩的图片资源等,都为apk带来了不必要的体积 增加。而APK 的大小会影响应用加载速度、使用的内存量以及消耗的电量。在讨论如何缩减应用的大小之前,有必要了解下应用 APK …...

前端主题切换方案——CSS变量
前言 主题切换是前端开发中老生常谈的问题,本文将介绍主流的前端主题切换实现方案——CSS变量 CSS变量 简介 编写CSS样式时,为了避免代码冗余,降低维护成本,一些CSS预编译工具(Sass/Less/Stylus)等都支…...

Java8 list多属性去重
大家好,我是三叔,很高兴这期又和大家见面了,一个奋斗在互联网的打工人。 在 Java 开发中,我们经常会面临对 List 中的对象属性去重的需求。然而,当需要根据多个属性来进行去重时,情况会稍微复杂一些。本篇…...

kafka-保证数据不重复-生产者开启幂等性和事务的作用?
1. 生产者开启幂等性为什么能去重? 1.1 场景 适用于消息在写入到服务器日志后,由于网络故障,生产者没有及时收到服务端的ACK消息,生产者误以为消息没有持久化到服务端,导致生产者重复发送该消息,造成了消…...

[AI in security]-214 网络安全威胁情报的建设
文章目录 1.什么是威胁情报2. 威胁情报3. 智能威胁情报3.1 智能威胁情报的组成3.2 整合威胁情报3.3 最佳实践4. 威胁情报的作用5.威胁情报模型6.反杀链模型7.基于TI的局部优势模型参考文献相关的研究1.什么是威胁情报 威胁情报是循证知识,包括环境、机制、指标、意义和可行性…...

Javaweb学习(2)
Javaweb学习 一、Maven1.1 Maven概述1.2 Maven简介1.3、Maven基本使用1.4、IDEA配置Maven1.6、依赖管理&依赖范围 二、MyBatis2.1 MyBatis简介2.2 Mybatis快速入门2.3、解决SQL映射文件的警告提示2.4、Mapper代理开发 三、MyBaits核心配置文件四、 配置文件的增删改查4.1 M…...

leetcode410. 分割数组的最大值 动态规划
hard:https://leetcode.cn/problems/split-array-largest-sum/ 给定一个非负整数数组 nums 和一个整数 m ,你需要将这个数组分成 m 个非空的连续子数组。 设计一个算法使得这 m 个子数组各自和的最大值最小。 示例 1:输入:nums [7,2,5,1…...

C函数指针与类型定义
#include <stdio.h> #define PI 3.14 typedef int uint32_t; /* pfun is a pointer and its type is void (*)(void) */ void (*pfun)(void); /* afer typedef like this we can use “pfun1” as a data type to a function that has form like: / -------…...

最新2024届【海康威视】内推码【GTK3B6】
最新2024届【海康威视】内推码【GTK3B6】 【内推码使用方法】 1.请学弟学妹们登录校招官网,选择岗位投递简历; 2.投递过程中填写内推码完成内推步骤,即可获得内推特权。 内推码:GTK3B6 内推码:GTK3B6 内推码&…...

边写代码边学习之LSTM
1. 什么是LSTM 长短期记忆网络 LSTM(long short-term memory)是 RNN 的一种变体,其核心概念在于细胞状态以及“门”结构。细胞状态相当于信息传输的路径,让信息能在序列连中传递下去。你可以将其看作网络的“记忆”。理论上讲&a…...

Elasticsearch8.8.0 SpringBoot实战操作各种案例(索引操作、聚合、复杂查询、嵌套等)
Elasticsearch8.8.0 全网最新版教程 从入门到精通 通俗易懂 配置项目 引入依赖 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.16</version></dependency><dependency>&l…...