5.1 用构造器确保初始化
构造器是一个特殊的函数,函数名与类名相同,且无返回类型。使用new关键字调用构造器可创建对象并初始化。构造器分为无参构造器和有参构造器
5.2 方法重载
方法拥有相同名字但不同的参数会进行重载,参数列表一定要是独一无二的,不可以根据返回值来区分重载方法。
当方法接受较小的基本类型作为实参、而形成是较大基本类型时,实参会被自动提升,其中char会自动提升为int
如int x = 5;print(long l);,当print(x)时,x转换为long。
当方法接受的实参时较大基本类型时,则需要对实参进行类型转换,否则就会报错
如double x = 5.0;print(int l),需要print((int)x);
5.3 默认构造器
如果类没有给出构造器,则编译器会给出一个默认构造器(无参构造器),如果已经有构造器,则不会提供
5.4 this关键字
this只能用于方法内部,表示调用此方法对象的引用。
用途:1.在构造器中调用构造器。
public class TestJava {
public TestJava() {
System.out.print("Hello!My name is ");
}
public TestJava(String s) {
this();
System.out.println(s);
}
public static void main(String[] args) {
TestJava t = new TestJava("Nancy");
}
}
注意:在一个构造器中只能调用一个构造器,而不能构造多个,且必须将调用的构造器放于初始部位。构造器的调用只能发生在构造器中。
2.在同一方法中区分同名的参数和实例变量
5.5 清理 终结处理和垃圾回收
5.6 成员初始化
1.变量(基本类型和抽象类型)的初始化发生在任何方法包括构造器被调用之前
public class TestJava {
public static void main(String[] args) {
start t = new start();
}
}
class printW{
public printW(int i) {
System.out.println("printW("+i+")");
}
}
class start{
printW w1 = new printW(1);
public start() {
System.out.println("start()");
printW w3 = new printW(33);
}
printW w2 = new printW(2);
printW w3 = new printW(3);
}
输出结果为:
printW(1)
printW(2)
printW(3)
start()
printW(33)
2.数组初始化
所有数组有一个固定成员length,表示数组的长度。
new不能创建单个基本类型数据,但是可以创建单个对象
对于非基本类型数组,首先创建一个引用数组,然后逐个对引用元素匹配对象
Integer[] a = new Integer(20);//创建引用数组
for(int i = 0;i < a.length;i++)
a[i] = new Integer[i];//匹配对象
创建非基本类型数组另两种方法:
Integer[] a = {new Integer(1),new Integer(2),new Integer(3)};
String[] b = new String[]{"Hello","World","!"};
3.可变参数列表
用于参数个数和类型位置的场合(如以Object[]为方法参数)
public class TestJava {
static void print(Object[] array) {
for(Object i:array)
System.out.print(" "+i);
System.out.println();
}
public static void main(String[] args) {
print(new Object[]{new Integer(3),new Double(4.1),new Integer(2)});
print(new Object[] {"Hello","World",new Integer(2017)});
print(new Object[] {new A(),new A()});
}
}
class A{}
输出为:
3 4.1 2
Hello World 2017
A@15db9742 A@6d06d69c//直接打印对象是类名+@+地址
在Java SE5以后,出现了可变参数列表,从而不用显示的编写数组了
(Object… args) == (Object[] args)
public class TestJava {
static void print(Object... array) {
for(Object i:array)
System.out.print(" "+i);
System.out.println();
}
public static void main(String[] args) {
print(new Integer(3),new Double(4.1),new Integer(2));
print("Hello","World",new Integer(2017));
print();//传递参数可以为空
}
}
class A{}
实质还是与上一种情况相同,只是编译器代替填充数组。
可变参数列表可以使用任何类型的参数,包括基本参数类型
5.9 枚举(enum)
public class TestJava {
public enum Spiciness{
NOT,MILD,MEDIUM,HOT
}
public static void main(String[] args) {
for(Spiciness s:Spiciness.values()) {
System.out.println(s+",ordinal "+s.ordinal());
}
}
}
输出:
NOT,ordinal 0
MILD,ordinal 1
MEDIUM,ordinal 2
HOT,ordinal 3
其中枚举量中自带toString()方法,values()用来生成枚举量数组,ordinal()用来给出枚举量顺序对应的值