/**
* 练习19,难度2.
* 创建一个类, 类中有一个blank final指针, 该指针指向一个对象,
* 在所有的constructor中执行black final的初始化.
* 说明blank final在使用前, 必须初始化, 而一旦初始化, 该blank final成员就不能改变.
* Exercise 19: (2) Create a class with a blank final reference to an object.
* Perform the initialization of the blank final inside all constructors.
* Demonstrate the guarantee that the final must be initialized before use,
* and that it cannot be changed once initialized.
*/
package reusing;
class P185{
public String name;
P185(String s){
name=s;
}
public String getName(){
return name;
}
}
public class P185E19 {
final P185 x;
P185E19(int i){
System.out.println("Constructor of P185E19.");
//!System.out.println(x.name); //初始化之前不能使用
System.out.println("x will be initialized.");
//如果没有下面这行, compiler会报错:
//The blank final field x may not have been initialized.
x=new P185("I'm x, an object of P185, i'm initialized.");
//x初始化之后就可以用了.
System.out.println(x.name);
//因为x是final, 所以下面更改x reference的语句不能执行, 如果去掉final, 就可以了
//!x=new P185("Hello.");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
P185E19 y=new P185E19(1);
//!System.out.println(x.name); //这里的x和y.x是不一样的, 这里的x是一个局部变量
//!System.out.println(this.x.name); //this是类的指针, 不可能和特定的x的指针挂钩
System.out.println(y.x.name); //这样才可以
}
}
改进版:
/**
* 练习19,难度2.
* 创建一个类, 类中有一个blank final指针, 该指针指向一个对象,
* 在所有的constructor中执行black final的初始化.
* 说明blank final在使用前, 必须初始化, 而一旦初始化, 该blank final成员就不能改变.
* Exercise 19: (2) Create a class with a blank final reference to an object.
* Perform the initialization of the blank final inside all constructors.
* Demonstrate the guarantee that the final must be initialized before use,
* and that it cannot be changed once initialized.
*/
package reusing;
class P185{
public String name;
P185(String s){
name=s;
}
public String getName(){
return name;
}
}
public class P185E19 {
final P185 x;
//P185 x;
P185E19(int i){
System.out.println("Constructor of P185E19.");
//!System.out.println(x.name); //初始化之前不能使用
System.out.println("x will be initialized.");
//如果没有下面这行, compiler会报错:
//The blank final field x may not have been initialized.
x=new P185("I'm x, an object of P185, i'm initialized.");
//x初始化之后就可以用了.
System.out.println(x.name);
//因为x是final, 所以下面更改x reference的语句不能执行, 如果去掉final, 就可以了
//!x=new P185("Hello.");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
P185E19 y=new P185E19(1);
//!System.out.println(x.name); //这里的x和y.x是不一样的, 这里的x是一个局部变量
//!System.out.println(this.x.name); //this是类的指针, 不可能和特定的x的指针挂钩
System.out.println(y.x.name); //这样才可以
//看看在这里能否改变final x的reference的值, 显然不能. 但如果把x前面的final去掉, 就可以啦.
//! y.x=new P185("hello. i'm changed.");
}
}