好记性不如烂笔头,记自己容易忘记的部分基础内容。
本文内容引用自(勿转):
static
静态修饰符,被修饰后成员被该类所有的对象所共有,可以直接通过类名调用。
可以用来修饰:成员变量,成员方法,代码块,内部类等。
当一个事物为static时,就意味着这个域或方法不会与包含它的那个类的任何对象实例关联在一起,所以从未创建某个类的任何对象,也可以调用其static方法或访问其static域。
static作用
- 方便在没有创建对象的情况下来进行调用(方法/变量)
- static修饰变量或方法占用内存小,但大量使用也会增加内存负担
static变量
被static修饰的变量属于类变量,称之为静态变量,访问方式为:ClassName.propertyName
静态变量是随着类加载时被完成初始化的,它在内存中仅有一个,且 JVM 也只会为它分配一次内存,同时类所有的实例都共享静态变量,即一处变、处处变,可以直接通过类名来访问它。
但是实例变量则不同,它是伴随着new实例化的,每创建一个实例就会产生一个实例变量,它与该实例同生共死。
static方法
被static修饰的方法属于类方法,我们称之为静态方法,访问方式为: ClassName.methodName()
由于他在类加载的时候就存在了,它不依赖于任何实例,所以 static 方法必须实现,也就是说他不能是抽象方法 abstract。
static代码块
用于初始化一个类的时候做操作用的,和静态变量、静态方法一样会随着类的加载一块执行
静态代码块定义在类中方法外,静态代码块在非静态代码块之前执行(静态代码块—>非静态代码块—>构造方法)
该类不管创建多少对象,静态代码块只执行一次
static内部类
- static修饰类的话只能修饰内部类
- 静态内部类与非静态内部类之间存在一个最大的区别:
非静态内部类在编译完成之后会隐含地保存着一个引用,该引用是指向创建它的外围内,但是静态内部类却没有。没有这个引用就意味着:1.它的创建是不需要依赖外围类的创建。2.它不能使用任何外围类的非static成员变量和方法。
面试题目
- ”static”关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法?
“static”关键字表明一个成员变量或者是成员方法可以在没有所属的类的实例变量的情况下被访问。
Java中static方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而static方法是编译时静态绑定的。static方法跟类的任何实例都不相关,所以概念上不适用。
- 是否可以在static环境中访问非static变量?
static变量在Java中是属于类的,它在所有的实例中的值是一样的。当类被Java虚拟机载入的时候,会对static变量进行初始化。如果你的代码尝试不用实例来访问非static的变量,编译器会报错,因为这些变量还没有被创建出来,还没有跟任何实例关联上。
- 静态方法能不能引用非静态资源?
不能,new的时候才会产生的东西,对于初始化后就存在的静态资源来说,根本不认识它。
- 静态方法里面能不能引用静态资源?
可以,因为都是类初始化的时候加载的,大家相互都认识。
- 非静态方法里面能不能引用静态资源?
可以,非静态方法就是实例方法,那是new之后才产生的,那么属于类的内容它都认识。