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

以下内容参考: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 构造方法
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值