JAVA中的static关键字

本文详细介绍了Java中的静态变量与静态方法。静态变量在类加载时创建,所有对象共享同一份,而实例变量每个对象都有独立副本。静态方法只能访问静态变量,适用于工具类方法,不依赖于对象状态。在开发中,静态修饰用于共享且不随对象变化的属性和安全的工具方法。
摘要由CSDN通过智能技术生成

1.Static作用

被static所修饰的变量或者方法,会被称为静态变量或者 静态方法。在内存中,是跟着类的建立而建立的,所以,静态变量 与 静态方法,又被称为——类变量/类方法

要我们讲清楚static,我们得先了解清楚实例变量

1.1-实例变量

       实例变量是什么? 1-只要没有被static修饰的都是实例变量

                                     2-在内存区域中,是随着对象的创建而创建(被对象使用后)

                                     3-类所实例化后的每一个对象,都有它自己独一份的实例变量

1.2-实例变量与静态变量的区别        

        所以实例变量与静态变量(或是类变量)的区别,就是静态变量的创建,是在该变量所在的类创建时一同闯将的。而实例变量,则是跟随着对象而创建。详细点说,静态变量创建在内存中方法区的常量池中,而实例变量是创建在堆中。且静态变量,无论你用该类实例化多少个对象,内存中都只有唯一一个静态变量,这个静态变量是属于类的,而不是属于对象的。所以每个对象在改变静态变量的时候,静态变量最后的存储的值,会选择最新变更的值(也就是最新一次对象修改静态变量的值)。

下图为 不实例化对象,直接打印静态变量

 


public class StaticTest {
	public StaticTest(int age,String name) {
		// TODO Auto-generated constructor stub
		this.age = age;
		this.name = name;
	}
	static String nation;//静态变量
	private int age;//实例变量
	private String name;//实例变量
	public static void main(String[] args) {
		StaticTest.nation = "Chinese";
		System.out.println(StaticTest.nation);
	}
}

可以看到我们在这里直接 类名.静态变量 调用了,接下来我们再测试一下不同对象调用静态变量之后的结果

StaticTest t1 = new StaticTest(10, "banney");
StaticTest t2 = new StaticTest(12, "cassie");
t1.nation = "柬埔寨";
System.out.println(StaticTest.nation);

对象t1修改了nation后,nation的值 是“柬埔寨”

那再用t2修改nation呢?

StaticTest t1 = new StaticTest(10, "banney");
StaticTest t2 = new StaticTest(12, "cassie");
t1.nation = "柬埔寨";
t2.nation = "中国!";
System.out.println(StaticTest.nation);

此处输出的 

那我们再打印一下t1.nation! 

System.out.println(StaticTest.nation);
System.out.println(t1.nation);

输出结果 自然都是中国! 因为静态变量只有一份,唯一的一分,内存中只会反复的改写,不会新开辟一块空间。 所以,被static修饰的静态变量,最后的结果,一定是最后一次对其进行的修改值,而且是跟着类的创建而创建,用类可以直接进行调用,不需要借助实例化后的对象

那我们自然抛出第二个问题,static修饰的方法呢?

1.3-静态方法

        静态方法 也就是 被static所修饰的方法,同样能够通过类直接调用

        !静态方法中,只能调用静态方法或者属性

        非静态方法中,可以调用静态,也可以调用非静态


public class StaticTest {
	public StaticTest(int age,String name) {
		// TODO Auto-generated constructor stub
		this.age = age;
		this.name = name;
	}
	static String nation;//静态变量
	private int age;//实例变量
	private String name;//实例变量
	public static void eat() {
		System.out.println("im static");
	}
	public static void main(String[] args) {
		StaticTest.eat();
	}
}

StaticTest类中增加了一个静态方法:eat(); 可以直接用类.eat()进行使用 

如果让eat静态方法中,去使用该类下的一个非静态变量,会如何呢?

private int age;//实例变量
private String name;//实例变量
public static void eat() {
	System.out.println("im static"+age);
}

此处的age并不是静态变量,结果在运行后,报错了

 我们将该变量改为静态后

private static int age;//实例变量
private String name;//实例变量
public static void eat() {
	System.out.println("im static"+age);
}

即运行成功,=> 静态方法只能调用静态属性的方法与变量

注:操作静态变量的方法,也得为静态方法

例如类中,private static int id; 要get这个id,需要

public static int getId(){
    return id;
}

并且静态方法内,不能使用this关键字,super关键字

静态变量或者方法随着类的加载而加载,随着类的消亡而消亡

2-static何时使用

        开发中,我们什么时候使用static呢? 这个被static所修饰的属性 是要被多个对象所共享,且不会随着对象的更改而更改

        而静态方法呢?则是我们在操作静态属性时,一般使用的是静态方法,安全问题

                                以及一些工具类的方法,例如math等方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值