吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2858|回复: 8
收起左侧

[Java 转载] 【笔记】浅谈 Java 中的初始化

[复制链接]
hack_hu 发表于 2019-6-30 15:44

Java 内存分布

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

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

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

成员变量与局部
结合代码分析

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 不为静态时,则先完成父类构造,再初始化子类非静态成员。

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

免费评分

参与人数 1吾爱币 +3 热心值 +1 收起 理由
苏紫方璇 + 3 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

苏哲哲哲 发表于 2019-6-30 16:01
人生得意一杯酒,饮过方知此中愁。
萋小磊 发表于 2019-6-30 20:05

++

本帖最后由 萋小磊 于 2019-7-1 13:43 编辑

Java类初始化顺序按照
静态块 然后依次按照从上到下执行
指的一提的是  会先初始化 例如   Nationality nation = new Nationality();
执行顺序: Nationality nation = null;
在执行 nation = new Nationality();
 楼主| hack_hu 发表于 2019-6-30 20:33
萋小磊 发表于 2019-6-30 20:05
Java%C0%E0%B3%F5%CA%BC%BB%AF%CB%B3%D0%F2%B0%B4%D5%D5+%0D%0A%BE%B2%CC%AC%BF%E9+%C8%BB%BA%F3%D2%C0%B4% ...

????乱码了
 楼主| hack_hu 发表于 2019-7-1 08:51
萋小磊 发表于 2019-6-30 20:05
Java类初始化顺序按照
静态块 然后依次按照从上到下执行
指的一提的是  会先初始化 例如   Nationality  ...

学习了。
荼蘼熊 发表于 2019-7-4 14:59
重载的构造方法在调用完成后销毁,不太清除您指的是什么
 楼主| hack_hu 发表于 2019-7-5 14:24
荼蘼熊 发表于 2019-7-4 14:59
重载的构造方法在调用完成后销毁,不太清除您指的是什么

请看清楚诶,这里说的是局部变量
荼蘼熊 发表于 2019-7-8 09:33
hack_hu 发表于 2019-7-5 14:24
请看清楚诶,这里说的是局部变量

一般不说销毁,就算是销毁也是销毁的引用,然后会有GC负责回收,前提是这个值没有被再次引用
 楼主| hack_hu 发表于 2019-7-9 21:00
荼蘼熊 发表于 2019-7-8 09:33
一般不说销毁,就算是销毁也是销毁的引用,然后会有GC负责回收,前提是这个值没有被再次引用

垃圾回收只是回收堆区的内存,栈区的内存在使用后自动出栈
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-16 11:28

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表