5.1 用构造器确保初始化
-
注意变量声明、定义、赋值和初始化的区别:
- 注意成员变量在类内初始化和构造函数初始化的区别:
public class InitialClass {
//类中初始化
private String msg = "initial";
//构造器中初始化
public InitialClass(String msg){
this.msg = msg;
}
public String getMsg() {
return msg;
}
public static void main(String[] args){
InitialClass initialClass = new InitialClass("constructor initial");
System.out.println(initialClass.getMsg());
}
}
输出结果:
constructor initial
5.2 方法重载
- 区分方法重载:每个加载的方法都必须有一个独一无二的参数类型列表,即使参数顺序不同也视为方法重载
public class OverloadingOrder {
void f(String s, int i){
System.out.println("String: " + s + ", int: " + i);
}
void f(int i, String s){
System.out.println("int: " + i + ", String: " + s);
}
public static void main(String[] args){
OverloadingOrder order = new OverloadingOrder();
order.f("string", 1);
order.f(1, "string");
}
}
输出结果:
String: string, int: 1
int: 1, String: string
- 基本类型的重载
a. 如果传入的数据类型小于方法中声明的形式参数类型,实际数据类型就会被提升;比如将int传入到f(double)中,会将参数int类型转换为double类型;
b. 如果传入的实际参数大于方法中声明的形式参数类型,必须通过类型转换来执行窄化转换,否则,编译器会报错。反之不能将double类型直接传入到f(double)中,可以进行类型转换后,再传入。
- 陷阱:以返回值区分重载方法
void f() {}
int f() { return 1; }
//无法判断是调用哪个函数
f();
5.3 默认构造函数
- 如果类中不含构造函数,则编译器会自动创建一个默认构造函数;若类中含有构造函数,则不会自动创建。
5.4 this关键字
- 表示当前对象的引用
public class Leaf {
int f = 0;
Leaf increment() {
f ++;
return this;
}
}
- 在构造函数中调用构造器
public class Coffee {
private double prices;
private String name;
private static final double DEFAULT_PRICES = 10.0;
public Coffee(double prices, String name) {
this.prices = prices;
this.name = name;
}
public Coffee(String name){
this(DEFAULT_PRICES, name);
}
}
- 陷阱:static方法中没有this的方法