this和static关键字
this关键字
1、介绍
主要用来引用当前对象的实例,本质表示就是当前对象的地址
在《Java编程思想》第四版第五章5.4⼩节对 this 关键字是这样介绍的:
this 关键字只能在⽅法内部使⽤,表示对“调⽤⽅法的那个对象”的引⽤。
2、应用
- 访问当前对象的属性
- 调用当前类的其他构造方法
- 返回当前对象的引用
2.1 访问当前对象的属性
当方法中的参数名与类的成员变量名相同时,this 关键字可以用来区分成员变量和参数变量。通过 this.变量名 的形式来引用成员变量。
public class Person {
private String name;
public void setName(String name) {
this.name = name; // 使用 this 来区分成员变量和参数变量
}
}
2.2 调用当前类的其他构造方法
在构造函数中,可以使用this关键字来调用当前类的另一个构造函数。这通常用于重载构造函数的情况。例如:
public class Person {
private String name;
private int age;
public Person(String name) {
this(name, 0);//调用带参的构造方法,并且必须位于第一行!
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
2.3 返回当前对象的引用
在方法中,可以使用this关键字返回当前对象的引用。这在链式调用中非常有用。
public class StringBuilder {
private String content;
public StringBuilder append(String str) {
this.content += str;
return this; // 返回当前对象的引用,以支持链式调用
}
public String toString() {
return this.content;
}
}
注意:
- this不能在静态上下文中使用
因为this关键字指的是当前对象的引用,而静态方法和静态变量是属于类本身的,不依赖于具体的对象实例,所以在静态方法或静态上下文中无法使用this关键字。
- 调用带参的构造方法,并且必须位于第一行!
static 关键字
1、介绍
static关键字用于定义类级别的属性和方法,而不是实例级别的。这意味着这些属性和方法不属于类的任何特定对象,而是被类的所有实例共享。
2、应用
2.1 static修饰属性
-
静态成员变量(类成员变量):被static修饰的变量。作用范围在整个类的所有对象上。所有对象共享这个变量,在内存中只有一个副本。
通过 类名.变量名 访问 -
实例成员变量:没有static修饰,作用范围在某个实例对象上。在创建对象时被初始化,存在多个副本。各个对象不互相影响。
通过 实例对象名.变量名 访问。
2.2 static修饰方法
-
静态方法(类方法):使用static修饰,不能直接使用实例变量,只能直接使用静态变量。只能直接调用静态方法,不能直接调用实例方法。
通过 类名.方法名() 访问 -
实例方法 ::没有static修饰,既可以使用静态变量,又可以使用实例变量。既可以直接访问实例方法,又可以直接访问静态方法。
-
通过 实例对象名.方法名() 访问
2.3 static修饰代码块
- 静态代码块用static关键字修饰。
public class MyClass {
static {
// 静态代码块,用于初始化静态变量
System.out.println("Static block is executed");
}
public static int staticVar = 10; // 静态变量
public static void main(String[] args) {
System.out.println(staticVar);
}
}
- 构造代码块没有修饰符。
public class MyClass {
int instanceVar;
{
// 构造代码块,用于初始化实例变量
instanceVar = 20;
System.out.println("Instance block is executed");
}
public MyClass() {
// 构造函数
System.out.println("Constructor is executed");
}
public static void main(String[] args) {
MyClass myObject = new MyClass();
System.out.println(myObject.instanceVar);
}
}
静态代码块:
类加载的时候执行,并且只执行一次,优先于各种代码块和构造方法,最开始执行的。
构造代码块:
在创建对象时被调用,每创建一次对象,都会执行一次构造代码块。 执行顺序,优先于构造方法执行。一个类如果有多个构造方法时,每通过构造方法,创建一个对象,代码块都会被执行一次。但是对于构造方法来讲,只执行某一个构造方法(根据参数执行)。
总结:
静态变量/静态方法生命周期和类相同,在整个程序执行期间都有效。它有如下特点:
- 为该类的公用变量,属于类,被该类的所有实例共享,在类载入时被初始化。
- static变量只有一份。
- 一般用“类名.类变量/方法”来调用。
- 在static方法中不可直接访问非static的成员。