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修饰的成员变量和成员方法独立于该类的任何对象.也就是说,它不依赖类特定的实例,被 ...
随机推荐
- js es6 模板字符
前言 es的模板字符,也就是定义了块的概念. 模板字符的二个条件: 1.必须在``中,这个`不是单引号而是反单引号,是tab的上面一个. 2.在#{}中,这个就有点意思了,里面不像后台的块级,在这里不 ...
- 技术人如何"结构化"高效思考?
1 前言 你是否在解决问题时,常常觉得脑子很乱,很多零散的信息迸发出来,但就是无法形成解决方案. 之所以这样,原因就在于,我们的大脑处理不了太多零散而复杂的信息.人类大脑在处理信息的时候,有两个规律: ...
- JVM简明笔记4:垃圾回收
1 垃圾回收相关算法 垃圾回收器首先要做的就是,判断一个对象是存活状态还是死亡状态,死亡的对象将会被标识为垃圾数据并等待收集器进行清除. 判断一个对象是否为死亡状态的常用算法有两个:引用计数器算法 . ...
- HarmonyOS NEXT应用开发之MpChart图表实现案例
介绍 MpChart是一个包含各种类型图表的图表库,主要用于业务数据汇总,例如销售数据走势图,股价走势图等场景中使用,方便开发者快速实现图表UI.本示例主要介绍如何使用三方库MpChart实现柱状图U ...
- PolarDB-X 如何做分布式数据库热点分析
简介: PolarDB-X 是一款计算存储分离的云原生分布式数据库,在PolarDB-X 2.0的AUTO模式下,数据库会按照表的主键自动Hash分区,将数据均匀的分布到各个数据节点中,最理想的情况是 ...
- 工商银行分布式服务 C10K 场景解决方案
简介: Dubbo 是一款轻量级的开源 Java 服务框架,是众多企业在建设分布式服务架构时的首选.中国工商银行自 2014 年开始探索分布式架构转型工作,基于开源 Dubbo 自主研发了分布式服务平 ...
- 如何通过Graph+AI的方法打造高精度风控模型
简介: 阿里云图智能平台在金融行业已经帮助银行.保险等领域客户构建了金融风控.商品推荐.循环担保检测.异常指标监控.违规团伙挖掘等场景,通过穿透行业应用场景,帮助客户基于多维数据做出精准决策. > ...
- dotnet 8 破坏性改动 在 AssemblyInformationalVersionAttribute 添加上 git 的 commit 号
我在一个 WPF 项目里面,在界面显示应用的版本号,更新到 dotnet 8 的 SDK 之后,发现我的界面布局损坏了.本质上这个破坏性改动和 WPF 没有什么关系,是 dotnet 的 SDK 或编 ...
- 将Go开发的代码部署到k8s集群
一.在服务器上编译go程序 1.1 编译go语言程序 # 安装go yum install go -y mkdir /root/test && cd /root/test # 设置代理 ...
- 【PG】PostgreSQL12安装
场景:感受一下PostgreSQL12.可以通过如下方式安装: 1.创建psotgres用户 groupadd postgres useradd -g postgres postgres 2.查看操作 ...