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可以增加代码的可读性
    }
    }
    1. 调用当前对象的其他方法
    • 在方法内部也可以用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;
    }
    }
    1. 在事件监听器中使用

    当在事件监听器(如ActionListener)中需要引用触发事件的组件时,可以使用this关键字(如果监听器是内部类并且需要引用外部类的实例)。

  • 5.在匿名内部类中使用

    在匿名内部类(如线程、事件监听器等)中,this关键字通常指向外部类的实例,而如果要引用匿名内部类的实例,则没有直接的this引用,通常需要使用其他方式(如将匿名内部类的实例赋值给一个变量)。


构造器(构造函数)

  • 是创建(new)对象时java会默认调用的方法,通常用给对象传递参数来赋值,

  • 语法

    1. 构造函数没有返回值,没有void,int 等等
    2. 构造函数名必须与类名一致
    3. 在构造函数中要第一所传入的参数列表→非必须
  • 默认构造器

    权限修饰符 类名()
    {
    //初始化等功能..
    }
  • 带参构造器(常用)

    权限修饰符 类名(数据类型 参数)
    {
    //初始化等功能..
    }

注意点:

  1. 如果一个类中只有带参构造器,则默认的构造器就会被覆盖→消失,如果还有需要默认构造器,则需显示性定义
  2. 同一个类中的构造器可以相互调用,需要用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());
} }
  1. 在构造器中调用其他构造器,不会创建对象,只会初始化
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变量

  1. 实例变量:当一个实例变量被修饰成final时,它只能在声明时或者构造方法中被赋值,且只能被赋值一次
  2. 静态变量:与实例变量情况相同,必须在声明或者静态语句块中被赋值,且只能赋值一次
  3. 局部变量:即方法中的变量,在声明时可以不要立即赋值,但使用前必须赋值

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,单例模式的更多相关文章

  1. 为什么构造器不能是abstract, static, final, native or synchronized的?

    Unlike methods, a constructor cannot be abstract, static, final, native  or synchronized. 1. A const ...

  2. [转]java static final 初始化

    http://tanbing1986411.blog.163.com/blog/static/7259798220103610224434/ java static final 初始化 1.stati ...

  3. String的实例化与static final修饰符

    String两种实例化方式 一种是通过双引号直接赋值的方式,另外一种是使用标准的new调用构造方法完成实例化.如下: String str = "abcd"; String str ...

  4. static 和 final 和 static final

    众所周知,static 是静态修饰关键字:可以修饰变量,程序块,方法,类. 1.修饰变量. 得知:如果static修饰的是变量,则JVM会将将其分配在内存堆上,该变量就与对象无关,所有对该变量的引用都 ...

  5. static final与final修饰的常量有什么不同

    最近重头开始看基础的书,对一些基础的概念又有了一些新的理解,特此记录一下 static final修饰的常量: 静态常量(static修饰的全部为静态的),编译器常量,编译时就确定其值(java代码经 ...

  6. Java 基础 enum枚举类 的创建/使用/接口继承 ,以及手动创建枚举类的对象为:public static final

    笔记: import java.lang.*; /**一:枚举类 : enum Season implements info { s1(),s2(),s3(),s4() }; //s1--s4 放在S ...

  7. 构造函数为何不能用abstract, static, final修饰

    不同于方法,构造器不能是abstract, static, final的. 1.构造器不是通过继承得到的,所以没有必要把它声明为final的. 2.同理,一个抽象的构造器将永远不会被实现,所以它也不能 ...

  8. <init>与<clinit>,static与final与static final

    <init>和<clinit> init是对象构造器方法,初始化对象的时候执行 clinit是类构造器方法,类加载的初始化阶段执行 final常量赋值(必须是一下其中一种) 显 ...

  9. 关键字——this,super,static,final

    this 理解为当前对象. //测试 public static void main(String[] args){ Person person = new Person(3, "xiaoM ...

  10. Java 关键字static final使用总结

    Static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,被static修饰的成员变量和成员方法独立于该类的任何对象.也就是说,它不依赖类特定的实例,被 ...

随机推荐

  1. k8s 深入篇———— k8s 的pod[五]

    前言 简单整理一下pod的相关知识. 正文 为什么我们需要pod. 前面我们知道了k8s一个最重要的作用是解决容器的编排功能,那么为什么有一个pod的东西. 这就是实际中遇到的问题. 那就是容器和容器 ...

  2. 重新点亮shell————什么是shell[一]

    前言 这里简介一下什么是shell. 写linux和shell 系列是为了后面的docker 系列的整理,本来想直接整理k8s的,但是呢,想想docker 系列整理完了的话,那么整理k8s系列就没有那 ...

  3. mysql 重新整理——sql 执行语句的顺序[五]

    前言 盗图: 其实在复杂的语句中,需要我们逐步去分析,然后呢,我们了解一些优化器到底是如何帮我们优化的,就知道到底是mysql怎么执行代码. 我把以前的丢了,后续补全.

  4. BURP保存多个监听器配置

    "感谢您阅读本篇博客!如果您觉得本文对您有所帮助或启发,请不吝点赞和分享给更多的朋友.您的支持是我持续创作的动力,也欢迎留言交流,让我们一起探讨技术,共同成长!谢谢!" 前言 在进 ...

  5. dbeaver导出结果集中乱码

    重要的一步 需要点击

  6. 力扣495(java)-提莫攻击(简单)

    题目: 在<英雄联盟>的世界中,有一个叫 "提莫" 的英雄,他的攻击可以让敌方英雄艾希(编者注:寒冰射手)进入中毒状态.现在,给出提莫对艾希的攻击时间序列和提莫攻击的中 ...

  7. SLS控制台内嵌操作指南

    简介: SLS控制台内嵌操作指南 一.机制 详见:https://help.aliyun.com/document_detail/74971.html 二.操作 2.1 子账号操作(主账号身份操作) ...

  8. Linux内核社区迁移到github?

    简介: github是目前最火的开源软件代码托管平台,那么Linux内核社区能否迁移到github上呢?Intel的Daniel Vetter写了一篇关于这个问题的博客,他给出的答案是NO.至于这个答 ...

  9. [GPT] 同为 nodejs 库的 Puppeteer 和 cheerio 的区别是什么

    Puppeteer 和 cheerio 是两个完全不同的库,用途和功能也截然不同. Puppeteer 是一个 Node.js 库,它使用 Chrome 或 Chromium 浏览器作为渲染引擎,通过 ...

  10. 前端使用 Konva 实现可视化设计器(7)- 导入导出、上一步、下一步

    请大家动动小手,给我一个免费的 Star 吧~ 这一章实现导入导出为JSON文件.另存为图片.上一步.下一步. github源码 gitee源码 示例地址 导出为JSON文件 提取需要导出的内容 ge ...