static关键字使用

static关键字使用

static作为java关键字有其独特的使用风格,对于一个初学者来讲,明确 static 关键字的用法和特性并不是一件简单的事,在这里,本人就自身的学习进度和大家分享一下关于static使用。

我们知道static修饰的方法,变量可以在没有类对象的情况下直接通过类名调用;但为什么可以这样使用呢?

  1. 从内存角度出发分析
    静态成员变量是保存在内存的数据区
    类对象占用的实际内存空间是在内存的堆区
    这两个区域是完全不同的,所有可以说静态成员变量和对象没有关系 【没有对象】

  2. 从静态成员变量以及类对象生命周期来分析
    静态成员变量是随着类文件(.class) 字节码文件的加载过程中,直接定义在内存的数据区。静态成员变量从程序运行开始就已经存在。
    类对象是在代码的运行过程中,有可能被创建的。程序的运行过中,有可能会被JVM的CG(垃圾回收机制)销毁,程序在退出之前一定会销毁掉当前Java程序使用到的所有内存。
    静态成员变量在程序退出之后,才会销毁
    静态成员变量的生命周期是从程序开始,到程序结束
    类对象只是从创建开始,而且随时有可能被JVM的GC销毁
    生命周期不在同一个时间线上,所以静态成员变量和类对象无关,【没有对象】

static常见的使用方式

  1. static修饰变量
    static修饰的变量叫作类变量或者静态变量,只要当前类被加载,类变量就会被分配空间,且不会中途被回收 ,这块空间被整个程序所共同使用,一处修改,处处受影响,它的引用方式有两种:类名.类变量名,或类对象.类变量名,但推荐前一种方式使用。
    下面是一个例子:
class StaticDemo{
	static String str= "将夜";
}
public class test1 {
	public static void main(String[] args) {
		StaticDemo.str = "余晖";
		StaticDemo staticDemo1 = new StaticDemo();
		staticDemo1.str = "朔鼠";
		StaticDemo staticDemo2 = new StaticDemo();
		staticDemo2.str = "邶风";
		System.out.println(StaticDemo.str);
		System.out.println(staticDemo1.str);
		System.out.println(staticDemo2.str);
	}
}

猜猜结果
static关键字使用_第1张图片
没错,就是:邶风

  1. static修饰方法
    同样static修饰的方法叫类方法或静态方法,也能通过类名直接调用,但用一点要注意静态方法里不允许有非静态成员,不允许出现super,this关键字;着很好理解,应为静态方法是随着类文件加载直接在内存中开辟空间的,非静态的成员是依托于对象存在的,而static修饰的方法首先被执行,这样如果类方法里存在非静态的成员,就会出现一个问题,那就是没有对象可寄托这些非静态成员,所以上面的规定就很好理解啦,(static 用了就是单身狗,因为没有对象,但单身狗可以找对象即类方法里你可以new 一个对象,补充一句废话,构造方法也不能用static)
    来个代码吧

class SingleDog{
	String str = "余晖";
}
class StaticDemo{
	SingleDog singleDog1 = new SingleDog();
	static void staticMethod() {
		//这里会出错的
		singleDog1.str;
		//可以找对象
		SingleDog singleDog1 = new SingleDog();
	}
}
public class test1 {
	public static void main(String[] args) {
		
	}
}

  1. 静态代码块
    static这种用法也是比较常见的,静态代码块同样随类的加载而执行,且仅执行一次,并先于main方法执行,在一些数据库加载驱动使,我们经常看到静态代码块的使用
    话不多说,来一个例子:

public class test1 {
	public test1() {
		System.out.println("我是构造方法");
	}
	static {
		System.out.println("我是静态代码块");
	}
	public static void main(String[] args) {
		new test1();
	}
}

执行结果如下:
static关键字使用_第2张图片

你可能感兴趣的:(java,编程语言)