static关键字是Java代码中比较常见的一个关键字也是比较难以理解的一个关键字,下面我就来讲述一下static关键字的用法和注意的些许细节
一. static关键字的用途
二. static关键字需要注意的细节
一.static关键字的用途
static关键字的基本作用,用一句话来描述就是“方便在没有创建对象的情况下来进行调用”,被static关键字修饰的方法或者变量不需要依赖对象进行访问,只要类被加载了,就可以通过类名去进行访问
1) static方法
static方法一般称作静态方法,由于静态方法不依赖于任何对象就可以进行访问,因此对于静态方法来说,是没有this的,因为它不依附于任何对象,既然都没有对象,就谈不上this了。并且由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用。
但是要注意的是,虽然在静态方法中不能访问非静态成员方法和非静态成员变量,但是在非静态成员方法中是可以访问静态成员方法/变量的。举个简单的例子:
上图中print2()方法是独立存在的,它随着类的创建而创建,可以直接通过类名去调用 例如:Object.print2(),上图中存在两处错误,Str2,print1()均于print2()后而生成的,所以在不可以在静态方法中直接去调用非静态的方法和成员。然而对于非静态函数就可以直接调用静态方法了,所以我们最常见的static方法就是main方法,因为程序在执行main方法的时候没有创建任何对象,所以只有通过类名来访问。
1) static变量
static变量也称作静态变量,所以与之相对的就是非静态变量
静态变量与非静态变量的区别:
数量上的区别:
(n份)非静态成员变量是在每个对象中都维护着一份数据
(1份)静态成员变量只会在方法中维持着一份数据
访问方式上的区别
非静态成员变量只能使用对象进行访问
静态成员变量可以使用对象,类名进行访问
存储位置上的区别
非静态成员变量是存储在堆内存上
静态成员变量是存储在方法区中
生命周期的区别
非静态成员变量是随着对象的创建而创建,随着对象的消失而消失
静态成员变量是随着类文件的加载而被创建存在的,随着类文件的消失而消失
作用上的区别
非静态函数适用于描述一类事物的属性
静态函数是提供一个共享数据给所有对象使用的
附上一张内存图:
当然在方法区中数据也是会更新的,例如图中的country就由原来的“中国”被替换成“小日本”了。
当然还有一个重要的问题:什么时候使用static修饰一个函数呢?
如果一个函数没有直接访问非静态的成员,那么即可使用static修饰该函数了。(常用于工具类的方法)
1) static代码块
所属类的字节码被加载到就执行了,而且可以来优化程序性能。Staticc块可以放在类的
任何地方,类中可以有多个static代码块。在类初次被加载的时候,会按照static代码块的顺序来执行每个static块,并且只会执行一次。
二.static关键字需要注意的细节
1)静态成员变量需要注意的细节
静态的成员变量可以使用类名或者是对象进行访问
非静态成员变量只能使用对象进行访问,不能使用类名直接访问
千万不要为了方便访问而使用static修饰一个成员变量,只有这个成员变量的数据需要被共享的时候才能使用static修饰
2)static修饰成员函数需要注意的细节
非静态的函数只能使用对象调用,不能使用类名调用
静态函数可以直接访问静态的成员,但是不能直接访问非静态的成员
非静态的成员变量可以直接访问静态以及非静态的成员
静态函数不能出现this以及super关键字