java构造函数的使用
一 java程序依旧是从main函数入口。但是初始化时先对变量进行初始化,即使变量的定义在方法的后面。静态变量只能被初始化一次,且它的初始化是位于其他变量之前的。
例:对下面程序
//有了静态,非静态成员的构造调用
//下面程序执行步骤:public 类中有静态变量,先执行。到具体的类中,执行顺序是先静态,非静态,在构造函数
//特别重要的一点是静态变量只能被初始化一次
package first;
class Bowl{
Bowl(int marker){
System.out.println("Bowl("+marker+")");
}
void f(int marker){
System.out.println("f("+marker+")");
}
}
class Table{
static Bowl b1=new Bowl(1);
Table(){
System.out.println("Table()");
b2.f(1);
}
void f2(int marker){
System.out.println("f2("+marker+")");
}
static Bowl b2=new Bowl(2);
}
class Cupboard{
Bowl b3=new Bowl(3);
static Bowl b4=new Bowl(4);
Cupboard(){
System.out.println("Cupboard()");
b4.f(2);
}
void f3(int marker){
System.out.println("f3("+marker+")");
}
static Bowl b5=new Bowl(5);
}
public class Hello {
public static void main(String args[]){
System.out.println("Creating new Cupboard() in main");
new Cupboard();
System.out.println("Creating new Cupboard() in main");
new Cupboard();
t2.f2(1);
t3.f3(1);
}
static Table t2=new Table();
static Cupboard t3=new Cupboard();
}
实验的运行结果应该:
Bowl(1)
Bowl(2)
Table()
f(1)
Bowl(4)
Bowl(5)
Bowl(3)
Cupboard()
f(2)
Creating new Cupboard() in main
Bowl(3)
Cupboard()
f(2)
Creating new Cupboard() in main
Bowl(3)
Cupboard()
f(2)
f2(1)
f3(1)
二:关于存在继承关系的构造函数。对于有父类的类,初始化时要层层向上找,直到找到最基类。然后依次开始进行初始化。
下面示例:
package first;
class Meal {
Meal() { System.out.println("Meal()"); }
}
class Bread {
Bread() { System.out.println("Bread()"); }
}
class Cheese {
Cheese() { System.out.println("Cheese()"); }
}
class Lettuce {
Lettuce() { System.out.println("Lettuce()"); }
}
class Lunch extends Meal {
Lunch() { System.out.println("Lunch()"); }
}
class PortableLunch extends Lunch {
PortableLunch() { System.out.println("PortableLunch()");}
}
public class Hello extends PortableLunch {
private Bread b = new Bread();
private Cheese c = new Cheese();
private Lettuce l = new Lettuce();
public Hello() {
System.out.println("Sandwich()");
}
public static void main(String[] args) {
new Hello();
}
} ///:~
运行结果:
Meal()
Lunch()
PortableLunch()
Bread()
Cheese()
Lettuce()
Sandwich()
三:存在抽象类的规则:抽象类中存在未定义的函数,所以调用时,函数中的值全初始化为0
示例:package first;
abstract class Glyph {
abstract void draw();
Glyph() {
System.out.println("Glyph() before draw()");
draw();
System.out.println("Glyph() after draw()");
}
}
class RoundGlyph extends Glyph {
private int radius = 1;
RoundGlyph(int r) {
radius = r;
System.out.println(
"RoundGlyph.RoundGlyph(), radius = " + radius);
}
void draw() {
System.out.println(
"RoundGlyph.draw(), radius = " + radius);
}
}
public class Hello {
public static void main(String[] args) {
new RoundGlyph(5);
}
} ///:~
运行结果:
Glyph() before draw()
RoundGlyph.draw(), radius = 0
Glyph() after draw()
RoundGlyph.RoundGlyph(), radius = 5