Java——面向对象进阶(一)

前言
面向对象进阶(一):static,继承,this和super关键字
文章目录
- 一、static
- 1.1 静态变量
- 1.2 静态方法
- 1.3 静态变量和静态方法在内存中
- 二、继承
- 2.1 概念
- 2.2 继承的特点和能继承什么
- 2.3 继承中的重写
- 2.4 this和super关键字
一、static
在 Java 中,
static关键字用于声明类中的静态成员(包括字段、方法、内部类和代码块)。静态成员属于类本身,而不是类的实例。
1.1 静态变量
静态变量(也称为类变量)是在类中使用
static关键字声明的变量。
特性
- 类级别共享:静态变量属于类本身,而不是类的实例。所有实例共享同一个静态变量。意味着静态变量不依赖于实例而存在。
- 单一存储:在内存中只有一份静态变量,无论创建了多少个类的实例。
- 生命周期:静态变量在类加载时初始化,并在程序结束时销毁。
- 访问方式:可以通过类名直接访问,也可以通过实例访问(但不推荐)。
用法
声明静态变量
静态变量在类体中用 static 关键字声明。通常在类的顶部声明。
public class MyClass {public static int staticVar = 0;
}
访问静态变量
静态变量可以通过类名直接访问,也可以通过实例访问。
public class Main {public static void main(String[] args) {// 通过类名访问静态变量MyClass.staticVar = 5;System.out.println(MyClass.staticVar); // 输出: 5// 通过实例访问静态变量(不推荐)MyClass obj1 = new MyClass();MyClass obj2 = new MyClass();obj1.staticVar = 10;System.out.println(obj2.staticVar); // 输出: 10,因为obj1和obj2共享同一个静态变量}
}
示例:计数器
静态变量的一个常见用法是作为计数器,记录创建的实例数量。
public class Counter {public static int count = 0;public Counter() {count++;}public static void displayCount() {System.out.println("Number of instances: " + count);}
}public class Main {public static void main(String[] args) {Counter obj1 = new Counter();Counter obj2 = new Counter();Counter obj3 = new Counter();Counter.displayCount(); // 输出: Number of instances: 3}
}
在这个例子中,每次创建 Counter 类的实例时,静态变量 count 都会增加1。由于 count 是静态变量,它在所有实例中共享,因此可以准确记录创建的实例数量。
1.2 静态方法
静态方法(Static Methods)是用 static 关键字修饰的方法,属于类本身,而不是类的实例。它们在类加载时就被初始化,可以不通过实例对象而直接调用。静态方法在很多情况下都非常有用,特别是在工具类中。
特性
- 类级别方法:静态方法属于类,可以直接通过类名调用,而不需要创建类的实例。
- 不能访问实例成员:静态方法不能直接访问类的实例变量和实例方法,因为它们不属于任何具体的实例。
- 可以访问静态成员:静态方法可以访问类的静态变量和其他静态方法。
- 无需对象:静态方法在调用时不需要创建对象,可以通过类名直接调用。
用法
声明静态方法
静态方法在类体中使用 static 关键字声明。
public class MyClass {public static void staticMethod() {System.out.println("This is a static method.");}
}
访问静态方法
静态方法可以通过类名直接调用,也可以通过实例调用(但不推荐)。
public class Main {public static void main(String[] args) {// 通过类名调用静态方法MyClass.staticMethod();// 通过实例调用静态方法(不推荐)MyClass obj = new MyClass();obj.staticMethod();}
}
示例:实用工具类
静态方法非常适合用来实现实用工具类中的一些方法。例如,数学运算方法、字符串处理方法等。
工具类(Utility Class)是在编程中常用的一种类,专门用于封装一组静态方法,这些方法通常是与特定任务相关的通用功能。工具类的主要特点是它们不需要实例化,可以直接通过类名调用其方法。常见的工具类包括用于字符串处理、数学运算、日期时间操作等功能的类。
public class MathUtils {public static int add(int a, int b) {return a + b;}public static int multiply(int a, int b) {return a * b;}
}public class Main {public static void main(String[] args) {int sum = MathUtils.add(5, 3);int product = MathUtils.multiply(4, 2);System.out.println("Sum: " + sum); // 输出: Sum: 8System.out.println("Product: " + product); // 输出: Product: 8}
}
静态方法不能直接访问实例变量和实例方法,举例:
public class Example {// 实例变量private int instanceVar = 42;// 实例方法public void instanceMethod() {System.out.println("Instance method called. Instance variable: " + instanceVar);}// 静态方法public static void staticMethod() {// 试图访问实例变量 - 这会导致编译错误// System.out.println("Instance variable: " + instanceVar);// 试图调用实例方法 - 这会导致编译错误// instanceMethod();// 正确的访问方式:静态方法只能访问静态变量和静态方法System.out.println("Static method called.");}// 静态变量public static int staticVar = 84;// 另一个静态方法public static void anotherStaticMethod() {System.out.println("Another static method called. Static variable: " + staticVar);}
}public class Main {public static void main(String[] args) {// 调用静态方法Example.staticMethod();// 创建类的实例Example example = new Example();// 调用实例方法example.instanceMethod();// 调用另一个静态方法Example.anotherStaticMethod();}
}
解释:在 staticMethod 中,尝试直接访问 instanceVar 和 instanceMethod 会导致编译错误,因为 instanceVar 和 instanceMethod 都是属于实例的,而不是类的。静态方法没有 this 引用,因此无法引用实例成员。
1.3 静态变量和静态方法在内存中
静态变量和静态方法都存储在方法区(Method Area)中
方法区是 JVM 内存的一部分,用于存储类结构信息(如类元数据、常量池)和静态变量。
内存简易图

二、继承
2.1 概念
继承(Inheritance)是面向对象编程中的重要概念之一,继承是一种类之间的关系,其中一个类(称为子类或派生类)根据规则可以继承另一个类(称为父类或基类)的属性和方法。继承可以避免重复编写相同的代码,更好地组织和管理类之间的关系。
例如,我们要实现学生类和老师类,学生和老师之间必然存在共性,比如都有名字,年龄等成员变量,以及可能有吃饭,睡觉等成员方法,那么就极有可能存在代码重复实现的情况。那我们就可以定义一个父类,比如person类,在类中有名字,年龄成员变量,以及一些成员方法,然后学生类和老师类再继承person类。

2.2 继承的特点和能继承什么
特点
- Java只支持单继承,不支持多继承,但支持多层继承
- 多层继承:子类A继承父类B,子类B继承父类C…
- 另外,所有其他类都直接或间接地继承自
Object类,因为Object类是所有类的根类,Object 类定义了几个核心方法,包括toString(),equals(),hashCode()
能够继承什么?

我们来挨个解释:
对于构造方法:无论构造方法是否是私有的,它都不能被继承,这是为了保证对象在创建过程中的合理初始化,以及遵循面向对象编程中的封装和可见性原则。
对于成员变量:
- 子类继承父类时,会继承父类的成员变量。
- 子类可以继承父类的
public和protected访问权限的成员变量。如果成员变量被声明为private,则子类无法直接访问该成员变量,需要借助继承自父类的get/set方法。 - 如果子类定义了与父类同名的成员变量,那么父类的成员变量会被子类的成员变量隐藏。这种情况下,可以使用
super关键字访问父类被隐藏的成员变量。(super 关键字在 Java 中用于调用父类的构造方法和访问被隐藏的父类成员变量或方法。)
子类定义了与父类同名的成员变量,用 super 关键字
class Parent {public int number = 10;public void display() {System.out.println("Parent's number: " + number);}
}class Child extends Parent {public int number = 20;public void display() {super.display(); // 调用父类的 display 方法System.out.println("Child's number: " + number);System.out.println("Parent's number: " + super.number); // 访问父类的成员变量}
}
对于成员方法:
- 子类可以继承父类的非私有成员方法。
private方法不可继承,因为它们对子类不可见。 - 子类可以提供自己的实现来覆盖从父类继承的同名方法(重写)。
- final 修饰的方法不能被子类重写,因此不能继承。
- static 方法属于类级别的方法,不属于实例,不能被继承。
2.3 继承中的重写
方法的重写(Override)是子类覆盖父类中具有相同名称和参数的方法。
重写的规则
-
必须是被子类继承的父类成员方法,才能是重写
-
方法签名:子类重写父类方法时,方法名、参数列表必须与父类方法完全相同。
-
访问修饰符:子类重写父类方法时,访问修饰符不能更严格。例如,如果父类方法是
protected,子类重写时可以使用protected或者public,但不能使用private或者默认的(package-private)修饰符。 -
返回类型:重写方法的返回类型必须与被重写方法的返回类型相同,或者是其子类。
-
@Override 注解可以帮助编译器验证是否成功重写了父类方法。
示例
下面是一个展示方法重写的示例:
// 父类
class Parent {// 父类方法public void display() {System.out.println("Parent's display method");}
}// 子类继承自父类
class Child extends Parent {// 重写父类的 display() 方法@Overridepublic void display() {System.out.println("Child's overridden display method");}
}// 主类
public class Main {public static void main(String[] args) {// 创建子类对象Child child = new Child();// 调用子类重写的方法child.display(); // 输出: Child's overridden display method}
}
2.4 this和super关键字
this和super是两个关键字,用于引用当前对象和父类对象。它们在面向对象编程中有着不同的用途和作用域。
this 关键字
-
访问当前对象的属性和方法:
- 可以通过
this关键字访问当前对象的属性和方法,避免命名冲突或者明确指出正在使用的对象是当前对象。
class MyClass {private int number;public void setNumber(int number) {this.number = number; // 使用this访问当前对象的number属性}public int getNumber() {return this.number; // 使用this访问当前对象的number属性} } - 可以通过
-
在构造方法中调用其他构造方法:
- 可以使用
this()调用本类的其他构造方法(必须位于构造方法的第一行)。
class MyClass {private int number;// 构造方法1public MyClass() {this(0); // 调用另一个构造方法}// 构造方法2public MyClass(int number) {this.number = number;} } - 可以使用
super 关键字
-
访问父类的属性和方法:
- 可以使用
super关键字访问父类中的属性和方法,特别是在子类中覆盖(重写)父类方法时,可以使用super调用父类的方法。
class Parent {private int number;public Parent(int number) {this.number = number;}public void display() {System.out.println("Number: " + number);} }class Child extends Parent {public Child(int number) {super(number); // 调用父类的构造方法}@Overridepublic void display() {super.display(); // 调用父类的display方法System.out.println("Child's display method");} } - 可以使用
-
调用父类的构造方法:
- 可以使用
super()调用父类的构造方法,必须位于子类构造方法的第一行。
class Parent {private int number;public Parent(int number) {this.number = number;} }class Child extends Parent {public Child(int number) {super(number); // 调用父类的构造方法} } - 可以使用
-
避免子类和父类同名字段的歧义:
- 在子类和父类中有同名字段时,可以使用
super关键字访问父类中的字段,以避免歧义。
class Parent {protected int number = 10; }class Child extends Parent {private int number = 20;public void display() {System.out.println("Child's number: " + number); // 输出20System.out.println("Parent's number: " + super.number); // 输出10} } - 在子类和父类中有同名字段时,可以使用
区别和总结
this关键字用于引用当前对象,可以访问当前对象的属性、方法和构造方法。super关键字用于引用父类对象,可以访问父类的属性、方法和构造方法。

如果你喜欢这篇文章,点赞👍+评论+关注⭐️哦!
欢迎大家提出疑问,以及不同的见解。
相关文章:
Java——面向对象进阶(一)
前言 面向对象进阶(一):static,继承,this和super关键字 文章目录 一、static1.1 静态变量1.2 静态方法1.3 静态变量和静态方法在内存中 二、继承2.1 概念2.2 继承的特点和能继承什么2.3 继承中的重写2.4 this和super关键字 一、static 在 Jav…...
JDBC是什么?它如何工作?
一、JDBC概述 JDBC(Java Database Connectivity)是Java语言与数据库之间进行交互的API。它允许Java程序通过SQL(结构化查询语言)来执行各种数据库操作,如查询、更新、删除等。JDBC是Java应用程序访问数据库的标准方式…...
Qt:QDialogButtonBox的使用
QDialogButtonBox是Qt自带的按钮箱,通过枚举QDialogButtonBox::ButtonRole可以添加Qt定义按钮,或者通过方法QDialogButtonBox::addButton添加自定义的按钮。 // 自定义按钮。 button_box_ new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonB…...
38页 | 工商银行大数据平台助力全行数字化转型之路(免费下载)
【1】关注本公众号,转发当前文章到微信朋友圈 【2】私信发送 工商银行大数据平台 【3】获取本方案PDF下载链接,直接下载即可。 如需下载本方案PPT/WORD原格式,请加入微信扫描以下方案驿站知识星球,获取上万份PPT/WORD解决方案&a…...
【Git】如何不管本地文件,强制git pull
要在 Git 中强制执行 git pull 操作,忽略本地文件的更改,可以按照以下步骤操作: 保存当前工作状态:如果你有未提交的更改,可以使用 git stash 将这些更改存储起来。 git stash强制拉取最新代码:使用 git re…...
MySQL 高级 - 第十一章 | 索引优化与查询优化
目录 第十一章 索引优化与查询优化11.1 数据准备11.2 索引失效案例11.2.1 全值匹配10.2.2 最佳左前缀法则10.2.3 主键插入顺序10.2.4 计算、函数、类型转换(自动或手动)导致索引失效10.2.5 范围条件右边的列索引失效10.2.6 不等于(! 或者 <…...
工厂模式——工厂方法模式+注册表
工厂方法模式的瑕疵 在前一篇笔记中我们介绍了工厂方法模式,示例的类图如下: 考虑一种情况:现在要在程序运行时,根据外部资源,动态的实例化对象。也就是说在编译期我们无法知道要实例化的对象的类型。因此在实例化的过…...
实验一、网络传输介质————双绞线 《计算机网络》
蝙蝠身上长鸡毛,忘了自己是什么鸟。 目录 一、实验目的 二、实验内容 1.双绞线的原理以及分类 2.了解双绞线的性质、结构与特性 3.掌握双绞线的制作方法 4.了解双绞线的材质 5.了解双绞线的发展趋势 三、实验小结 一、实验目的 1.双绞线的原理以及分类 2.了…...
在Linux/Ubuntu/Debian中使用lshw查看系统信息
在Linux/Ubuntu/Debian中使用lshw查看系统信息 lshw 是一个用于显示硬件配置的命令,可以提供系统硬件的详细信息,包括 CPU、内存、硬盘、主板等。该命令需要超级用户权限来获取详细信息。 常见用法: 显示所有硬件信息: sudo l…...
提高篇(八):扩展Processing功能:从库使用到跨平台应用
提高篇(八):扩展Processing功能:从库使用到跨平台应用 引言 Processing是一款强大的创意编程工具,广泛应用于艺术、设计和教育等领域。但其真正的魅力在于其可扩展性:你可以通过使用各种扩展库、结合其他编程语言、在不同硬件平台上应用,甚至创建自己的扩展库来丰富Pro…...
ubuntu18.04环境下,arduino ide在打开串口监视器时报错
ubuntu18.04环境下,arduino ide在打开串口监视器时报错 Exception in thread “AWT-EventQueue-0” java.lang.UnsatisfiedLinkError: /home/lzx/.jssc/linux/libjSSC-2.8_x86_64.so: /home/lzx/.jssc/linux/libjSSC-2.8_x86_64.so: file too short 这个错误表明 li…...
码蹄集部分题目(2024OJ赛18期;并查集+ST表+贪心)
1🐋🐋史莱姆融合(钻石;并查集) 时间限制:1秒 占用内存:128M 🐟题目描述 🐟题目思路 这道题目使用并查集,同一集合的所有元素的最顶上的祖父节点是统一的。…...
算法:前缀和题目练习
目录 题目一:一维前缀和[模版] 题目二:二维前缀和[模版] 题目三:寻找数组的中心下标 题目四:除自身以外数组的乘积 题目五:和为K的子数组 题目六:和可被K整除的子数组 题目七:连续数组 题…...
记录项目使用ts时引入js文件后导致项目运行空白问题
主要原因: 使用ts后开启了eslint检测,而js压缩文件引入的位置在eslint检测的文件内。导致eslint检测认为该文件为很大的文件,或eslint认为此文件内存在无法处理的语法结构等问题。 解决方法: 1、把文件移到eslint检测外的文件引入…...
Kafka消费者api编写教程
1.基本属性配置 输入new Properties().var 回车 //创建属性Properties properties new Properties();//连接集群properties.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,"node1:9092,node2:9092");//反序列化properties.put(ConsumerConfig.KEY_DESERIALIZER_CL…...
什么情况下要配置DNS服务
什么是DNS 一、DNS就是域名解析 我们上网的方式通常都由ip地址组成,但是为了有个规范,而且我们也不可能去记住那么多一串Ip数字,首先域名就会比ip好记很多,其次固定性,一旦服务器换了,只要重新绑定域名对…...
华为端云一体化开发 (起步1.0)(HarmonyOS学习第七课)
官方文献: 为丰富HarmonyOS对云端开发的支持、实现端云联动,DevEco Studio推出了云开发功能,开发者在创建工程时选择云开发模板,即可在DevEco Studio内同时完成HarmonyOS应用/元服务的端侧与云侧开发,体验端云一体化协…...
数据结构之ArrayList与顺序表(上)
找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程(ಥ_ಥ)-CSDN博客 所属专栏:数据结构(Java版) 顺序表的学习,点我 上面这篇博文是关于顺序表的基础知识,以及顺序表的实现。…...
Java 8 中的 Stream API,用于处理集合数据
Java 8 引入了 Stream API,使得处理集合数据变得更加简洁和高效。Stream API 允许开发者以声明式编程风格操作数据集合,而不是使用传统的迭代和条件语句。 一、基本概念 1.1 什么是 Stream Stream 是 Java 8 中的一个新抽象,它允许对集合数…...
106、python-第四阶段-3-设计模式-单例模式
不是单例类,如下: class StrTools():pass str1StrTools() str2StrTools() print(str1) print(str2) 运用单例,先创建一个test.py class StrTools():pass str1StrTools()然后创建一个hello.py,在这个文件中引用test.py中的对象&a…...
【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...
论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving
地址:LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂,正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...
在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例
目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码:冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...
加密通信 + 行为分析:运营商行业安全防御体系重构
在数字经济蓬勃发展的时代,运营商作为信息通信网络的核心枢纽,承载着海量用户数据与关键业务传输,其安全防御体系的可靠性直接关乎国家安全、社会稳定与企业发展。随着网络攻击手段的不断升级,传统安全防护体系逐渐暴露出局限性&a…...
goreplay
1.github地址 https://github.com/buger/goreplay 2.简单介绍 GoReplay 是一个开源的网络监控工具,可以记录用户的实时流量并将其用于镜像、负载测试、监控和详细分析。 3.出现背景 随着应用程序的增长,测试它所需的工作量也会呈指数级增长。GoRepl…...
