`
supportopensource
  • 浏览: 525302 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

成员初始化

阅读更多
Java尽力保证:所有变量在使用前都能得到恰当的初始化

对于定义在方法内部的局部变量,Java以编译时错误的形式来贯彻这种保证。例如:
void f(){
	int i;
	i++;//Error--i not initialized
}

该段代码会得到一条出错消息,告诉你i可能尚未初始化。当然,编译器也可以为i赋一个默认值,但是未初始化的局部变量更有可能是程序员的疏忽,所以采用默认值反而会掩盖这种失误。所以强制程序员提供一个初始值,往往能够帮助找出程序里的bug。

对于类的数据成员是基本数据类型,情况会变得不同。因为类中的任何方法都可以初始化或用到这些数据成员,所以强制用户一定要在使用数据前将其初始化成一个适当的值并不现实。然而,任其含有无意义的值同样也是不安全的。因此,类的每一个基本数据类型的数据成员保证都会有一个初始值
例如:
public class InitialValues{
	boolean t;
	char c;
	byte b;
	short s;
	int i;
	long l;
	float f;
	double d;
	void print(String s){
		System.out.println(s);
	}
	void printInitialValues(){
		print("Data Type	Intial value");
		print("boolean		"+t);
		print("char 		["+c+"]");
		print("byte 		"+b);
		print("short 		"+s);
		print("int 		"+i);
		print("long 		"+l);
		print("float 		"+f);
		print("double 		"+d);
	}
	public static void main(String args[]){
		InitialValues iv = new InitialValues();
		iv.printInitialValues();
	}
}

程序运行结果如下:




可见尽管类中的数据成员的初值没有给出,但它们确实有初值(char的初值为0,所以显示为空白)。这样至少不会冒“未初始化变量”的风险了。

在类里定义一个对象引用时,如果不将其初始化,此引用就会获得一个特殊值null

1、指定初始化

如果想为某个变量赋初值,该怎么做呢?有一种很直接的办法,就是在定义类的成员变量的地方为其赋值。以下代码片段修改了InitialValues类成员变量的定义,直接提供了初值。
public class InitialValues{
	boolean t = true;
	char c = 'x';
	byte b = 47;
	short s = 0xff;
	int i = 999;
	long l = 1;
	float f = 3.14f;
	double d = 3.14159;
	//……
}


也可以用同样的方法初始化非基本数据类型的对象,如果Depth是一个类,那么可以像下面这样创建一个对象并初始化它:
classs Depth{}
public class Measurement{
	Depth d = new Depth();
	//......
}


如果没有为d指定初始值就尝试使用它,就会出现运行时错误,告诉你产生了一个“异常”

甚至可以通过调用某个方法来提供初值:
public class MethodInit{
	int i = f();
	int f(){return 11;}
}


这个方法也可以带有参数,但这些参数必须是已经被初始化了的。因此,可以这样写:
public class MethodInit2{
	int i = f();
	int j = g(i);
	int f(){return 11;}
	int g(int n){return n*10;}
}


但是像下面这样写就不对了:
public class MethodInit3{
	//! int j = g(i);//Illegal forward reference
	int i = f();
	int f(){return 11;}
	int g(int n){return n*10;}
}

显然,上述程序的正确性取决于初始化的顺序,而与其编译方式无关。所以,编译器恰当地对“向前引用”发出了警告。

这种初始化方法既简单又直观。但有个限制:类InitialValues的每个对象都会具有相同的初值。有时,这正是所希望的,但有时却需要更大的灵活性。


  • 大小: 40.7 KB
分享到:
评论

相关推荐

    C++类成员和数据成员初始化总结

    总结来说,C++中的类成员和数据成员初始化是一个严谨的过程,需要理解构造函数的机制,以及`const`、`static`和数组的特殊性。正确初始化成员可以确保对象的有效性和代码的健壮性。遵循这些规则,可以帮助我们编写出...

    C++中成员初始化列表的使用

    ### C++中成员初始化列表的使用 在C++编程中,成员初始化列表是一个非常重要的概念,尤其是在类的设计和实现过程中。本文将详细解释成员初始化列表的概念、用途以及它与传统构造函数内初始化的区别,并通过具体示例...

    2.3命名返回值优化和成员初始化队列共3页.pdf.zip

    本话题主要探讨了两个关键概念:命名返回值优化(NRVO)和成员初始化队列。这两个特性都是为了提高程序的性能和代码的清晰度。 首先,让我们深入理解命名返回值优化(NRVO)。NRVO是一种编译器优化技术,它减少了...

    Java 成员初始化要注意的两种不同的情况

    在Java编程语言中,成员初始化是创建对象时为类的实例变量赋予初始值的过程。本文将详细探讨Java成员初始化的两种不同情况,以及与之相关的基础知识。 首先,我们来看第一种情况:类内的变量初始化。当声明一个类的...

    关于C++类的成员初始化列表的相关问题

    C++类的成员初始化列表是构造函数中一种特殊的形式,用于在对象实例化时直接对类的成员变量进行初始化。这种列表在特定情况下是必要的,因为它可以提高代码的效率并确保正确的初始化顺序。 首先,成员初始化列表在...

    C++类的静态成员初始化详细讲解

    总之,C++类的静态成员初始化需要根据其类型和const属性来确定初始化的位置。整型和枚举型const静态成员可以直接在类声明中初始化,而其他类型的静态成员则需要在类声明之外初始化,并使用作用域解析运算符指定所属...

    成员初始化列表与构造函数体中的区别详细解析

    C++ Primer中在讲构造函数初始化列表的时候有这么一段话:无论是在构造函数初始化列表中初始化成员,还是在构造函数体中对它们赋值,最终结果是相同的。不同之处在于,使用构造函数初始化列表的版本初始化数据成员,...

    C++构造函数初始化列表

    2. **const成员变量的强制初始化**:对于声明为const的成员变量,必须在构造函数初始化列表中进行初始化,因为在构造函数体内不允许修改const成员变量。 3. **效率与安全性的提升**:直接初始化比赋值更高效,尤其是...

    Java关于含有继承类的成员初始化过程讲解

    Java关于含有继承类的成员初始化过程讲解 titre1:Java中的继承类成员初始化过程 在Java中,继承类的成员初始化过程是一个复杂且容易让人困惑的地方。今天,我们将通过一个具体的实例来讲解这个过程,以帮助读者...

    java数组初始化详解

    Java 数组初始化详解 Java 数组初始化是 Java 编程语言中的一种基本概念,它允许开发者创建和初始化数组,以便于存储和操作数据。在本文中,我们将对 Java 数组初始化进行详细的介绍,包括一维数组和二维数组的声明...

    简单了解Java类成员初始化顺序

    Java类成员初始化顺序详解 Java类成员初始化顺序是Java编程中一个非常重要的概念,它直接关系到Java类的实例化和成员变量的初始化顺序。下面我们将通过详细的示例代码来介绍Java类成员初始化顺序。 首先,Java类中...

    成员的初始化顺序和多态性

    ##### 步骤一:成员初始化顺序 成员变量的初始化顺序遵循以下规则: 1. **实例变量的初始化**:按照它们在类中出现的顺序进行初始化。 2. **构造函数中的初始化**:在构造函数内部,可以显式初始化成员变量,这...

    类继承的初始化顺序类,继承的初始化顺序

    2. **子类静态成员初始化**:随后是子类中的静态成员初始化。 3. **基类非静态成员初始化**:当创建一个子类对象时,会首先调用基类的构造函数来初始化基类的非静态成员变量。 4. **子类非静态成员初始化**:接着是...

    类的static,const,static const,const static成员的初始化

    1. 类里的 const 成员初始化 在一个类里,const 成员变量不能在类定义中赋初值,因为编译器不知道 const 的内容是什么,所以不能把它用作编译期间的常量。因此,const 成员变量必须在构造函数中初始化,而不可以在...

    typedef struct 与 struct 的区别及初始化

    初始化结构体时,通常有两种方式:构造函数初始化(如果结构体是类)和成员初始化列表。由于 `struct` 在C++中等同于类,但不支持构造函数,所以我们必须使用成员初始化列表。例如,对于 `PhotoInfo` 结构体,其初始...

    Qt变量初始化,为何要与声明的次序保持一致?-CSDN论坛1

    这个问题涉及到C++的构造函数和成员初始化列表。 在C++中,当创建一个类的对象时,构造函数会被调用。在构造函数的成员初始化列表中,成员变量的初始化顺序并不是由它们在初始化列表中出现的顺序决定的,而是由它们...

    关于Java静态成员变量和静态初始化块等的初始化顺序的详细介绍

    详细介绍了Java的静态成员变量、静态数据块、非静态成员变量和非静态成员变量等初始化顺序

    c# 类成员初始化顺序的特殊情况

    这里直接给出C#类成员一般初始化顺序: 子类静态字段 子类静态构造 子类实例字段 父类静态字段 父类静态构造 父类实例字段 父类实例构造 子类实例构造 为什么说是“一般”初始化顺序呢?因为根据类结构的...

    Effective C# 使用成员初始化器而不是赋值语句

    因此,推荐使用成员初始化器而非赋值语句,这一做法可以显著简化构造函数的编写,同时确保成员变量在构造过程中得到正确且一致的初始化。 成员初始化器是在变量声明的时候就对成员变量进行初始化的语法结构。这不仅...

Global site tag (gtag.js) - Google Analytics