Java学习之旅第二季-6:static关键字与this关键字
Java中有两个关键字,一个是static,与类有关;一个是this,与实例有关。
6.1 static关键字
static表示静态,在Java中可以用于修饰属性、方法、代码块,内部类等,还可以用于静态导入。本小节主要介绍它修饰属性及方法的意义与用法。
被static修饰的成员称为类成员(Class Member),否则称为实例成员(Instance Member),之前我们声明的属性与方法都是实例成员,分别称作实例属性或变量/实例方法。
下面按照它的使用场景分别介绍下它的作用
修饰属性
在声明类的属性,可以使用static关键字修饰,用于表示该属性是属于类而不是实例的。
public class Static {static int num1;
}
在Static类中声明了一个静态属性 num1,除了这个修饰符外,还可以使用其他修饰符(public、final等)
使用它的时候,直接使用类加上点运算符就可以访问到,无需使用实例后的减运算符;如果是访问同一个类中的静态属性,就可以省略类名。
int num2 = Static.num1;
当然,如果使用对象访问静态属性也是可行的,只不过开发中不建议使用实例来访问静态属性。
除了使用上的差异,在数据共享方面也有很大不同,实例变量的值是与每个实例密切相关的,换句话说,每个实例拥有自己的属性值。但是对于类的静态属性来说,它在整个JVM中是独一无二的,是全局共享的,属于"全局变量"。这意味这我们如果在一个类中修改了某个类的静态属性值,那么在任何时候任何类中访问这个类的静态属性,其值是会更新的。
修饰方法
同样的,static 还可以修饰方法,我们最先常见的静态方法是 main 方法。main 方法被声明为静态的,是因为当程序开始时,它必须由 JVM 调用。
除了main方法外,其他静态方法在调用时也是直接使用类加点运算符,比如:
public class Static {public static void method(){// 这是静态方法的方法体}
}
在main 方法中调用:
static void main() {Static.method();
}
由于static主要是与类相关,访问其修饰的成员时无需创建对象,只要类被加载就可以,所以静态方法中不能直接访问实例变量。如下的代码就存在语法问题:
public class Static { String s="实例变量";public static void method(){System.out.println(s); // 语法错误}
}
如果非要访问实例变量,则需要先创建其所在类的实例,比如:
public class Static {String s = "实例变量";public static void method() {Static o = new Static();System.out.println(o.s);}
}
总结下,实例方法与静态方法访问各种形式的属性或方法时的规则,下表中,第一列是访问方,第一行是被访问方,交叉单元格是规则:
本类实例属性/方法 | 其他类实例属性/方法 | 本类静态属性/方法 | 其他类静态属性/方法 | |||
---|---|---|---|---|---|---|
实例方法 | 直接访问 | 实例加点运算符 | 直接访问 | 类加点运算符 | ||
静态方法 | 实例加点运算符 | 实例加点运算符 | 直接访问 | 类加点运算符 |
6.2 this关键字
this关键字在使用时可以用于访问本类的实例成员,运行时表示当前运行的实例。
它有两个使用场景:
- 用于非静态方法中,由于它运行时表示当前实例,在静态方法中也不能使用this
- 用于构造方法中
本小节主要介绍用于普通的非静态方法中,下面的例子演示了典型的场景:
public class ThisDemo {String name = "Laotan"; // 声明成员变量 name// 为属性name赋值public void setName(String name) {this.name = name;}public void printName() {String name = "老谭"; // 声明局部变量 nameSystem.out.println(name); // 访问的是局部变量 nameSystem.out.println(this.name); // 访问的是成员变量 name}
}
上面的类中,有两个方法访问了唯一的属性name,第一个方法setName,其作用是将其参数的值赋值给类的属性,但是该方法的参数名是name,正好与类的属性name同名,如果在方法体中直接使用name访问到的是局部变量name,所以在name前加上this作为限定,这样就能将参数name赋值到类的属性name。
第二个方法中,声明了局部变量name,在第10行直接输出name,其实是输出它前面一行声明的局部变量。为了能访问到本类的属性name,就在name前加上this作为限定,这样第11行就能顺利访问到第2行的name了。
6.3 小结
本小节介绍了Java中static和this两个关键字的使用。static修饰类成员(属性、方法等),属于类而非实例,可直接通过类名访问;this指代当前实例,用于访问实例成员或解决变量名冲突。同时详细说明了static修饰属性(全局共享)和方法的规则,以及this在区分局部变量与实例变量时的应用场景,并对比了实例方法与静态方法访问成员时的不同规则。