Java基础知识整理(初始化与清理)

    xiaoxiao2021-03-25  74

    面向对象过程中,初始化是Java中必不可少的一个环节,用来确保每个类的实体对象都能够分配到存储空间而不会造成不必要的空指针异常。

    Java 构造器

    Java中,初始化对象的函数称为构造器,每个类都会有一个不带任何参数的默认构造器。若类中没有声明其他带参数的构造器,则编译器会自动生成一个“隐藏”的默认构造器。 注意几点:

    构造器没有任何返回类型(与void不同)构造器本身是静态方法构造器可以通过方法重载实现不同的行为。如果已经定义了一个构造器,则编译器不会帮助你生成默认构造器

    方法重载: 区分方法重载的唯一标识:每一个重载的方法都必须要有一个独一无二的参数列表。

    注意: 返回类型不能完全识别重载的方法,因为用户调用不同返回类型的方法时,可能不会注意该方法的返回值。因此,返回类型的不同不足以区分重载的方法。

    this关键字 this关键字表示对当前对象的引用。

    假设场景:在一个类的成员方法中,需要在该方法的内部获得当前对象的引用,此时,就需要this关键字。且**this关键字只能在方法内部使用,表示调用方法的那个对象** 注意: 如果在该方法里调用该类的其他方法,则不需要特地使用关键字this,只有在该方法中调用类的成员变量时,才有必要使用this。 **不要把this放在一些没必要的地方,因为别人写的代码不会到处使用this,同时这也遵循一种简洁直观的编程风格**

    构造器中调用构造器:

    假设场景:当一个类中,存在多个重载的构造器,可能需要在某一个构造器中,调用另一个构造器时,可以利用this关键字来减少代码的重复率。 public Class Flower{ public String s; public Flower(int num){ //do something } public Flower(String s, int num){ this(num); this.s = s; } } 上述代码表明,构造器Flower尽管可以用this关键字,调用一个构造器,但是,却不能调用两个,只能通过this.s = s的方式初始化。 另外,**在构造器中调用其他构造器时,必须将this关键字放在最起始处,**否则将不通过编译。

    清理:终结处理与垃圾回收(概要,具体会在JVM中详细介绍)

    Java有垃圾回收机制,负责回收无用对象占据的内存资源,但也有特殊情况,假定某一对象(并非使用new)获得了一块“特殊”的内存区域,而垃圾回收器却只负责回收通过new分配的内存资源,这样就会出现遗漏的情况。 因此,在Java的Object类中,定义了一个finalize()方法。 他的工作原理: 一旦垃圾回收期准备好释放对象占用的存储空间,首先将调用其finalize()方法,并且在下一次垃圾回收动作发生之时,才会真正回收对象占用的内存。 注意: finalize()不等于C++中的析构函数,因为析构函数一经调用,对象必然被销毁,而Java里的对象却总非被垃圾回收。 换句话说: - 1 对象可能不被垃圾回收。 - 2 垃圾回收不等于析构。 - 3 垃圾回收只与内存有关。

    成员初始化

    Java尽力保证,所有变量在**使用前都能得到恰当的初始化**。对于方法内的局部变量,Java以编译时错误的形式来贯彻这种保证。 指定初始化 在定义类成员变量的地方,可以直接对其进行赋初值。

    构造器初始化

    可以用构造器进行初始化。在运行时刻,可以调用方法或执行某些动作来确定初值,并为编织带来更大的灵活性。但无法阻止自动初始化的进行。 以下代码中,因为类中只声明了一个int类型的变量i,i在使用前会自动赋初值0,然后在构造器中变为7。 public class Counter{ int i; Counter(){ i = 7 ; } } - 初始化顺序: 在类的内部,变量定义的先后顺序决定了初始化顺序,即使变量定义散布于方法定义之间,也会先于方法被调用之前进行初始化。 - (static)静态数据初始化 注意 - 1 静态数据只占一份存储区域,为所有对象所共享 - 2 static关键字不能应用于局部变量,因为局部变量存储于栈中,随方法调用的结束而销毁。 - 3 若一个域是静态的基本类型域,则无初始化的情况下,也会获得基本类型的标准初值。,若为一个对象引用,则默认初始化值为null。 - 4 **静态初始化只有在必要时刻才会进行** 比如调用类的静态方法、创建类对象(如前文所述,构造器也是静态方法,只是没有显示声明static关键字。),或者第一次访问静态数据时,静态初始化才会进行。 - 显示的静态初始化 Java允许将多个静态初始化动作组织成一个特殊的静态子句(或者“静态块”)。该子句初始化顺序与其他静态初始化动作一样,仅执行一次。 public class Spoon{ static int i; static{ i = 47; } } - 非显示的静态初始化 即没有static关键字的的子句,用来初始化类的非静态变量。

    注意:无论是哪个子句,他都优先于构造器初始化之前执行。

    执行顺序为:静态子句—>非静态子句–>构造器

    数组的初始化 声明数组时,编译器不允许指定其大小,只能够通过“{}”的形式对其进行初始化,
    转载请注明原文地址: https://ju.6miu.com/read-40074.html

    最新回复(0)