Java 源代码



摘录 Java编程思想

1) 调用基类的构造器

2) 按照声明顺序调用成员的初始化方法

3) 调用到处类构造体的主体

==================================

顺序 : 层层递归到基类

按照编译,

Java中Static 相当于 一个全局变量,所以应该首先被初始化,防止引起编译错误。而且需要全部被初始化,从基类到最终的导出类。

 

然后 因为导出类 从基类导出,所以首先应该初始化 基类。

基类的初始化顺序 因为成员变量 只会 造成子类即导出类。 构造函数可能会使用到类中的变量,所以在调用构造器之前一定要使得成员变量即域初始化。

首先初始化 成员变量,然后初始化相应的构造器,初始化完成,接着层层初始化 后续的导出类。

 =================================

2015.1.13 补充

上述的内容还不是十分完整。

首先我们先看地下的程序,介绍下 构造器内部的多态方法的行为。

 

  1. package chapter8_6;  
  2.   
  3.   
  4. class Glyph {  
  5.     void draw(){System.out.println("Glyph Draw()");}  
  6.   
  7.     Glyph(){  
  8.         System.out.println("Glyph() before draw()");  
  9.         draw();  
  10.         System.out.println("Glyph() after draw()");  
  11.     }  
  12. }  
  13.   
  14. class MyObject{  
  15.     @Override  
  16.     public String toString() {  
  17.         // TODO Auto-generated method stub  
  18.         return "MyObject";  
  19.     }  
  20. }  
  21.   
  22. class RoundGlyph extends Glyph {  
  23.     private MyObject radius = new MyObject();  
  24.   
  25.     @Override  
  26.     void draw(){System.out.println("RoundGlyph Draw(), radius = "+radius);}  
  27.   
  28.     public RoundGlyph(MyObject r){  
  29.         radius = r;  
  30.         System.out.println("RoundGlyph().draw(),radius = "+radius);  
  31.     }  
  32. }  
  33.   
  34. public class PolyConstructors extends Glyph {  
  35.     public static void main(String[] args) {  
  36.         new RoundGlyph(new MyObject());  
  37.     }  
  38. }  
package chapter8_6;


class Glyph {
	void draw(){System.out.println("Glyph Draw()");}

	Glyph(){
		System.out.println("Glyph() before draw()");
		draw();
		System.out.println("Glyph() after draw()");
	}
}

class MyObject{
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return "MyObject";
	}
}

class RoundGlyph extends Glyph {
	private MyObject radius = new MyObject();

	@Override
	void draw(){System.out.println("RoundGlyph Draw(), radius = "+radius);}

	public RoundGlyph(MyObject r){
		radius = r;
		System.out.println("RoundGlyph().draw(),radius = "+radius);
	}
}

public class PolyConstructors extends Glyph {
	public static void main(String[] args) {
		new RoundGlyph(new MyObject());
	}
}

===============================

// Output:

Glyph() before draw()
RoundGlyph Draw(), radius = null
Glyph() after draw()
RoundGlyph().draw(),radius = MyObject

===============================

基类构造函数中含有某个被到处类覆盖的函数,如 Draw() 在初始化 基类时候,因为到处类还没有进行初始化,但是动态绑定方法的时候绑定到了子类的方法,所以分配给对象的存储空间的初始化为二进制的零。 对于int类型 初始化为 0  对于 Object对象 初始化 为 null

初始化的实际过程是:

1) 在其他任何事物发生之前,将分配给对象的存储空间初始化成二进制的零。

2) 如前所述的那样调用基类构造器。

3) 按照声明的顺序调用成员的初始化方法。

4) 调用导出类的构造器主体。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值