zoukankan      html  css  js  c++  java
  • Java基础(十)--static关键字

    static关键字通常应用在字段、方法、静态块,还有冷门一点的内容:静态内部类、静态导入

    static字段:

      static字段也就是静态变量,是属于类的,被所有的对象所共享,只有当类初次加载的时候保存到内存中,在内存中只保存一份

      实例变量是属于对象的,在创建对象的时候进行初始化,每个对象的实例变量是互斥的,不会相互影响

    PS:static是不允许用来修饰局部变量,无论是方法、静态块、代码块

    static方法:

    public class A{
    
        private static int i = 1;
        private String s;
    
        private void del() {
            System.out.println("del()");
            add();
        }
    
        public static void add() {
            System.out.println(s);
            this.del();
            System.out.println("add()"+ i);
        }
    }

      因为静态方法是属于类的,不需要依赖对象去调用,内部是没有this的,所以静态方法中无法使用this,也无法调用非静态方法和变量,反

    过来却可以的。但是如果在静态方法中new一个对象,然后调用非静态方法,是可以正常运行的

    public static void add() {
    	A a = new A();
    	a.del();
    	System.out.println(a.s);
    	System.out.println("add()"+ i);
    }
    

    静态块:

      静态块和静态变量一样在首次类加载的时候进行初始化,这是我们使用它的一个重要的原因

    public class A{
    
        private static int i = 1;
        private String s = "aaa";
        static {
            System.out.println("A static block1");
        }
    
        private void del() {
            System.out.println("del()");
            add();
        }
    
    	{
            System.out.println("A block");
        }
    	
        static {
            i1 = 2;
    //        System.out.println(i1);
            System.out.println("A static block2");
        }
        public static void add() {
            System.out.println("add()");
        }
        private static int i1;
    }
    public class B extends A{
    
        static {
            System.out.println("B static block1");
        }
    
        {
            System.out.println("B block");
        }
    
        public B() {
            System.out.println("B Constructor");
        }
    
        static {
            System.out.println("B static block2");
        }
    
    }
    public class Test {
    
        private static B b = new B();
    
        public static void main(String[] args) {
            new B();
            A.add();
        }
    } 

    结果:

    A static block1
    A static block2
    B static block1
    B static block2
    A block
    B block
    B Constructor
    A block
    B block
    B Constructor
    add()

    静态块的特点:

      1、静态块内部可以对定义在其后面的静态变量进行赋值,但是不能使用

      2、静态块只会加载一次,按照代码定义顺序进行加载

      3、类加载的顺序:父类静态块-->子类静态块-->父类代码块-->父类构造器-->子类代码块-->子类构造器

    非静态块可以加载多次

    静态内部类:

      这部分内容可以参考我之前的内容:https://www.cnblogs.com/huigelaile/p/11009436.html,或者自行百度

    静态导入:

      之前static相关内容没想到过这个内容,但是在公众号有看到一篇关于面试的文章,面试官问关于static的内容,如果能够回答到静态导入,印象应该会很好。

    这时候就能体现和其他面试者的区别了

    格式:

      import static 包名.类名.方法名  

    import static java.lang.System.*;
    import static java.lang.Math.*;
    
    public class Test {
    
        public static void main(String[] args) {
            out.println("abc");
            System.out.println(round(1.2));
        }
    }

    PS:jdk1.5出现的特性

      1、静态导入的方法必须是静态的

      2、静态导入可以不调用包名,直接使用包里的静态方法  

  • 相关阅读:
    Piggy-Bank (hdoj1114)
    Word Amalgamation(hdoj1113)
    Lowest Bit(hdoj1196)
    1206: B.求和
    1207: C.LU的困惑
    STL初步
    关于521(nyoj)
    first blood暴力搜索,剪枝是关键
    变态最大值(nyoj)
    烧饼(nyoj779)
  • 原文地址:https://www.cnblogs.com/huigelaile/p/11024641.html
Copyright © 2011-2022 走看看