this,构造器,static,final,单例模式
this关键字
在java中this是一个引用变量,即指向当前对象地址的引用(指针),→可以把this当作当前对象,便于更好的索引.
this()实际是调用了当前对象的构造器1. 引用当前对象的属性
- 当在方法中要访问当前对象的属性时,可以用this来区分局部变量与全局变量.若局部变量和全局变量同名,this指向的属性是全局变量
public class MyClass {
private int value; public MyClass(int value) {
this.value = value; // this.value引用的是成员变量value,而value是参数
} public void setValue(int value) {
this.value = value; // 同样,this.value引用的是成员变量value
} public int getValue() {
return this.value; // 虽然这里不使用this也能访问value,但使用this可以增加代码的可读性
}
}
- 调用当前对象的其他方法
- 在方法内部也可以用this来调用当前对象的其他方法,(包括构造方法)
public class MyClass {
public MyClass() {
this.initialize(); // 调用当前对象的initialize方法
} public void initialize() {
// 初始化代码...
}
}
3.引用当前对象的构造方法
- this()可以在构造方法是调用同一个类的其他构造方法,但必须放在第一行,这样的好处是实现构造方法的重写与复用
public class MyClass {
private int value; public MyClass() {
this(0); // 调用带有单个参数的构造方法
} public MyClass(int value) {
this.value = value;
}
}
- 在事件监听器中使用
当在事件监听器(如
ActionListener)中需要引用触发事件的组件时,可以使用this关键字(如果监听器是内部类并且需要引用外部类的实例)。5.在匿名内部类中使用
在匿名内部类(如线程、事件监听器等)中,
this关键字通常指向外部类的实例,而如果要引用匿名内部类的实例,则没有直接的this引用,通常需要使用其他方式(如将匿名内部类的实例赋值给一个变量)。
构造器(构造函数)
是创建(new)对象时java会默认调用的方法,通常用给对象传递参数来赋值,
语法
- 构造函数没有返回值,没有void,int 等等
- 构造函数名必须与类名一致
- 在构造函数中要第一所传入的参数列表→非必须
默认构造器
权限修饰符 类名()
{
//初始化等功能..
}
带参构造器(常用)
权限修饰符 类名(数据类型 参数)
{
//初始化等功能..
}
注意点:
- 如果一个类中只有带参构造器,则默认的构造器就会被覆盖→消失,如果还有需要默认构造器,则需显示性定义
- 同一个类中的构造器可以相互调用,需要用this()来调用,this必须放在第一行→无参构造器托付有参构造器进行构造
public class Person {
private String name;
private int age;
// 无参构造函数
public Person() {
this("Unknown", 0); // 使用this()调用另一个构造函数
//通过this之间调用有参构造函数
}
// 带两个参数的构造函数
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// 省略getter和setter方法...
public static void main(String[] args) {
Person unknownPerson = new Person(); // 调用无参构造函数,实际上会委托给带两个参数的构造函数
System.out.println("Name: " + unknownPerson.getName() + ", Age: " + unknownPerson.getAge());
Person knownPerson = new Person("John Doe", 30);
System.out.println("Name: " + knownPerson.getName() + ", Age: " + knownPerson.getAge());
}
}
- 在构造器中调用其他构造器,不会创建对象,只会初始化
public class Example {
private int x;
private String y;
// 第一个构造器,带有两个参数
public Example(int x, String y) {
this.x = x;
this.y = y;
System.out.println("Two-argument constructor called.");
}
// 第二个构造器,无参数,通过this()调用第一个构造器
public Example() {
this(10, "Default"); // 使用this()调用带有两个参数的构造器
System.out.println("No-argument constructor called.");
}
public static void main(String[] args) {
Example obj = new Example(); // 调用无参数构造器
}
}
static关键字
内存角度分析:当我们执行一个java文件时,java虚拟机会优先加载方法区中的内容,若遇到stati代码块,则立即运行.也就是说用static关键字修饰的内容在对象还未创建之前就被分配了内存空间,这也是我们为什么能够直接使用类名.方法或类名.变量名去调用类变量和类方法的原因,也是为什么我们不能在类方法中使用实例变量和普通方法的原因。
- static一般用来修饰成员变量或者函数
- 被static修饰的变量名叫类变量,方法叫类方法
- 被static关键字修饰的不需要去创建对象去调用,可以直接用类名.调用
- 作用:方便再没有创建对象的情况下来进行调用
简单理解为被static修饰的方法或变量是存放再方法区与类信息存放在一起
static比实例化对象先分配内存空间

final关键字
可用来修饰变量和成员方法以及类
final类
- 当final修饰类时,该类不可被继承.
final方法
- 当一个方法被final修饰时,该方法不可被覆盖→重写
- 应用场景:当你希望如果你希望某个方法的行为在整个类层次结构中保持一致,并且不希望被子类改变,那么你可以将其声明为
final
final变量
- 实例变量:当一个实例变量被修饰成final时,它只能在声明时或者构造方法中被赋值,且只能被赋值一次
- 静态变量:与实例变量情况相同,必须在声明或者静态语句块中被赋值,且只能赋值一次
- 局部变量:即方法中的变量,在声明时可以不要立即赋值,但使用前必须赋值
final参数
- 当一个方法的参数被final修饰时,在这个方法内部不可再被赋值
单例模式
单例模式:是一种设计模式,它确保一个类只能有一个实例,并提供一个全局访问的点来访问这唯一的实例对象, -这个模式在多线程环境和一些需要频繁创建和销毁对象但又希望限制这些对象数量的场景中特别有用-。
懒汉式→多线程下不安全,但节省内存空间
public class Singleton {
private static Singleton singleton; //
//通过声明一个静态的私有成员变量,并且在该类被加载到JVM时立即初始化这个变量
//我们创建了一个类的唯一实例。由于是静态的,这个实例与类本身相关联,而不是与类的某个特定实例相关联。
//同时,由于是私有的,外部代码无法直接访问这个变量,只能通过类提供的公共方法来获取它的值。
private Singleton() { //将构造函数设为私有化,目的是防止外部代码通过new创建实例对象
//它确保了除了类本身之外,没有其他代码能够实例化这个类
}
public static Singleton getSingleton() {
//外部代码可以获取到类的唯一实例。
由于这个方法是静态的,我们不需要先创建类的实例就可以调用它。
在方法内部,我们检查instance是否已经被初始化(即是否为null)。
如果是,我们就创建一个新的实例并赋值给singleton;如果不是(即singleton已经被初始化过),我们就直接返回singleton。
由于我们之前已经将构造函数设置为私有,并且singleton是静态的且只被初始化一次,
所以getSingleton()方法将始终返回同一个实例
if(singleton == null) {
singleton = new Singleton();
}
return singleton;
}
}
- 懒汉式单例模式在第一次被调用时才会创建实例,而不是在类加载时立即创建。
饿汉式→可以适用多线程,但消耗内存空间
public class Singleton2 {
Singleton2 类中的静态成员变量 singleton 在声明的同时就被初始化了。
这个初始化是在类被 JVM 加载到内存时发生的,且只会发生一次。
由于是静态的,所以不需要创建类的实例就可以访问它
private static Singleton2 singleton = new Singleton2();
private Singleton2() {
//使外部不能创建singleton
}
public static Singleton2 getSingleton() {
return singleton;
etSingleton() 是一个公共的静态方法,用于返回 Singleton2 类的单例实例。
由于 singleton 已经在类加载时初始化了,所以无论多少次调用 getSingleton(),
它都会返回同一个实例。
}
}
- 饿汉式即无论如何先创建一个实例化对象,接下来无论几次调用都返回同一个对象
this,构造器,static,final,单例模式的更多相关文章
- 为什么构造器不能是abstract, static, final, native or synchronized的?
Unlike methods, a constructor cannot be abstract, static, final, native or synchronized. 1. A const ...
- [转]java static final 初始化
http://tanbing1986411.blog.163.com/blog/static/7259798220103610224434/ java static final 初始化 1.stati ...
- String的实例化与static final修饰符
String两种实例化方式 一种是通过双引号直接赋值的方式,另外一种是使用标准的new调用构造方法完成实例化.如下: String str = "abcd"; String str ...
- static 和 final 和 static final
众所周知,static 是静态修饰关键字:可以修饰变量,程序块,方法,类. 1.修饰变量. 得知:如果static修饰的是变量,则JVM会将将其分配在内存堆上,该变量就与对象无关,所有对该变量的引用都 ...
- static final与final修饰的常量有什么不同
最近重头开始看基础的书,对一些基础的概念又有了一些新的理解,特此记录一下 static final修饰的常量: 静态常量(static修饰的全部为静态的),编译器常量,编译时就确定其值(java代码经 ...
- Java 基础 enum枚举类 的创建/使用/接口继承 ,以及手动创建枚举类的对象为:public static final
笔记: import java.lang.*; /**一:枚举类 : enum Season implements info { s1(),s2(),s3(),s4() }; //s1--s4 放在S ...
- 构造函数为何不能用abstract, static, final修饰
不同于方法,构造器不能是abstract, static, final的. 1.构造器不是通过继承得到的,所以没有必要把它声明为final的. 2.同理,一个抽象的构造器将永远不会被实现,所以它也不能 ...
- <init>与<clinit>,static与final与static final
<init>和<clinit> init是对象构造器方法,初始化对象的时候执行 clinit是类构造器方法,类加载的初始化阶段执行 final常量赋值(必须是一下其中一种) 显 ...
- 关键字——this,super,static,final
this 理解为当前对象. //测试 public static void main(String[] args){ Person person = new Person(3, "xiaoM ...
- Java 关键字static final使用总结
Static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,被static修饰的成员变量和成员方法独立于该类的任何对象.也就是说,它不依赖类特定的实例,被 ...
随机推荐
- python 虚拟环境篇
前言 这个倒是非常之重要. 首先我们知道python通过pip安装,那么我们安装的所有东西都会在我们pip下的配置目录下,这会显得非常臃肿,同样也让我们部署艰难. python虚拟环境,他是这样做的, ...
- K8s集群nginx-ingress监控告警最佳实践
本文分享自华为云社区<K8s集群nginx-ingress监控告警最佳实践>,作者:可以交个朋友. 一 背景 nginx-ingress作为K8s集群中的关键组成部分.主要负责k8s集群中 ...
- 《Effective C#》系列之(四)——最小化内存泄露和资源占用
一.内存泄露 在<Effective C#>这本书中,最小化资源泄漏是其中一章的内容.以下是该章节的一些核心建议,以及使用C#代码示例说明: 及时释放非托管资源:在使用非托管资源时,需要手 ...
- C#的窗体假关闭操作例子 - 开源研究系列文章
晚上编码的时候,想到了以前编写的窗体关闭的事情,就是带托盘图标的应用,有一个主显示操作窗体,但是主窗体点击关闭按钮的时候,实际上是窗体隐藏而非真正关闭,这个在其它的一些应用程序里有这个效果.于是就想到 ...
- 推荐一波微软家的浏览器:EDGE
前段时间英雄联盟(LOL)队伍 EDG 夺冠成为热门事件,上了各大热搜,即使大家不玩英雄联盟,相信也多多少少有听说相关信息吧! 今天我们的主角并不是 EDG,而是微软的新版浏览器 EDGE !!! 微 ...
- 力扣168(java)-Excel表列名称(简单)
题目: 给你一个整数 columnNumber ,返回它在 Excel 表中相对应的列名称. 例如: A -> 1B -> 2C -> 3...Z -> 26AA -> ...
- 基于开源PolarDB-X打造中正智能身份认证业务数据基座
简介: 在10月25日由阿里云开发者社区.PolarDB开源社区.infoQ联合举办的「开源人说」第三期--<数据库PolarDB专场>沙龙上,中正智能科技有限公司平台软件部研发总监韩毅带 ...
- 行业实战 | 5G+边缘计算+“自由视角” 让体育赛事更畅快
简介: 世界本是多维的.进入5G时代,观众对多维度视觉体验的需求日益增长,5G MEC网络与边缘计算的结合,具备大带宽.低延迟特性,使视频多维视觉呈现成为现实.在第二十三届CUBA中国大学生篮球联赛期 ...
- 无处不在的 Kubernetes,难用的问题解决了吗?
简介: 从第三方的调研数据看,容器和 Kubernetes 已经成为云原生时代主流的选择,但实际落地的时候,却陷入了困境.我们尝试去总结了一些共通点,以及应对方案,也许能为正在落地容器技术的企业提供 ...
- 什么是 objdump 命令
objdump 是在类 Unix 操作系统上显示关于目标文件的各种信息的命令行程序. 它以一种可阅读的格式让你更多地了解二进制文件可能带有的附加信息. 简单来说,和 IDA 这类软件都可用于反汇编. ...