不加static关键字时,代码对应的内存图

因为明星国家都为日本,所以country属性不需要每次创建对象都赋值,这时候可以加入static关键字。

static关键字的特点
- 随着类的加载而加载
- 优先于对象存在
- 被类的多个对象共享
- 可以通过类名调用
1.其实它本身也可以通过对象名调用
2.推荐使用类名调用
3.静态修饰的内容一般我们称之为:与类相关的,类成员
//类名调用
public class Demo1_Static {
public static void main(String[] args){
Person.country = "china";
System.out.println(Person.country);
}
}
class Person{
String name;
static String country;
public void speak(){
System.out.println(name + "..." + country);
}
}
输出结果;
china
static关键字的注意事项
A:在静态方法中是没有this关键字的
理解:静态是随着类的加载而加载,this是随着对象的创建而存在。静态比对象先存在。
B:静态方法只能访问静态的成员变量和静态的成员方法
- 静态方法:
成员变量:只能访问静态变量
成员方法:只能访问静态成员方法 - 非静态方法
成员变量:可以使静态,也可以是非静态的
成员方法:可以使静态,也可以是非静态的
静态只能访问静态
public class Demo1_Static {
public static void main(String[] args){
Demo d = new Demo();
d.print1();
}
}
class Demo{
int num1 = 10;
static int num2 = 20;
public void print1(){ //非静态的成员方法
System.out.println(num1);
System.out.println(num2);
}
// public static void print2(){ //静态的成员方法
// System.out.println(num1);
// System.out.println(num2);
// }
}
输出结果
10
20
public class Demo1_Static {
public static void main(String[] args){
Demo.print2();
}
}
class Demo{
int num1 = 10;
static int num2 = 20;
// public void print1(){ //非静态的成员方法
// System.out.println(num1);
// System.out.println(num2);
// }
public static void print2(){ //静态的成员方法
System.out.println(num1);
System.out.println(num2);
}
}
Error:(17, 28) java: 无法从静态上下文中引用非静态 变量 num1
把System.out.println(num1);注释掉之后,num2可以正常输出。
静态变量和成员变量的区别
静态变量也叫类变量,成员变量也叫对象变量
A:所属不同
- 静态变量属于类,所以也叫类变量
- 成员变量属于对象,所以也称为实例变量
B:内存中位置不同
- 静态变量存储于方法区的静态区
- 成员变量存储于堆内存
C:内存出现时间不同
- 静态变量随着类的加载而加载,随着类的消失而消失
- 成员变量随着对象的创建而存在,随着对象的消失而消失。
D:调用不同
- 静态变量可以通过类名调用,也可以通过对象调用
- 成员变量只能通过 对象调用
tips:
如果一个类中所有方法都是静态方法,则需要多做一步,创建一个私有构造方法。目的是不让其他类创建本类对象。
网友评论