版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/heihu_malice7/article/details/78979073
static概括:方便在没有创建对象的情况下来进行调用方法/变量,而非static的变量和方法,只有实例存在才存在。
- 没有this的方法,因为静态方法不依赖于任何对象就可以进行访问。
- 在static方法内部不能调用非静态方法,反之可以,因为没有this,所以在静态方法中不能访问类的非静态成员变量和非静态成员方法。
- 可以在没有创建任何对象的前提下,通过类本身来调用static方法,因为被static关键字修饰的方法或者变量 不需要依赖于对象进行访问,只要类被加载了就可以通过类名进行访问。
static可以用来修饰类的成员方法、类的成员变量,另外可以编写static代码块来优化程序性能。
- static方法
最常见的static方法就是main方法,至于为什么main方法必须是static的,现在就很清楚了。因为程序在执行main方法的时候没有创建任何对象,因此只有通过类名来访问。
另外记住,即使没有显示地声明为static,类的构造器实际上也是静态方法。
- static变量
静态变量和非静态变量的区别是:
- 静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。
- 而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。
static成员变量的初始化顺序按照定义的顺序进行初始化。
- static代码块
static块可以置于类中的任何地方,类中可以有多个static块。
至于为什么说static块可以用来优化程序性能,是因为它的特性:只会在类加载的时候执行一次,通俗一点说就是,避免了空间浪费,还能提升执行效率,何乐而不为呢。
但需要注意static不会改变方法/变量的访问权限,java中方法/变量访问权限 只和private、public、protected这几个关键字有关。
同时,在Java中static是不允许用来修饰局部变量。至于为什么,我很想回答这是Java死规定,没有为什么,但是还是阐述一下个人理解, 在类中,被标记为static的方法和变量,jvm就会认为你要延长其生命周期,既然延长就直接申明为全局变量,所以没有必要使用static修饰局部变量,即 类在 static在。
- 静态内部类
public class OuterClass {
static class StaticInnerClass {//内部静态类 ,不能与外部类重名
//只可以访问OuterClass的静态成员 ,不能直接访问外部类的实例字段和实例方法
}
}
- 内部类
public class Outer {
public class Inner{//成员类不能与外部类重名,成员类不能是接口(interface)
//成员类可访问外部类的任一个实例字段和实例函数。
//不能在成员类中定义static字段、方法和类(static final形式的常量定义除外),因为一个成员类实例必然与一个外部类实例关联,这个static定义完全可以移到其外部类中去
//成员类可以定义为接口(interface) ,但不能是接口,没有实际意义,成员类定义是为了能被某个外部类实例实例化,而接口是不能实例化的。
}
}
- 静态导包
静态导包就是java包的静态导入,用import static代替import静态导入包是JDK1.5中的新特性。
使用静态导入可以使被导入类的静态变量和静态方法在当前类直接可见,使用这些静态成员无需再给出他们的类名。
语法是:
import static 包名.类名.静态成员变量;
import static 包名.类名.静态成员函数;