On Java 8(Java编程思想)笔记 – 第六章 初始化和清理
-
从概念上看,initialize()方法应该与对象的创建分离
在Java中对象的创建和初始化是统一的概念 -
new 表达式虽然返回了刚创建的对象的引用,但构造器本身无返回值
-
方法重载:
允许方法具有相同的方法名,但接收的参数不同
构造器是典型的重载 -
区分重载的方法:根据参数列表、参数的顺序
-
根据返回值类型区分方法的重载,Java编译器区分不出来
下面展示一些内联代码片
。
//无返回类型
void f(){}
//有返回类型
int f(){
return 1;
}
//调用方法
public static main(String[] args){
f();//编译器不知道调用那个方法 报错
}
- 无参构造器 是默认创建的,一旦显示的定义了构造器则不会自动创建无参构造器
- this关键字只能在非静态方法内部使用
- 构造器调用构造器,只能this调用一次构造器,且必须先调用构造器
不能再构造器之外的方法里面调用构造器 - static关键字:
静态方法中不能调用非静态方法(反之可以),静态方法是为类创建的,不需要任何对象,一个类中的静态方法可以被其他的静态方法和静态属性调用 - Java的堆指针只是简单的移动 到尚未分配的区域,所以存储空间的分配速度特别快,(没分配一个新对象,向前移动一个,垃圾回收器一边回收内存,一边是堆中的对象紧凑排列)
- 显示的静态初始化:静态初始化只有在必要的时刻进行,只会初始化一次
- 非静态实例初始化:非静态代码快在构造器之前执行的
- 基本类型的自动转换
char,byte,short,int,long,float,double
左——>右 向上转型自动转换
右——>左 向下转型强制转换
char 不会转byte和short 而是直接转int - 初始化的顺序:
在类中变量的定义顺序决定了他们初始化的顺序,即使变量定义子啊散布在方法定义之间,它们仍会在任何方法(包括构造器)被调用之前的到初始化 - 静态数据的初始化:
初始化的顺序是静态对象(如果它们之间没有被初始化的话)然后是非静态变量
顺序:
1.静态初始化
2.对象中的所有基本类型数据设置为默认值,数字会被设置为0,布尔型和字符型相同,引用被置为null
3.字段定义处的初始化动作
4.构造器初始化 - 数组的初始化
//数组的初始化方式
int[] a = {1,2,3,4,5};
int[] a = new int[rand.nextInt(20)];
int[] a = new int{1,2,3,4,5};
//对于数组初始化动作,可以出现在代码的任何地方,但是第一种使用一种特殊的初始化方式表达式,必须在创建数组的地方出现
- 可变参数列表:
// definition
void printArray(Object... args){
for(Object obj : args){
System.out.print(obj+" ");
}
System.out.println();
}
//调用
printArray(47,(float)3.14,11.11);
printArray((Object[]) new Integer[]{1,2,3,4});
printArray();//empty list is ok
//可变参数实质上是一个数组
//如果有一组事物可以把他们当作列表传递
//如果有一个数组,该方法会把它们当作可变参数来接受
//可变参数的个数可以为0
可变参数列表使得方法重载更为复杂
static void f(float i,character... args){
System.out.println("first");
}
static void f(character... args){
System.out.println("second");
}
public static main(String[] args){
f(1,'a');
f('1','a');//报错
}
需要对某一方法增加一个非可变的参数解决这个问题
static void f(float i,character... args){
System.out.println("first");
}
static void f(char c,character... args){
System.out.println("second");
}
public static main(String[] args){
f(1,'a');
f('a','a');
}