初始化和清除
用构建器自动初始化
- java中使用构建器来初始化类的成员变量,构建器是一个同类名相同没有返回值的方法,jvm会默认给类提供一个无参的构造函数。
- 如果我们重载了构造函数,默认的构建器就会失效
- 方法的重载的区分是以参数的类型列表(参数的个数、参数类型、参数的顺序)来区分的。
基本类型方法重载
-
常数被当做
int
,若没有int
的重载方法,则会对其进行转型处理(上溯转型)1-1.
char
会被转成int
型使用.1-2.
byte
会转换成short
. -
不能对基本类型进行向下转型。
this
关键字
this
是指当前对象的句柄,可用于方法和构建器内,其一般的用途有:
-
简化对象调用方法,使其更像面向对象(将消息发送给对象)。
Person a = new Person(); Person b = new Person(); a.setAge(2); b.setAge(20);
当调用方法
a.setAge(2)
;编译器幕后所做的是Person.setAge(a, 2)
;也就是说当调用方法时,方法内部就会取得那个对象的句柄。 -
因为当前句柄会自动应用于方法内,所以我们可以简化方法的调用
void pick() { call(); //this.call(); } void call() {}
-
方法取得当前对象句柄,这个就可以很方便的对一个对象执行多个方法。
class Person { private String name; private String sex; private int age; public setName(String name) { this.name = name; return this; } public setSex(String sex) { this.sex = sex; return this; } public setAge(int age) { this.age = age; return this; } public static void main(String[] args) { Person p = new Person() .setName("ss") .setSex("male") .setAge(20); } }
-
在构建器里调用构建器
-
明确指定对象的成员变量,这个主要用在方法的参数名称和类的成员变量相同时,明确使用
this
来指定成员变量,就如上个例子一样。
static的含义
当我们指明一个方法为static
时,也就意味着这个方法没有this
;所以static
可以这么理解:
static
方法内部不能发出对非static
方法的调用(有可能调用的情况是,我们在static内部明确使用句柄来调用方法),因为没有对象的句柄;反过来是可以的;static
方法可以在没有任何对象的前提下调用另一个static
方法和方法其他static
字段,其实这个是设计static
的初衷。
清除:收尾和垃圾收集
java垃圾回收器会回收java的对象(new
),垃圾回收器在内存吃紧时会收集那些没有被引用的对象加以回收;针对使用本地语言(c/c++
)进行申请的内存(malloc
),如果没有进行delete
就会造成内存泄漏问题,如果这种情况,我们可以在finalized
方法中对本地申请的内存加以回收。
finalized
方法我们应该尽量避免使用。
成员初始化
- 基本类型局部变量java会自动初始化一个随机值,成员变量会初始化一个默认值(
null
)。 - 对象类型会被默认初始化成
null
- 可以在类型定义的时候进行初始化
- 可以在构建器里对类型进行初始化
- 初始化的顺序是按照类内部变量定义的顺序来决定的,并且会在方法调用之前进行也就是对象构建完成之前。
static
的初始化会在必要的使用进行(对象构建之前或者第一次使用static时候)之后对象不会重新进行初始化.
类的加载和初始化
java不像其他语言,在启动的过程中进行一次性载入,随后进行初始化,然后是正式执行程序。java的类加载和初始化是这样的
- java的一切东西都是对象,每个对象都存在于独立的文件中;除非真正使用的时候才会去进行类加载,也就是除非进行构建对象完毕或者第一次调用
static
,这时才会进行类加载。 - 类加载的过程中,所有的
static
相关的成员变量,代码块会按照原有的顺序进行初始化并且只会初始化一次;在初始化的过程中,首先会初始化基础类的static
相关的成员变量和代码块然后是衍生类的成员变量和代码块。 static
成员变量和代码块初始化完成以后,类就可以进行创建对象了。- 类的创建过程中,首先会对基础类(父类)的
非static
成员变量和代码块按照顺序进行初始化,没有赋予初始值的成员变量,如果是基本数据类型默认成系统的默认值,对象类型默认成null
;非static
成员变量和代码块初始化完成后,调用类的构建器。 - 基础类调用构建器之后就会对衍生类进行初始化和调用衍生类的构建器,其过程跟基础类的构建过程一样。
- 构建处理后的类对象就可以正常使用类的一些方法和成员变量了。