首页 > 其他分享 >this,构造器,static,final,单例模式

this,构造器,static,final,单例模式

时间:2024-06-02 19:55:19浏览次数:16  
标签:调用 value public 实例 static 单例 final 构造函数

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可以增加代码的可读性  
        }  
    }
    
    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(),
		它都会返回同一个实例。
	}
}
  • 饿汉式即无论如何先创建一个实例化对象,接下来无论几次调用都返回同一个对象

标签:调用,value,public,实例,static,单例,final,构造函数
From: https://www.cnblogs.com/ihave2carryon/p/18227520

相关文章

  • 单例模式线程安全reorder问题
    单例模式是一种常用的软件设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。下面是一个使用C++实现的线程安全的单例模式的例子:classSingleton{private:staticstd::atomic<Singleton*>instance;//静态私有实例指针使用原子操作类atomic线程安全sta......
  • 报错信息:Unable to make field private final java.lang.Class java.lang.invoke.Seri
    jdk版本与当前MyBatisPlus版本不兼容解决方法:1.升级MyBatisPlus的版本。2.或者使用以下方法--add-opensjava.base/java.lang.invoke=ALL-UNNAMED......
  • 记一次NoResourceFoundException: No static resource异常
    org.springframework.web.servlet.resource.NoResourceFoundException:Nostaticresource是Controller层,Rest接口的定义错误ApiPost工具访问,调用接口报错改为@RestController注解......
  • 说说你对单例模式的理解?如何实现?
     一、是什么单例模式(SingletonPattern):创建型模式,提供了一种创建对象的最佳方式,这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建在应用程序运行期间,单例模式只会在全局作用域下创建一次实例对象,让所有需要调用的地方都共享这一单例对象,如下图所......
  • JavaScript执行(四):try里面放return,finally还会执行吗?
    在前面几篇文章中,我们已经了解了关于执行上下文、作用域、闭包之间的关系。今天,我们则要说一说更为细节的部分:语句。语句是任何编程语言的基础结构,与JavaScript对象一样,JavaScript语句同样具有“看起来很像其它语言,但是其实一点都不一样”的特点。我们比较常见的语句包括......
  • 第2讲:static用法总结
    几句话总结static的用法。1、静态变量(1)静态变量统一放在特定内存区域中,在程序的整个生命周期内只有一份,所以函数在使用时共用静态变量的状态。(2)类中的静态变量为类的所有对象共享,而且不能在类内初始化静态变量。原因:每个对象是独立的,如果可以通过对象的方式初始化静态变......
  • **static assertion failed:no q_object in the class with the signal**
    staticassertionfailed:noq_objectintheclasswiththesignal这个问题主要是由于未添加Q_OBJECT,找不到信号定义如图所示,正是由于未点击Add下面的选项,即使在后续手动添加Q_OBJECT也会报错解决的方法可以在原先的情况下进行添加新的文件(这里我是定义了Student2,Tea......
  • 设计模式——单例模式
    一。引言当我们写一个体量比较大的代码使,如果这是堆积罗列,那么会发现有许多冗余的情况,并且还不利于团队共同协作,代码难以定位。于是为了解决这些问题,提高代码的可读性,减少耦合度,我们引入了设计模式。设计模式就像盖房子时的图纸,根据这些图纸的指导可以让我们把房子建的更漂......
  • 【C++】初始化列表、隐式转换、static成员、友元与匿名对象
    文章目录1.初始化列表2.explicit关键字2.1隐式类型转换2.2explicit3.static成员3.1成员变量3.2成员函数4.友元4.1友元函数4.2友元类5.内部类6.匿名对象1.初始化列表在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。classDate{publ......
  • c++ static const
      ===============================首先得知道为什么要使用静态数据成员:在类中,静态成员可以实现多个对象之间的数据共享,并且使用静态数据成员还不会破坏隐藏的原则,即保证了安全性。因此,静态成员是类的所有对象中共享的成员,而不是某个对象的成员。使用静态数据成员......