1.static声明的变量可以(不是必须)直接用类名来调用
class Person{
int i;
}
public class Test{
public static void main(String[] args){
Person person = new Person();
person.i = 10;
}
}
class Person{
static int i;
}
public class Test{
public static void main(String[] args){
Person.i = 10;
}
}
比较以上两段代码,static关键字声明的变量可以直接使用类名来调用变量,省去了新建对象赋值的过程。
class Person{
static int i;
}
public class Test1{
public static void main(String[] args){
Person p1 = new Person();
Person p2 = new Person();
Person.i = 10;
System.out.println("p1的i的值为" + p1.i);
System.out.println("p2的i的值为" + p2.i);
}
}
上图说明所有对象使用的静态变量是同一份值
class Person{
static int i;
}
public class Test1{
public static void main(String[] args){
Person p1 = new Person();
Person p2 = new Person();
Person.i = 10;
System.out.println("p1的i的值为" + p1.i);
System.out.println("p2的i的值为" + p2.i);
p1.i = 20;
System.out.println("p1的i的值为" + p1.i);
System.out.println("p2的i的值为" + p2.i);
}
}
上图说明:因为p1和p2两个对象使用的是同一份值(在堆内存中),所以只改变p1的值p2的值也会跟着改变
2.static声明的方法
(1)静态函数中无法引用非静态成员变量,不能使用this关键字
class Person{
String name;
static void talk(){
System.out.println("My name is " + this.name);
}
}
public class Test1{
public static void main(String[] args){
Person.talk();
}
}
(2)静态代码块
一般用来为静态变量赋初始值,用得较少
class Person{
static{
System.out.println("静态代码块");
}
static String name;
static void talk(){
System.out.println("My name is " + name);
}
}
public class Test1{
public static void main(String[] args){
Person.name = "Zhangsan";
Person.talk();
}
}