`

《thinking in java》第四章:初始化与清理三

阅读更多

http://quicker.iteye.com/blog/548770

http://quicker.iteye.com/blog/548787

前两文已经对JAVA初始化作了说明,本文以一个例子进行补充。

规则:

  1.       Java程序执行前必须先加载,先定位加载开始类(public的类),若存在继承关系,由父类开始加载,加载时必须初始化static成员变量。
  2.          加载时若遇到新的类,必须先对该类进行加载,方法如上。
  3.          加载完后再执行,执行时由main()方法开始。若存在继承,调用子类的构造方法,必须先执行其父类的构造方法。
  4.          执行构造函数前必须先初始化该类的成员变量,但static成员变量只需要初始化一次。
  5.          成员变量不能用自身的构造函数进行初始化,除非声明其为static

代码示例:

class Goods{
	Goods(){
		System.out.println("goods");
	}
}

class Meal {
  static Meal ml = new Meal(1);  
 // private Meal s = new Meal(2);  // stackOverFlow exception
  								  //成员变量不能用自身的构造函数,除非声明为static.
  private Bread b = new Bread(3);  
  Meal() { System.out.println("Meal()"); }
  Meal(int i) { System.out.println("Meal()" + i); }
}

class Bread {
  static Bread ml = new Bread(2);
  Goods g = new Goods();
  
  Bread() { System.out.println("Bread()"); }
  Bread(int i) { System.out.println("Bread()" + i); }
}

class Lunch extends Meal {
  Lunch() { System.out.println("Lunch()"); }
}

class PortableLunch extends Lunch {
  PortableLunch() { System.out.println("PortableLunch()"); }
}

public class SandWich extends PortableLunch {
  static Bread bb = new Bread();  
  private Bread b = new Bread();
  public SandWich() { System.out.println("SandWich()"); }
  public static void main(String[] args) {
	  System.out.println("---------------------------------------");
    new SandWich();
  }
}

 

如果能说出代码结果就表明过关。。

goods
Bread()2
goods
Bread()3
Meal()1
goods
Bread()
---------------------------------------
goods
Bread()3
Meal()
Lunch()
PortableLunch()
goods
Bread()
SandWich()

 

针对代码中:

class Meal {
  static Meal ml = new Meal(1);  
 // private Meal s = new Meal(2);  // stackOverFlow exception
  								  //成员变量不能用自身的构造函数,除非声明为static.
  private Bread b = new Bread(3);  
  Meal() { System.out.println("Meal()"); }
  Meal(int i) { System.out.println("Meal()" + i); }
}

 // private Meal s = new Meal(2);  // stackOverFlow exception

上面代码当声明为static的时候,只初如化一次,而非static声明Meal的实例,在调用构造函数之前需要初始化Meal类的成员变量,这样会不断地重复动作,最后抛出异常。

类似下面这段代码:

class Meal {
  static Meal ml = new Meal(1);  
 // private Meal s = new Meal(2);  // stackOverFlow exception
  								  //成员变量不能用自身的构造函数,除非声明为static.
  private Bread b = new Bread(3);  
  Meal() { System.out.println("Meal()"); }
  Meal(int i) { System.out.println("Meal()" + i); }
  
  public static void main(String[] args) {
	new Meal();
  }
}

 这个问题下贴有表述:

http://hi.baidu.com/yang1101190/blog/item/beb856c34c47865eb219a875.html

分享到:
评论

相关推荐

    Thinking in java4(中文高清版)-java的'圣经'

    4.4 Foreach语法 4.5 return 4.6 break和 continue 4.7 臭名昭著的“goto” 4.8 switch 4.9 总结 第5章 初始化与清理 5.1 用构造器确保初始化 5.2 方法重载 5.2.1 区分重载方法 5.2.2 涉及基本类型的重载 5.2.3 以...

    Thinking in Java.

    - **第4章:初始化与清理**:讨论对象的创建过程、初始化顺序以及资源释放的最佳实践。 ##### 第二部分:面向对象进阶 - **第5章:隐藏实现细节**:介绍抽象与封装的概念,学习如何设计具有良好隐藏机制的类。 - *...

    Thinking in Java Fourth Edition

    ### 《Thinking in Java》第四版重要知识点概览 #### 第1章 对象入门 - **对象的概念**:介绍面向对象编程的基本概念,包括对象、类、实例等。 - **创建对象**:详解如何在Java中创建对象,包括使用`new`关键字。 -...

    Thinking in Java读书笔记

    #### 第四章 初始化和清理 1. **构造函数(Constructor)** - 构造函数确保对象创建时执行必要的初始化。 - 当类中有构造函数时,Java会在创建对象时自动调用它。 2. **函数重载(Method Overloading)** - **区分...

    thinking in java txt

    - **第4章:类的创建与使用** - **4.1 成功证明开始**:通过实例验证所学知识。 - **4.2 类的定义与使用**: - **4.2.1 类的基本定义**:类的定义语法。 - **4.2.2 类成员的可见性**:public、protected、...

    thinking_in_java 第四版(英文)

    ### Thinking in Java 第四版 — 初始化与清理 #### 核心知识点概述 - **初始化的重要性**:在程序设计中,确保变量和对象被正确初始化至关重要,可以避免运行时错误和安全漏洞。 - **C 语言中的初始化问题**:C ...

    对Java的思考(Thinking in Java) Java入门 java与C++对比 深入浅出

    第4章"初始化和清除"主要关注对象的初始化,特别是通过构造器来确保初始化。介绍了方法过载的概念,包括如何区分不同签名的方法,以及this关键字的使用。同时,章节讨论了垃圾收集和finalizer方法,以及成员初始化...

    Thinking_in_java中文第4版

    ##### 第4章 初始化和清除 1. **由构建器保证初始化**:解释构造函数的作用以及如何使用构造函数初始化对象。 2. **清除:收尾和垃圾收集**:讨论对象生命周期结束时的清理工作,包括finalize()方法的作用。 3. **...

    Thinking in Java_all

    第四章“初始化和清除”关注对象的生命周期,包括构造器保证的初始化、方法过载、成员初始化和数组初始化。finalize()方法用于垃圾收集前的清理工作,但不保证一定会执行。 第五章“隐藏实施过程”引入了Java的包和...

    thinking in Java guide solutio

    根据提供的文件信息,我们可以将《Thinking in Java》第四版中的主要内容和知识点进行详细的解析与总结。本书由Bruce Eckel编写,是学习Java编程语言的经典教材之一。以下是对书中的几个关键章节及其涵盖的重要知识...

    Thinking in CSharp

    - **第五章:初始化与清理**(Initialization & Cleanup):本章着重于C#中的对象生命周期管理,包括如何初始化对象以及在对象不再需要时如何进行适当的清理工作,这对于避免内存泄漏等问题至关重要。 - **第六章:...

    thinking in java

    第4章《初始化和清除》讨论了对象的初始化,特别是通过构造函数来确保初始化。还涉及方法的重载、成员初始化、数组初始化以及垃圾收集和finalize()方法。理解何时以及如何进行对象的清理是防止内存泄漏的重要部分。 ...

    Thinking in Java, 2nd edition

    《Thinking in Java》是Bruce Eckel的经典之作,第二版对初学者和经验丰富的开发者都具有极高的价值。这本书深入浅出地介绍了Java编程语言的核心概念和技术,帮助读者建立起扎实的面向对象编程思想。 1. 面向对象...

    Thinking in C#

    - **第五章:初始化与清理**:介绍了对象的生命周期管理,包括构造函数、析构函数的使用。 - **第六章:耦合与内聚**:分析了模块化设计原则中的耦合性和内聚性,强调了良好的设计模式的重要性。 - **第七章:类的...

    thinking in java 英文版第三版

    3. **初始化与清理**:详细介绍了Java中对象的创建过程以及如何有效地进行资源清理,确保程序的健壮性和安全性。 4. **隐藏实现细节**:强调了封装的重要性,展示了如何通过封装隐藏对象内部的具体实现,提供一个...

    Thinking.in.Java第三版.第四版完整版

    4. **chap4 初始化与清理.pdf**:讨论了对象的生命周期,包括构造函数、初始化块、垃圾收集机制以及 finalize 方法,这些都是理解对象生命周期和内存管理的关键。 5. **chap7 多态性.pdf**:多态性是面向对象的重要...

Global site tag (gtag.js) - Google Analytics