当前位置: 首页 > news >正文

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关键字声明的变量。

特性

  1. 类级别共享:静态变量属于类本身,而不是类的实例。所有实例共享同一个静态变量。意味着静态变量不依赖于实例而存在。
  2. 单一存储:在内存中只有一份静态变量,无论创建了多少个类的实例。
  3. 生命周期:静态变量在类加载时初始化,并在程序结束时销毁。
  4. 访问方式:可以通过类名直接访问,也可以通过实例访问(但不推荐)。

用法

声明静态变量

静态变量在类体中用 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 关键字修饰的方法,属于类本身,而不是类的实例。它们在类加载时就被初始化,可以不通过实例对象而直接调用。静态方法在很多情况下都非常有用,特别是在工具类中。

特性

  1. 类级别方法:静态方法属于类,可以直接通过类名调用,而不需要创建类的实例。
  2. 不能访问实例成员:静态方法不能直接访问类的实例变量和实例方法,因为它们不属于任何具体的实例。
  3. 可以访问静态成员:静态方法可以访问类的静态变量和其他静态方法。
  4. 无需对象:静态方法在调用时不需要创建对象,可以通过类名直接调用。

用法

声明静态方法

静态方法在类体中使用 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 中,尝试直接访问 instanceVarinstanceMethod 会导致编译错误,因为 instanceVarinstanceMethod 都是属于实例的,而不是类的。静态方法没有 this 引用,因此无法引用实例成员。


1.3 静态变量和静态方法在内存中

静态变量和静态方法都存储在方法区(Method Area)中

方法区是 JVM 内存的一部分,用于存储类结构信息(如类元数据、常量池)和静态变量。

内存简易图

在这里插入图片描述


二、继承

2.1 概念

继承(Inheritance)是面向对象编程中的重要概念之一,继承是一种类之间的关系,其中一个类(称为子类或派生类)根据规则可以继承另一个类(称为父类或基类)的属性和方法。继承可以避免重复编写相同的代码,更好地组织和管理类之间的关系。

例如,我们要实现学生类和老师类,学生和老师之间必然存在共性,比如都有名字,年龄等成员变量,以及可能有吃饭,睡觉等成员方法,那么就极有可能存在代码重复实现的情况。那我们就可以定义一个父类,比如person类,在类中有名字,年龄成员变量,以及一些成员方法,然后学生类和老师类再继承person类。

在这里插入图片描述

2.2 继承的特点和能继承什么

特点

  1. Java只支持单继承,不支持多继承,但支持多层继承
  2. 多层继承:子类A继承父类B,子类B继承父类C…
  3. 另外,所有其他类都直接或间接地继承自 Object类,因为Object 类是所有类的根类,Object 类定义了几个核心方法,包括 toString(), equals(), hashCode()

能够继承什么?
在这里插入图片描述

我们来挨个解释:
对于构造方法:无论构造方法是否是私有的,它都不能被继承,这是为了保证对象在创建过程中的合理初始化,以及遵循面向对象编程中的封装和可见性原则。

对于成员变量:

  • 子类继承父类时,会继承父类的成员变量。
  • 子类可以继承父类的 publicprotected 访问权限的成员变量。如果成员变量被声明为 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)是子类覆盖父类中具有相同名称和参数的方法。

重写的规则

  1. 必须是被子类继承的父类成员方法,才能是重写

  2. 方法签名:子类重写父类方法时,方法名、参数列表必须与父类方法完全相同。

  3. 访问修饰符:子类重写父类方法时,访问修饰符不能更严格。例如,如果父类方法是 protected,子类重写时可以使用 protected 或者 public,但不能使用 private 或者默认的(package-private)修饰符。

  4. 返回类型:重写方法的返回类型必须与被重写方法的返回类型相同,或者是其子类。

  5. @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关键字

thissuper 是两个关键字,用于引用当前对象和父类对象。它们在面向对象编程中有着不同的用途和作用域。

this 关键字

  1. 访问当前对象的属性和方法

    • 可以通过 this 关键字访问当前对象的属性和方法,避免命名冲突或者明确指出正在使用的对象是当前对象。
    class MyClass {private int number;public void setNumber(int number) {this.number = number; // 使用this访问当前对象的number属性}public int getNumber() {return this.number; // 使用this访问当前对象的number属性}
    }
    
  2. 在构造方法中调用其他构造方法

    • 可以使用 this() 调用本类的其他构造方法(必须位于构造方法的第一行)。
    class MyClass {private int number;// 构造方法1public MyClass() {this(0); // 调用另一个构造方法}// 构造方法2public MyClass(int number) {this.number = number;}
    }
    

super 关键字

  1. 访问父类的属性和方法

    • 可以使用 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");}
    }
    
  2. 调用父类的构造方法

    • 可以使用 super() 调用父类的构造方法,必须位于子类构造方法的第一行。
    class Parent {private int number;public Parent(int number) {this.number = number;}
    }class Child extends Parent {public Child(int number) {super(number); // 调用父类的构造方法}
    }
    
  3. 避免子类和父类同名字段的歧义

    • 在子类和父类中有同名字段时,可以使用 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 计算、函数、类型转换&#xff08;自动或手动&#xff09;导致索引失效10.2.5 范围条件右边的列索引失效10.2.6 不等于&#xff08;! 或者 <…...

工厂模式——工厂方法模式+注册表

工厂方法模式的瑕疵 在前一篇笔记中我们介绍了工厂方法模式&#xff0c;示例的类图如下&#xff1a; 考虑一种情况&#xff1a;现在要在程序运行时&#xff0c;根据外部资源&#xff0c;动态的实例化对象。也就是说在编译期我们无法知道要实例化的对象的类型。因此在实例化的过…...

实验一、网络传输介质————双绞线 《计算机网络》

蝙蝠身上长鸡毛&#xff0c;忘了自己是什么鸟。 目录 一、实验目的 二、实验内容 1.双绞线的原理以及分类 2.了解双绞线的性质、结构与特性 3.掌握双绞线的制作方法 4.了解双绞线的材质 5.了解双绞线的发展趋势 三、实验小结 一、实验目的 1.双绞线的原理以及分类 2.了…...

在Linux/Ubuntu/Debian中使用lshw查看系统信息

在Linux/Ubuntu/Debian中使用lshw查看系统信息 lshw 是一个用于显示硬件配置的命令&#xff0c;可以提供系统硬件的详细信息&#xff0c;包括 CPU、内存、硬盘、主板等。该命令需要超级用户权限来获取详细信息。 常见用法&#xff1a; 显示所有硬件信息&#xff1a; sudo l…...

提高篇(八):扩展Processing功能:从库使用到跨平台应用

提高篇(八):扩展Processing功能:从库使用到跨平台应用 引言 Processing是一款强大的创意编程工具,广泛应用于艺术、设计和教育等领域。但其真正的魅力在于其可扩展性:你可以通过使用各种扩展库、结合其他编程语言、在不同硬件平台上应用,甚至创建自己的扩展库来丰富Pro…...

ubuntu18.04环境下,arduino ide在打开串口监视器时报错

ubuntu18.04环境下&#xff0c;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&#x1f40b;&#x1f40b;史莱姆融合&#xff08;钻石&#xff1b;并查集&#xff09; 时间限制&#xff1a;1秒 占用内存&#xff1a;128M &#x1f41f;题目描述 &#x1f41f;题目思路 这道题目使用并查集&#xff0c;同一集合的所有元素的最顶上的祖父节点是统一的。…...

算法:前缀和题目练习

目录 题目一&#xff1a;一维前缀和[模版] 题目二&#xff1a;二维前缀和[模版] 题目三&#xff1a;寻找数组的中心下标 题目四&#xff1a;除自身以外数组的乘积 题目五&#xff1a;和为K的子数组 题目六&#xff1a;和可被K整除的子数组 题目七&#xff1a;连续数组 题…...

记录项目使用ts时引入js文件后导致项目运行空白问题

主要原因&#xff1a; 使用ts后开启了eslint检测&#xff0c;而js压缩文件引入的位置在eslint检测的文件内。导致eslint检测认为该文件为很大的文件&#xff0c;或eslint认为此文件内存在无法处理的语法结构等问题。 解决方法&#xff1a; 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地址组成&#xff0c;但是为了有个规范&#xff0c;而且我们也不可能去记住那么多一串Ip数字&#xff0c;首先域名就会比ip好记很多&#xff0c;其次固定性&#xff0c;一旦服务器换了&#xff0c;只要重新绑定域名对…...

华为端云一体化开发 (起步1.0)(HarmonyOS学习第七课)

官方文献&#xff1a; 为丰富HarmonyOS对云端开发的支持、实现端云联动&#xff0c;DevEco Studio推出了云开发功能&#xff0c;开发者在创建工程时选择云开发模板&#xff0c;即可在DevEco Studio内同时完成HarmonyOS应用/元服务的端侧与云侧开发&#xff0c;体验端云一体化协…...

数据结构之ArrayList与顺序表(上)

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;数据结构&#xff08;Java版&#xff09; 顺序表的学习&#xff0c;点我 上面这篇博文是关于顺序表的基础知识&#xff0c;以及顺序表的实现。…...

Java 8 中的 Stream API,用于处理集合数据

Java 8 引入了 Stream API&#xff0c;使得处理集合数据变得更加简洁和高效。Stream API 允许开发者以声明式编程风格操作数据集合&#xff0c;而不是使用传统的迭代和条件语句。 一、基本概念 1.1 什么是 Stream Stream 是 Java 8 中的一个新抽象&#xff0c;它允许对集合数…...

106、python-第四阶段-3-设计模式-单例模式

不是单例类&#xff0c;如下&#xff1a; class StrTools():pass str1StrTools() str2StrTools() print(str1) print(str2) 运用单例&#xff0c;先创建一个test.py class StrTools():pass str1StrTools()然后创建一个hello.py&#xff0c;在这个文件中引用test.py中的对象&a…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

超短脉冲激光自聚焦效应

前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应&#xff0c;这是一种非线性光学现象&#xff0c;主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场&#xff0c;对材料产生非线性响应&#xff0c;可能…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么&#xff1f; WebAssembly&#xff08;WASM&#xff09; 是一种能在现代浏览器中高效运行的二进制指令格式&#xff0c;它不是传统的编程语言&#xff0c;而是一种 低级字节码格式&#xff0c;可由高级语言&#xff08;如 C、C、Rust&am…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...

深度学习水论文:mamba+图像增强

&#x1f9c0;当前视觉领域对高效长序列建模需求激增&#xff0c;对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模&#xff0c;以及动态计算优势&#xff0c;在图像质量提升和细节恢复方面有难以替代的作用。 &#x1f9c0;因此短时间内&#xff0c;就有不…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...