5.1用构造器确保初始化
java会保证每个类都会被初始化
构造器名称与类名相同都是大写字母开头,并且会在创建对象时被自动调用(是一个隐式static方法),
默认构造器:无参构造器
有参构造器
class Rock {
Rock(int i){
System.out.println(“rock”+ i);
}
}
public class SimpleConstructor {
public static void main(String[] args) {
new Rock(3);
}
}
5.2 方法重载
方法名相同,参数不同(返回值可以不同)。
重载方法的区分
方法参数的不同,甚至连参数的顺序不同也可以区分不同的重载方法
涉及基本类型的重载,基本类型可以从较小的类型自动转化成较大的类型;但是对于char型,会直接提升为int类型
this关键字
四种用法
1 this指向当前对象的引用
2 在构造器中调用构造器在方法内部使用this调用构造器,根据传入的参数不同,区分不同的构造器,但只能在类的第一行使用一次
3 this还可以区分局部成员和数据成员产生的歧义性。
4 将当前对象传递给其他方法
public class Leaf {
int i = 0;
Leaf increment() {
i++;
System.out.println(this);
return this;
}
void print() {
System.out.println(“i = “ + i);
}
public static void main(String[] args) {
Leaf x = new Leaf();
System.out.println(x+”this is x”);
x.increment().increment().increment().print();
}
}
package IfElse**;
import static net.mindview.util.Print.print;
public class Flower {
int petalCount = 0;
String s = “initial value”;
**Flower(int petals) {<br /> petalCount = petals**;<br /> **_print_("Constructor w/ int arg only, petalCount= "<br /> + petalCount)**;<br /> **}<br /> Flower(String ss) {<br /> _print_("Constructor w/ String arg only, s = " + ss)**;<br /> **s = ss**;<br /> **}<br /> Flower(String s**, **int petals) {<br /> this(petals)**;<br />**//! this(s); // Can’t call two!<br /> this.s = s**; **// Another use of "this"<br /> _print_("String & int args")**;<br /> **}<br /> Flower() {<br /> this("hi"**, **47)**;<br /> **_print_("default constructor (no args)")**;<br /> **}<br /> void printPetalCount() {<br />//! this(11); // Not inside non-constructor!<br /> _print_("petalCount = " + petalCount + " s = " + s)**;<br /> **}<br /> public static void main(String[] args) {<br /> Flower x = new Flower()**;<br /> **x.printPetalCount()**;<br /> <br /> **}<br />}
成员初始化
java会保证基本类型的数据成员在使用前被初始化成默认值,对象和string类型被置为空
可以使用构造器来进行初始化,但是自动初始化发生在构造器之前
初始化顺序
在方法内部,变量定义的顺序决定了初始化的顺序,他们会在任何方法(包括构造器)之前得到初始化,即使他们散落在方法之间
静态数据初始化
静态数据只初始化一次,静态数据比非静态数据先初始化
package IfElse**;
import static net.mindview.util.Print.print;
class Bowl {
Bowl(int marker) {
print(“Bowl(“ + marker + “)”);
**}
void f1(int marker) {<br /> _print_("f1(" + marker + ")")**;<br /> **}<br />}
class Table {
static Bowl bowl1 = new Bowl(1)**;
**Table() {<br /> _print_("Table()")**;<br /> **_bowl2_.f1(1)**;<br /> **}
void f2(int marker) {<br /> _print_("f2(" + marker + ")")**;<br /> **}
static Bowl _bowl2 _= new Bowl(2)**;<br />**}
class Cupboard {
Bowl bowl3 = new Bowl(3);
static Bowl bowl4 = new Bowl(4)**;
**Cupboard() {<br /> _print_("Cupboard()")**;<br /> **_bowl4_.f1(2)**;<br /> **}
void f3(int marker) {<br /> _print_("f3(" + marker + ")")**;<br /> **}
static Bowl _bowl5 _= new Bowl(5)**;<br />**}
public class StaticInitialization {
public static void main(String[] args) {
print(“Creating new Cupboard() in main”);
new Cupboard();
print(“Creating new Cupboard() in main”);
new Cupboard();
table.f2(1);
cupboard.f3(1);
}
static Table _table _= new Table()**;<br /> **static Cupboard _cupboard _= new Cupboard()**;<br />**}
/* Output:
Bowl(1)
Bowl(2)
Table()
f1(1)
Bowl(4)
Bowl(5)
Bowl(3)
Cupboard()
f1(2)
Creating new Cupboard() in main
Bowl(3)
Cupboard()
f1(2)
Creating new Cupboard() in main
Bowl(3)
Cupboard()
f1(2)
f2(1)
f3(1)
初始化顺序
数组初始化
int[] a;
初始化过程
1使用new创建数组,2对数组赋值
可变参数列表
在一个方法中采用如下形式
static void printArray(Object… args)产生一个Object类型的可变参数列表
枚举类型
public enum Spiciness {
NOT,MILD,MEDIUN
}
使用
Spiciness h=Spiciness.MEDIUN;