浅谈 Java 中的初始化

Java 内存分布

浅谈 Java 中的初始化

需要注意的是,方法中的参数属于局部变量 ,类似于 String str="字符串" 这样定义的字符串是存放在堆内存中的「字符串常量池」(常量池中不会添加已有成员)中。

String str1 = new String() 内存是直接位于堆中,每一次对象的实例化都会在堆中开辟新的内存空间。

成员变量与局部变量的区别

浅谈 Java 中的初始化

结合代码分析

class Person {
    private String name;
    private int age;

    public Person(){ }
    public Person(String name, int age) { // 两个参数属于局部变量,调用完成后被销毁,且只能在该方法内部访问
        this.name = name;
        this.age = age;
    }

    public void showInfo(){ // 类内部访问成员变量
        System.out.println("name =" + name);
        System.out.println("age = "+age);
    }
}
public class TestDemo {
    public static void main(String[] args) {
        Person p1 = new Person();
        p1.showInfo();
        Person p2 = new Person("hack-hu",18);
        p2.showInfo();
    }
}

输出结果:

// p1 输出缺省值,两个成员变量都被自动初始化
name =null
age = 0
// p2 输出赋值后结果,重载的构造方法在调用完成后销毁
name =hack-hu
age = 18

提示:虽然成员变量会自动完成初始化,但是在定义时或使用前先初始化是个好习惯。

类中数据的初始化顺序

原则:

  • 1、类构造函数调用时,先初始化类中的成员变量,所有成员变量初始化完成后,再执行构造函数代码。
  • 2、父类构造函数完成再执行子类构造函数。
  • 3、静态(static)成员初始化后再初始化非静态成员
  • 4、同一优先级,按照代码的先后顺序执行。

代码实践

定义父类 Person

public class Person {
    private String name;
    private int age;

    static {
        System.out.println("父类静态块代码执行");
    }

    public Person(){
        System.out.println("父类构造函数执行");
    }
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void showInfo(){
        System.out.println("name =" + name);
        System.out.println("age = "+age);
    }
}

定义其旁类 Nationality (国籍)

public class Nationality {
    static {
        System.out.println("旁类静态块执行");
    }
    public Nationality(){
        System.out.println("旁类构造方法执行");
    }
}

定义 Person 子类 Student

public class Student extends Person {
    static Nationality nation= new Nationality();
    static {
        System.out.println("子类静态块执行");
    }
    public Student(){
        System.out.println("子类构造函数执行");
    }
}

输出结果:

父类静态块代码执行
旁类静态块执行
旁类构造方法执行
子类静态块执行
父类构造函数执行
子类构造函数执行

注意,子类中的静态对象 nation,要比父类的构造函数先执行,说明所有的静态成员都要先初始化。当 nation 不为静态时,则先完成父类构造,再初始化子类非静态成员。

总结:实践出真知,对于含糊不清的概念,可以实践一些案例来参照理解。若文章中有错误欢迎指正。期待你给出的评论,默默点点赞、给个好看也是对我的一种认可。

浅谈 Java 中的初始化

1、转载或引用本网站内容须注明原网址,并标明本网站网址D9源码

2、转载或引用本网站中的署名文章,请按规定向原作者支付稿酬

3、对于不当转载或引用本网站内容而引起的民事纷争、行政处理或其他损失,本网站不承担责任

4、对不遵守本声明或其他违法、恶意使用本网站内容者,本网站保留追究其法律责任的权利

5、资源均来自网络,不保证资源的完整性,仅供学习研究,如需运营请购买正版,如有侵权请联系客服删除

6、本站所有资源不带技术支持,下载资源请24小时内删除,如用于违法用途,或者商业用途,一律由使用者承担

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论