static

作者: 懒得阳光 | 来源:发表于2017-08-10 16:57 被阅读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
    
    

    相关文章

      网友评论

          本文标题:static

          本文链接:https://www.haomeiwen.com/subject/shnhrxtx.html