static

2017-08-10  本文已影响0人  懒得阳光

搬运来源: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

上一篇下一篇

猜你喜欢

热点阅读