zoukankan      html  css  js  c++  java
  • java----作用域

     代码块:

    如果Test类继承了父类,会先执行父类的静态代码块和构造代码块(如果是创建对象的情况下)

    static{}:代码块是类的加载过程中初始化阶段执行的。和new对象没有任何关系,比如Test.静态属性,也同样会触发static{},只是在new 对象过程中,如果发现当前类还没有被加载到内存,就会将类加载到内存,在初始化过程中执行了<clinit>() 方法,如果static{}中有打印信息,就会被打印出来,如果第二期new 对象的时候,发现类已经加载内存了,就不会再进行初始化了.也就是为什么多次new 对象,static 变量只有一个的原因了(全局共享),而且这个变量就和对象没有任何关系了(但是还是可以通过对象访问静态变量和静态方法的,一个对象对静态变量的修改会影响到另一个对象)

    public class Demo {
        public static void main(String[] args){
        	Test t = new Test();
        	Test t1 = new Test();
        }
    }
    class Test{
    	static{
    		System.out.println("静态代码块");//在类中使用static定义,最先执行,只会创建一次(当创建第二个对象是,不会再执行该代码,static只存储一次)
    	}
    	{
    		System.out.println("构造代码块");//在类中定义,优先构造方法执行,每次创建对象都会执行
    	}
    	public Test(){
    		
    		{
    			System.out.println("普通代码块"); //在方法中定义,方法被调用执行
    		}
    		System.out.println("我是构造方法");
    	}
    }

    通过类调用静态方法只会调用静态代码块,多次调用也会执行一次静态代码块。(如果继承父类,同样会先执行父类的)

    public class Demo {
        public static void main(String[] args){
            Test.t();
            Test.t();
        }
    }
    class Test{
        static{
            System.out.println("静态代码块");//在类中使用static定义,最先执行,只会创建一次(当创建第二个对象是,不会再执行该代码,static只存储一次)
        }
        {
            System.out.println("构造代码块");//在类中定义,优先构造方法执行,每次创建对象都会执行
        }
        public Test(){
            {
                System.out.println("普通代码块"); //在方法中定义,方法被调用执行
            }
            System.out.println("我是构造方法");
        }
        public static void t(){
    
        }
    }

    Test t = null;不会有任何操作

    调用通过类调用final修饰的字段(同时被static修饰,不然不能被类直接调用)不会初始化。

    public class Demo {
        //main方法会被调用,所有static会被执行
        static {
            System.out.println("x");
        }
        public static void main(String[] args){
            //这样不会执行Test中的任意代码块
            Test t = null;
        }
    }
    class Test{
        static{
            System.out.println("静态代码块");//在类中使用static定义,最先执行,只会创建一次(当创建第二个对象是,不会再执行该代码,static只存储一次)
        }
        {
            System.out.println("构造代码块");//在类中定义,优先构造方法执行,每次创建对象都会执行
        }
        public Test(){
            {
                System.out.println("普通代码块"); //在方法中定义,方法被调用执行
            }
            System.out.println("我是构造方法");
        }
    }
    

     

    下面输出结果:构造。构造。静态。构造

    public class B
    {
        public static B t1 = new B();
        public static B t2 = new B();
        {
            System.out.println("构造块");
        }
        static
        {
            System.out.println("静态块");
        }
        public static void main(String[] args)
        {
            B t = new B();
        }
    }
    
  • 相关阅读:
    linux下的内存映射函数mmap详解及示例代码
    Android平台上使用属性系统(property system)
    Android筆記
    Android Prelink
    DataGridView BindingSource BindNavigator
    可排序的ListView
    开源2D绘图组件ZedGraph
    BackgroundWorker示例
    级联datagridview 利用datarelation和bindingsource
    继承DataGridView
  • 原文地址:https://www.cnblogs.com/yanxiaoge/p/10660890.html
Copyright © 2011-2022 走看看