static:static是静态的意思,java中可以用来修饰:属性、方法、代码块、内部类
文章目录
- static存储位置的介绍
- 二、static的特性(以“属性”举例)
- 1.使用static修饰“属性”,则称为“静态属性”;不使用static修饰“属性”,则称为“非静态属性”
- 三、如何使用
- 1. static 修饰属性
- 2. static 修饰方法
- 三、疑问:为什么java中静态方法内部不能调用非静态方法和变量
- 可以从静态方法的生成/销毁 生命周期出发
static存储位置的介绍
static存储在静态域里,而非堆栈中
二、static的特性(以“属性”举例)
1.使用static修饰“属性”,则称为“静态属性”;不使用static修饰“属性”,则称为“非静态属性”
(1)、静态变量:创建了类的多个对象,多个对象共享同一个静态变量。当通过某一个对象修改静态变量时,会导致其他对象调用此静态变量时,是修改过的
(2)、非静态属性:我们创建了类的多个队形,每个对象都独立的拥有一套类中的非静态属性/方法,当修改其中一个对象中非静态属性时,不会导致其他对象中同样的属性值的修改
所以就引出了什么情况下,比较适合用static,也就是类中的属性值 基本不变化的时候;
注意:操作静态属性的方法,通常也设置为static的
三、如何使用
1. static 修饰属性
(1)、静态变量随着类的加载而加载,可以通过"类.静态变量"的方式进行调用
(2)、静态变量的加载早于对象的创建
(3)、由于类只会加载一次,则静态遍历那个在内容中也只会存在一份,存在方法的静态域中
静态变量 | 实例变量(非静态变量) | |
类 | yes | no |
对象 | yes | yes |
代码示例
// static 变量类型 变量名;
static String nation;
2. static 修饰方法
(1)、随着类的加载而加载,可以通过"类.静态方法"的方式进行调用
(2)、静态方法中,只能调用静态的方法和属性;
非静态方法中,既可以调用静态的方法和属性,又可以调用非静态的方法和属性;
静态方法 | 非静态方法 | |
类 | yes | no |
对象 | yes | yes |
代码示例
// 访问修饰符 static 方法返回值类型 方法名(){};
public static void show(){
System.out.println("这是静态方法");
}
三、疑问:为什么java中静态方法内部不能调用非静态方法和变量
可以从静态方法的生成/销毁 生命周期出发
因为静态方法创建时,大致分为三部曲
1、第一步:类的加载,类加载的同时静态static定义的属性和方法也同时被加载
2、第二步:对象1的创建后,非静态的属性和方法才被加载;随后对象消亡,非静态的属性和方法也不能被调用
3、第三步:对象2的创建后,非静态的属性和方法才被加载;随后对象消亡,非静态的属性和方法也不能被调用
4、第n步:类的消亡,静态的结构也过跟着消亡
因为“非静态的属性和方法(第二步)”在类的加载后才被加载,所以自然不能调用“非静态的方法和变量(第一步)”
public class StaticTest {
public static void main(String[] args) {
// "类.静态变量"的方式进行调用
Chinese.nation = "CHINA";
//随着类的加载而加载,可以通过"类.静态方法"的方式进行调用
Chinese.show();
// 对象 c1
Chinese c1 = new Chinese();
c1.name = "姚明";
c1.age = 40;
// 对象 c2
Chinese c2 = new Chinese();
c2.name = "张继科";
c2.age = 30;
System.out.println(c2.nation);
}
}
class Chinese{
String name;
int age;
static String nation;
public static void show(){
System.out.println("这是静态方法");
// 静态方法中,不能调用非静态的属性/方法
// name = "tom";
// 静态方法中,可调用静态的属性/方法
walk();
}
public static void walk(){
System.out.println("静态方法中的walk");
}
}