搬运来源:http://blog.csdn.net/bingduanlbd/article/details/8432766
static:方便在没有创建对象的情况下来进行调用(方法/变量)
静态变量和非静态变量的区别是:静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。
Static import:字可以直接调用静态方法或变量,不用类名
Static Entry
Static实体包括
1.静态变量:用大写字母表示,只有一个,通过类来访问
2.静态方法:
静态方法属于类所有,但是对象一样可以调用。
不能直接引用非静态变量。如果要引用非静态变量,只能通过对象引用。
静态方法中不能引用this、super这些关键字。静态方法中同样不能直接调用非静态方法,只能通过对象引用。
publicclassStaticMethod {
privateintage =0;
privatestaticString VENDOR ="JAC";
publicvoidshow() {
System.out.println("Non-Static");
}
publicstaticvoidstaticShow() {
System.out.println("Static");
}
publicstaticvoidmain(String[] args) {
//直接访问
System.out.println(VENDOR);
staticShow();
//通过对象引用
StaticMethod staticMethod =newStaticMethod();
System.out.println(staticMethod.age);
staticMethod.show();
}
}
在哪里可以定义静态方法呢?
官方说法是这样的,Static methods can only be declared in a static or top-level type.也就是说,在外层的类中,可以定义静态方法。但是在内层的类当中,只有静态的内部类才能定义静态方法。跟静态变量的情况其实是一样的。
3.静态类:只能在内部类中定义静态类。
publicclassTest{
publicstaticvoidmain(String[] args) {
StaticInnerClass.diaplay();
StaticInnerClass i =newStaticInnerClass();
i.test();
}
staticclassStaticInnerClass {
privatestaticString VENDOR ="JAC";
privatestaticvoiddiaplay() {
System.out.println("Inner static class, static method");
}
privatevoidtest() {
System.out.println("Inner static class,non-static methon");
}
}
}
Static Block:
static { }这一部分就是静态块,当类加载器载入类的时候,这一部分代码被执行,常用于对静态变量进行初始化工作。当然,可以声明一个静态方法来完成这些初始化工作,这样做的好处就是这些初始化工作可以再次被调用,而在初始化块中,代码只能执行一次,不能再调用。在静态块中,可以访问静态变量,调用静态方法。
如果去掉static,{ }中的代码则会在创建类对象的时候才执行,(相当于把这部分代码复制到各个构造函数中)这样可以实现块中的内容在多个构造函数中的复用。
static{ }中的代码只执行一次,而{ }中的代码每当创建一个新对象的时候就会被执行。
静态块 的局限性,比如静态块代码大小不能超过JVM规定的某个值,不能用this,super关键字,不能从静态块中返回值,增加调试难度等等。
importjava.util.HashMap;
importstaticjava.lang.Math.PI;
/**
*
* @author bingduanLin
*
*/
publicclassStaticBlock {
{
System.out.println("Instance Initializer, run when an object is created! ");
}// can bu reuser in constructors!!
privatestaticfinalHashMap MAP =newHashMap();
static{
MAP.put("banana","honey");
MAP.put("peanut butter","jelly");
MAP.put("rice","beans");
}
static{
System.out.println("Static Initializer, run when the class is loaded!");
MAP.put("cons","cons");
}
/**
* @param args
*/
publicstaticvoidmain(String[] args) {
newStaticBlock();
newStaticBlock();
newStaticBlock();
System.out.println(MAP);
/**
* The static import declaration is analogous to the normal import declaration.
* Where the normal import declaration imports classes from packages, allowing
* them to be used without package qualification, the static import declaration
* imports static members from classes, allowing them to be used without
* class qualification.
*/
System.out.println(PI);
}
}
Static Initializer, run when theclassis loaded!
Instance Initializer, run when an object is created!
Instance Initializer, run when an object is created!
Instance Initializer, run when an object is created!
{banana=honey, rice=beans, peanut butter=jelly, cons=cons}
3.141592653589793
Q1:
publicclassTest {
Person person =newPerson("Test");
static{
System.out.println("test static");
}
publicTest() {
System.out.println("test constructor");
}
publicstaticvoidmain(String[] args) {
newMyClass();
}
}
classPerson{
static{
System.out.println("person static");
}
publicPerson(String str) {
System.out.println("person "+str);
}
}
classMyClassextendsTest {
Person person =newPerson("MyClass");
static{
System.out.println("myclass static");
}
publicMyClass() {
System.out.println("myclass constructor");
}
}
A1:teststaticmyclassstaticpersonstaticperson Test
test constructor
person MyClass
myclass constructor