局部变量如果没有初始化,比如:
class test {
static void f() {
int i;//未初始化局部变量
i++;
}
public static void main(String [] args) {
test t = new test();
t.f();
}
}
编译时会报错:未初始化局部变量
成员变量如果没有初始化,比如:
class test {
int i;//类成员变量可以不用初始化,系统有设置默认值
void prt() {
System.out.println(i);
}
public static void main(String [] args) {
test t = new test();
t.prt();
}
}
编译通过,运行时输出:0
如果在初始化时,引用了一个没有被初始化的变量(包括主数据类型和其他对象)也是不允许的。
class Test2 {
void f() {
int j =i;
int i = 0;
}
public static void main(String [] args) {
Test2 t2 = new Test2();
t2.f();
}
}
编译器会提示找不到字符i
变量初始化的顺序是由变量在程序中的顺序决定的,变量先于方法初始化,由Thinking in java中的例子就可以看出来:
class Tag {
Tag(int marker) {
System.out.println("Tag(" + marker + ")");
}
}
class Card {
Tag t1 = new Tag(1); // Before constructor
Card() {
// Indicate we're in the constructor:
System.out.println("Card()");
t3 = new Tag(33); // Re-initialize t3
}
Tag t2 = new Tag(2); // After constructor
void f() {
System.out.println("f()");
}
Tag t3 = new Tag(3); // At end
}
public class OrderOfInitialization {
public static void main(String[] args) {
Card t = new Card();
t.f(); // Shows that construction is done
}
}
运行结果:
初始化的顺序是首先static(如果它们尚未由前一次对象创建过程初始化),接着是非static 对象。
class prt {
prt(int cc){
System.out.println("prt(" + cc + ")");
}
}
class demo {
prt first = new prt(1);
static prt second = new prt(2);
}
public class StaticVar {
public static void main(String [] args) {
demo d = new demo();
}
}
运行结果:
- 大小: 2.5 KB
- 大小: 1.8 KB
分享到:
相关推荐
总结来说,C++中的类成员和数据成员初始化是一个严谨的过程,需要理解构造函数的机制,以及`const`、`static`和数组的特殊性。正确初始化成员可以确保对象的有效性和代码的健壮性。遵循这些规则,可以帮助我们编写出...
### C++中成员初始化列表的使用 在C++编程中,成员初始化列表是一个非常重要的概念,尤其是在类的设计和实现过程中。本文将详细解释成员初始化列表的概念、用途以及它与传统构造函数内初始化的区别,并通过具体示例...
本话题主要探讨了两个关键概念:命名返回值优化(NRVO)和成员初始化队列。这两个特性都是为了提高程序的性能和代码的清晰度。 首先,让我们深入理解命名返回值优化(NRVO)。NRVO是一种编译器优化技术,它减少了...
在Java编程语言中,成员初始化是创建对象时为类的实例变量赋予初始值的过程。本文将详细探讨Java成员初始化的两种不同情况,以及与之相关的基础知识。 首先,我们来看第一种情况:类内的变量初始化。当声明一个类的...
C++类的成员初始化列表是构造函数中一种特殊的形式,用于在对象实例化时直接对类的成员变量进行初始化。这种列表在特定情况下是必要的,因为它可以提高代码的效率并确保正确的初始化顺序。 首先,成员初始化列表在...
总之,C++类的静态成员初始化需要根据其类型和const属性来确定初始化的位置。整型和枚举型const静态成员可以直接在类声明中初始化,而其他类型的静态成员则需要在类声明之外初始化,并使用作用域解析运算符指定所属...
2. **const成员变量的强制初始化**:对于声明为const的成员变量,必须在构造函数初始化列表中进行初始化,因为在构造函数体内不允许修改const成员变量。 3. **效率与安全性的提升**:直接初始化比赋值更高效,尤其是...
C++ Primer中在讲构造函数初始化列表的时候有这么一段话:无论是在构造函数初始化列表中初始化成员,还是在构造函数体中对它们赋值,最终结果是相同的。不同之处在于,使用构造函数初始化列表的版本初始化数据成员,...
Java关于含有继承类的成员初始化过程讲解 titre1:Java中的继承类成员初始化过程 在Java中,继承类的成员初始化过程是一个复杂且容易让人困惑的地方。今天,我们将通过一个具体的实例来讲解这个过程,以帮助读者...
Java 数组初始化详解 Java 数组初始化是 Java 编程语言中的一种基本概念,它允许开发者创建和初始化数组,以便于存储和操作数据。在本文中,我们将对 Java 数组初始化进行详细的介绍,包括一维数组和二维数组的声明...
Java类成员初始化顺序详解 Java类成员初始化顺序是Java编程中一个非常重要的概念,它直接关系到Java类的实例化和成员变量的初始化顺序。下面我们将通过详细的示例代码来介绍Java类成员初始化顺序。 首先,Java类中...
##### 步骤一:成员初始化顺序 成员变量的初始化顺序遵循以下规则: 1. **实例变量的初始化**:按照它们在类中出现的顺序进行初始化。 2. **构造函数中的初始化**:在构造函数内部,可以显式初始化成员变量,这...
2. **子类静态成员初始化**:随后是子类中的静态成员初始化。 3. **基类非静态成员初始化**:当创建一个子类对象时,会首先调用基类的构造函数来初始化基类的非静态成员变量。 4. **子类非静态成员初始化**:接着是...
1. 类里的 const 成员初始化 在一个类里,const 成员变量不能在类定义中赋初值,因为编译器不知道 const 的内容是什么,所以不能把它用作编译期间的常量。因此,const 成员变量必须在构造函数中初始化,而不可以在...
初始化结构体时,通常有两种方式:构造函数初始化(如果结构体是类)和成员初始化列表。由于 `struct` 在C++中等同于类,但不支持构造函数,所以我们必须使用成员初始化列表。例如,对于 `PhotoInfo` 结构体,其初始...
这个问题涉及到C++的构造函数和成员初始化列表。 在C++中,当创建一个类的对象时,构造函数会被调用。在构造函数的成员初始化列表中,成员变量的初始化顺序并不是由它们在初始化列表中出现的顺序决定的,而是由它们...
详细介绍了Java的静态成员变量、静态数据块、非静态成员变量和非静态成员变量等初始化顺序
这里直接给出C#类成员一般初始化顺序: 子类静态字段 子类静态构造 子类实例字段 父类静态字段 父类静态构造 父类实例字段 父类实例构造 子类实例构造 为什么说是“一般”初始化顺序呢?因为根据类结构的...
因此,推荐使用成员初始化器而非赋值语句,这一做法可以显著简化构造函数的编写,同时确保成员变量在构造过程中得到正确且一致的初始化。 成员初始化器是在变量声明的时候就对成员变量进行初始化的语法结构。这不仅...