美文网首页
Java编程思想(四) 初始化与清理

Java编程思想(四) 初始化与清理

作者: kaiker | 来源:发表于2022-06-05 13:30 被阅读0次

    1、用构造器确保初始化

    • 通过构造器,类的设计者可确保把每个对象都会得到初始化。
    • 创建对象时,如果具有构造器,Java就会在用户有能力操作这个对象之前自动调用相应的构造器。
    • 在Java中初始化与创建是不能分开的。

    2、方法重载

    • 通过参数列表来区分同名的方法
    • 不能通过返回值来区分,比如int f() 和void f() 调用f() 就不知道到底用的是哪个。
    • 如果传入数据类型小于方法中声明的形式参数类型,实际数据类型就会被提升。char如果不能被接收,会被提升成int。
    • 如果传入数据类型大于接受类型,需要进行类型转换才能传。

    3、默认构造器

    • 如果没写构造器,编译器会自动创建。

    4、this关键字

    • this关键字智能在方法内部使用,表示对“调用方法的那个对象”的引用
    • 只有当需要明确指出当前对象的引用时,才需要使用this关键字。
    public class Leaf {
        int i = 0;
        Leaf increment() {
           i++;
           return this;
        }
    }
    

    在构造器中调用构造器

    • 通常this都是指当前对象,表示对当前对象的引用。
    • 如果this添加了参数列表,表示某个构造器的调用。

    static的含义

    • static方法就是没有this的方法。在static方法内部不能调用非静态方法。

    5、清理:终结处理和垃圾回收

    • Java里的对象并非总是被垃圾回收。
    • 垃圾回收不等于析构。
    • 垃圾回收只与内存有关。
    • 如果Java虚拟机并未面临内存耗尽的情形,它是不会浪费时间去执行垃圾回收以恢复内存的。

    垃圾回收器如何工作

    • 当它工作时,将一面回收空间,一面使堆中的对象紧凑排列,这样堆指针就可以很容易移动到靠近开始的地方。
    • 引用记数是一种简单但速度很慢的垃圾回收记数。每个对象都含有一个引用计数器,当有引用连接至对象时,引用计数加1,当离开作用域或置位null时,引用计数减1。
    • 有一种做法名为停止-复制。先暂停程序运行,然后将所有存活对象从当前堆复制到另一个堆,没有复制的都是垃圾。
    • “标记-清扫” 从堆栈和静态存储区出发,遍历所有的引用,进而找出所有存活的对象。每找到一个存活对象,就给对象设一个标记,当所有标记完成,清理开始,生效的堆空间不连续。
    • 所有的内存分配以较大的块为单位。每个块用相应的代数来记录它是否还存活。
    • 如果所有对象很稳定,垃圾回收器效率降低,切换到标记-清理;如果出现很多碎片,就会切换为停止-复制。

    6、成员初始化

    • 在类里定义一个对象引用时,如果不将其初始化1,此引用就会获得一个特殊值null。

    7、构造器初始化

    • 无法阻止自动初始化的进行,它将在构造器被调用之前发生。

    初始化顺序。

    • 变量定义的先后顺序决定了初始化的顺序。即使变量定义散布于方法定义间,它们仍旧会在任何方法被调用之前得到初始化。
    class Window {
      Window(int marker) { print("Window(" + marker + ")"); }
    }
    
    class House {
      Window w1 = new Window(1); // Before constructor
      House() {
        // Show that we're in the constructor:
        print("House()");
        w3 = new Window(33); // Reinitialize w3
      }
      Window w2 = new Window(2); // After constructor
      void f() { print("f()"); }
      Window w3 = new Window(3); // At end
    }
    
    public class OrderOfInitialization {
      public static void main(String[] args) {
        House h = new House();
        h.f(); // Shows that construction is done
      }
    } /* Output:
    Window(1)
    Window(2)
    Window(3)
    House()
    Window(33)
    f()
    

    静态数据初始化

    • 无论创建多少个对象,静态数据都只占用一份存储区域。
    • 静态初始化只有在必要时刻才会进行。
    • 初始化的顺序是先静态对象,而后是非静态对象。

    一个对象创建的过程,

    1. 即使没有显示使用static关键字,构造器实际也是静态方法。首次创建Dog对象或Dog的静态方法、域首次被访问,Java解释器必须找到类路径以定位Dog.class。
      2、载入Dog.class,有关静态初始化所有动作都会执行。因此静态初始化只在Class对象首次加载时候进行一次。
    2. new Dog()创建对象时,在堆上为Dog对象分配足够的存储空间。
    3. 这块存储空间被清零,基本类型设为默认,引用设为null。
    4. 执行所有出现于字段定义处的初始化动作。
    5. 执行构造器。

    8、数组初始化

    • 数组知识相同类型的、用一个标识符名称封装到一起的一个对象序列或基本类型数据序列。
    • 编译器不允许制定数组大小。为了给数组创建相应的存储空间,必须写初始化表达式。
    • int[] a1 获取的是数组的引用。
    • 可变参数列表,当你指定参数时,编译器实际上会为你去填充数组。new Object[]{"one", "two"};

    相关文章

      网友评论

          本文标题:Java编程思想(四) 初始化与清理

          本文链接:https://www.haomeiwen.com/subject/bpokmrtx.html