static:static是静态的意思,java中可以用来修饰:属性、方法、代码块、内部类


文章目录

  • static存储位置的介绍
  • 二、static的特性(以“属性”举例)
  • 1.使用static修饰“属性”,则称为“静态属性”;不使用static修饰“属性”,则称为“非静态属性”
  • 三、如何使用
  • 1. static 修饰属性
  • 2. static 修饰方法
  • 三、疑问:为什么java中静态方法内部不能调用非静态方法和变量
  • 可以从静态方法的生成/销毁 生命周期出发


static存储位置的介绍

static存储在静态域里,而非堆栈中

Java static 函数内部 java 中的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步:类的消亡,静态的结构也过跟着消亡

因为“非静态的属性和方法(第二步)”在类的加载后才被加载,所以自然不能调用“非静态的方法和变量(第一步)”

Java static 函数内部 java 中的static_Java static 函数内部_02

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");
	}
}