关键字static及对象初始化顺序

  • Post author:
  • Post category:其他


以下内容参考:

https://www.cnblogs.com/dolphin0520/p/3799052.html



1.static 变量


静态变量和非静态变量的区别:

静态变量在方法区被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。


2.static方法


static方法是没有this的,他不属于任何对象,static方法中不能调用非静态成员变量和方法。


3.static代码块


static关键字还有一个比较关键的作用就是 用来形成静态代码块以优化程序性能。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。

一代码为例

package com.tunlun.App;
public class Test {
    Person person = new Person("Test");
    static Person sp = new Person("st");
    static{
        System.out.println("test static");
    }
    {
    	System.out.println("1");
    }
    public Test() {
        System.out.println("test constructor");
    }
     
    public static void main(String[] args) {
        new MyClass();
    }
}
 
class Person{
    static{
        System.out.println("person static");
    }
    {
    	System.out.println("2");
    }
    public Person(String str) {
        System.out.println("person "+str);
    }
}
 
 
class MyClass extends Test {
    Person person = new Person("MyClass");
    static{
        System.out.println("myclass static");
    }
    {
    	System.out.println("3");
    }
    public MyClass() {
        System.out.println("myclass constructor");
    }
}

运行结果

person static
2
person st
test static
myclass static
2
person Test
1
test constructor
2
person MyClass
3
myclass constructor

首先我们要知道 类初始化顺序是

父类静态变量——》父类静态代码块——》

子类静态变量——》子类静态代码块——》

main函数———》

父类非静态成员变量————》父类非静态代码块———》父类构造方法

子类非静态成员变量————》子类非静态代码块————》 子类构造方法

然后我们开始分析上面代码。

首先由于Test没有父类直接初始化该类的静态成员变量sp ——》

进入sp没有父类则初始化——》静态代码块——》实例代码块——》

构造方法————》返回Test类继续初始化静态代码块————》

主函数————》

进入myclass有父类,但父类静态变量和代码块以初始过了所以初始myclass静态方法——》

然后舒适化父类成员变量person——》父类非静态代码块———》

父类构造方法——》myclass父类成员变量person——》

myclass非静态代码块——》myclass构造函数

下面把上面代码改动一下做个小测试

package com.tunlun.App;
 class Test {
    Person person = new Person("Test");
    static Person sp = new Person("sTest");
    static{
        System.out.println("test 静态代码块");
    }
    {
    	System.out.println("test 非静态代码块");
    }
    public Test() {
        System.out.println("test 构造方法");
    }
     
   
}
 
class Person{
    static{
        System.out.println("person 静态代码块");
    }
    {
    	System.out.println("Person  非静态代码块");
    }
    public Person(String str) {
        System.out.println("person "+str);
    }
}
 
 
public class MyClass extends Test {
    Person person = new Person("MyClass");
    static{
        System.out.println("myclass 静态代码块");
    }
    {
    	System.out.println("myClass  非静态代码块");
    }
    public MyClass() {
        System.out.println("myclass 构造方法");
    }
    public static void main(String[] args) {
    	System.out.println("主函数");
        MyClass class1 = new MyClass();
    }
}

运行结果:

person 静态代码块
Person  非静态代码块
person sTest
test 静态代码块
myclass 静态代码块
主函数
Person  非静态代码块
person Test
test 非静态代码块
test 构造方法
Person  非静态代码块
person MyClass
myClass  非静态代码块
myclass 构造方法



版权声明:本文为qq_41706670原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。