1.构造器:
(1)特点:
构造器名称必须与类名相同
当实例被创建时自动调用
(2)类型:
default:在代码中不写构造器,在实例初始化时JVM会默认创建并调用一个无参数的构造器
without arguments:无参数构造器
with arguments:在构造函数中传入参数的构造器,当代码中出现有参数的构造器时,JVM则不会创建并调用无参数构造器
(3)初始化顺序:
我们有一个类如下:
public class Father {
int a = 0; //这里是成员变量
static {
//这里是静态初始化代码段
}
{
//这里是非静态初始化代码段
}
public Father() {
//这里是构造器
}
}
当我们第一次初始化Child实例时,执行顺序如下:
Father static initiallization()
Child static initiallization()
Child super():
Father non-static initiallization()
Father constructor()
Child non-static initiallization()
Child constructor()
当我们第二次初始化Child实例时,执行顺序如下:
Child super():
Father non-static initiallization()
Father constructor()
Child non-static initiallization()
Child constructor()
其中super()即子类创建时隐式或显式调用的父类构造器,虽然non-static代码段在构造器外部,但是当初始化时遵守(先调用父类构造器,后调用non-static initiallization,最后继续进行子类构造器剩下的内容)这样的准则,而且向上调用构造器遵守递归调用的准则。
所以可以理解为constructor()一定包含以下内容
constructor() {
super();
non-static initiallization();
rest....
}
2.垃圾回收(垃圾回收机制)
总结JVM中的垃圾回收机制
3.初始化:对象使用前必须初始化
(1)局部变量(local variable):
定义在方法内部的变量,通过编译时出错保证其初始化。
(2)成员变量(member variable):类的成员
①默认初始化:自动初始化为默认值,对应表见文章结尾
②定义时初始化:定义成员变量的时候初始化,可以通过调用method,但method的参数必须是初始化了的。
③构造器初始化:在类的构造器中初始化成员变量
(3)静态数据的初始化
①静态数据和静态函数
静态数据:在类第一次创建成员时或者第一次调用静态方法时执行和初始化的内容
静态函数:无需实例化就能够调用的函数
不能在static方法中调用非静态方法
静态代码段只执行一次
4.方法的重载(method overloading)
方法重载是指在一个类中定义多个同名的方法,但要求每个方法具有不同的参数的类型或参数的个数,返回值类型可以不同,但是不能通过返回值类型来区分不同的重载函数。
(3)方法重载中会涉及到基本类型的转换
当重载的不同方法之间参数可以互相转换,如:
public void func(int a);
public void func(long a);
假如调用func(3)
,怎么确定我们具体调用的是哪个重载函数呢
JVM的执行机制是执行覆盖范围最小的参数所对应的方法,如上例int可以转换为long,而long却不能转换为int,所以会执行func(int a)
。
转换顺序如下:
byte->short->int->long->float->double
char->int->float->double
5.this 关键字和Static关键字
(1)this关键字
This关键字,只可以用在非静态方法中,指向当前方法所属的对象。你可以把这个对象引用当作正常的对象来对待
如果在一个方法中需要调用一个此对象的方法,不需要加this,可以直接调用方法。当前对象的引用会自动应用到方法上。
同时this关键字也是很有用的,在调用其它方法时,将本身对象当作参数传入进去。
还有一种用法,是在构造函数中调用构造函数时,会用到this。
(2)With argument list
子类可以在自己的构造方法中使用super(argumentList)
来调用父类与argumentList对应的的构造方法;
使用this(argumentList)
调用本类与argumentList对应的构造方法。
(3)Static关键字
static关键字的作用是把修饰的成员变成类相关,而不是实例相关。
6.数组的初始化
数组初始化有两种方式,静态初始化和动态初始化
不能既手动决定数组长度,又手动初始化数组内容
静态初始化
int[] arrayName = new int[]{1,2};
int[] arrayName = {1,2};\\简化写法
\\手动初始化数组内容,由JVM计算长度
动态初始化
int[] arrayName = new int[n];
\\手动决定数组长度,
\\但是不能同时初始化内容,
\\只能由JVM初始化为默认值
类 | 默认值 |
---|---|
byte、short、int、long | 0 |
float、double | 0.0 |
char | ‘\u0000’ |
boolean | false |
类、数组、接口、String | null |