java中的static关键字

1 static 用来修饰成员变量

先看一下以下代码

public class Pen {
	private String color;
	private double price;
	
	public void write(){
		System.out.println("this is a "+color+" pen,price is ¥"+price);
	}
}

public class PenTest {
	public static void main(String[] args) {
		Pen pen1=new Pen();
		pen1.setColor("black");
		pen1.setPrice(10);
		pen1.write();
		
		Pen pen2=new Pen();
		pen2.setColor("blue");
		pen2.setPrice(5);
		pen2.write();
	}
}

输出结果为:

this is a black pen,price is ¥10.0
this is a blue pen,price is ¥5.0


以上两个Pen对象在内存中的存储示意图:


PS:关于静态方法区有些地方也就方法区或静态区,从说明上看都是指存储已经被虚拟机加载的类信息,常量,静态变量和即时编译器(JIT)编译后的代码等数据。所以应该都是一个意思,只是叫法不同,本处就叫静态方法区。

可以看出,成员变量随对象存储,而方法却是共用的,不管有多少个对象,都共享同一个方法。

而如果把price用static修饰后结果会是这样:

public class Pen {
	private String color;
	private static double price;
	
	public void write(){
		System.out.println("this is a "+color+" pen,price is ¥"+price);
	}
}

this is a black pen,price is ¥5.0
this is a blue pen,price is ¥5.0

可以看到黑笔与蓝笔价格都就了5元。示意图如下:


可以看出static修饰的成员变量随类存储,而已经不是对象,所以当对price进行修改的时候,pen1的price属性也变成了5元。因为对于成员变量,如果不是特意需要,还是不要用static 修饰,这样会很难控制,对一处修改也会影响到其它的地方。

2 static修饰方法

对于static修饰的方法,相信很个学开发的人都在像背咒语一样在重复着这样的话:静态方法可以直接用类名点出来,非静态方法需要先new出对象,通过对象调用;静态方法可以直接用类名点出来,非静态方法需要先new出对象,通过对象调用……

这样确实是一个好办法,这种做法通常出现在一些工具类中,为了方便调用所以将其定义成静态方法。在java中,也有好多为方便调用而定义的静态方法,如Integer类的parseInt(),String类的valueOf(),indexOf()

3 static 修饰静态块

用static修改的静态块,可以随着类加载而加载,而不依托于某个方法。

如以下代码:

public class StaticTest {
	
    
    public static void main(String[] args) {
    	System.out.println("main方法里的代码");
    }
    
    static{
    	print();
    }
    
    static void print(){
    	System.out.println("单独的static方法");
    }
}
想要验证出静态代码块在方法之前加载,直接运行是不行的,需要在System.out.println("main方法里的代码");这行代码之前打上断点,然后进行调试,这时可以看到System.out.println("main方法里的代码");代码还没有执行的时候,控制台已经出现了一行输出语句:

单独的static方法

这便可以证明,StaticTest类刚加载的时候,就已经执行了static{print()}

对于静态代码块,通过也是用在工具类中,希望工具类提前为我们加载一些对象或是方法,如

public class PenUtil {
	private static Pen pen;
	
	static{
		/*
		 * 对pen对象进行初始化
		 */
	}
	
	public static Pen getPen(){
		return pen;
	}
}

这样我们在外部调用PenUtil.getPen()的时候,就可以得到一个已经初始化好的pen对象。、

最后再以一个跟static相关的咒语结尾:

静态方法里不能调用非静态方法,非静态方法里能调用静态方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值