`

面试题--类成员变量的初始化时间

 
阅读更多
class B {
	B() {
		System.out.println("B");
		go();
	}
	private int a=1;
	public void go(){
		System.out.println("a="+a);
	}
}

public class A1 extends B {
	A1() {
		System.out.println("A1");
	}
	private int a=11;
	public void go(){
		System.out.println("a="+a);
	}
	public static void main(String[] args) {
		new A1();
	}
}

以上代码输出结果为: 
B
a=0
A1

 

我当时以为是输出a=11,结果回来跑了一把代码后,发现为0,即:先执行A1这时只是申明变量,并没赋值,然后执行B(),这时获取到a是A1里的,但还是初始值0呢,所以输出0.

后来经资料官方的解释为:对类变量的初始化是在执行完其构造方法的第一行代码(即this或super)后才开始的。

 

以下代码可以证实:

class B {
	B() {
		final B b=this;
		go();
		new Thread() {
			public void run() {
				try {
					Thread.sleep(2000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				b.go();
			}
		}.start();
	}
	public void go(){
	}
}

public class A1 extends B {
	A1() {
		System.out.println("aa");
		go();
	}
	private int a=11;
	public void go(){
		System.out.println("a="+a);
	}
	public static void main(String[] args) {
		new A1();
	}
}

输出结果为:

a=0
aa
a=11//这个是23行输出的
a=11//这个是12行输出的,由于另起了线程,所以在输出的时候已经执行完了构造方法

1
5
分享到:
评论
4 楼 cwj158 2011-09-13  
super
Rainbow702 写道
引用
后来经资料官方的解释为:对类变量的初始化是在执行完其构造方法的第一行代码(即this或super)后才开始的。

这句话是OK的,你可以在 B 类的构造函数中的第一行加个
super();

然后 DEBUG 一下就知道了。
其他的你应该这么理解:
在新建一个A1实例时,B类的构造函数要先被调用,在B类的构造函数中有一句是调用了  go()  方法的,由于 A1 类中重写了这个方法,所以会来调用 A1 中的这个方法,但此时,A1 中的 a 变量还没有被初始化,所以打印出来的是 0.

嗯,好办法哈。
3 楼 Rainbow702 2011-09-11  
引用
后来经资料官方的解释为:对类变量的初始化是在执行完其构造方法的第一行代码(即this或super)后才开始的。

这句话是OK的,你可以在 B 类的构造函数中的第一行加个
super();

然后 DEBUG 一下就知道了。
其他的你应该这么理解:
在新建一个A1实例时,B类的构造函数要先被调用,在B类的构造函数中有一句是调用了  go()  方法的,由于 A1 类中重写了这个方法,所以会来调用 A1 中的这个方法,但此时,A1 中的 a 变量还没有被初始化,所以打印出来的是 0.
2 楼 cwj158 2011-09-11  
瘋叻ハ.兩 写道
第二个程序中final B b = this; 你想表达什么吗?

首先谢谢你关注我的代码哈,
主要是我想在第12行调用b.go(); 但由于内部类不能访问外部类方法中的局部变量,除非变量是final的(一般发生在方法中定义的内部类)。所以只能加个FINAL。
1 楼 瘋叻ハ.兩 2011-09-11  
第二个程序中final B b = this; 你想表达什么吗?

相关推荐

    java面试题-类的初始化顺序.doc

    java面试题-类的初始化顺序.doc 大家在去参加面试的时候,经常会遇到这样的考题:给你两个类的代码,它们之间是继承的关系,每个类里只有构造器方法和一些变量,构造器里可能还有一段代码对变量值进行了某种运算,...

    C语言面试题-求职必备收藏备用.docx

    - 空指针和未初始化的指针有什么区别? - 野指针是什么?如何避免? - 如何使用指针交换两个变量的值? 3. **内存管理** - C语言中动态内存分配的函数有哪些? - `malloc` 和 `calloc` 有什么区别? - 什么是...

    java面试题-附答案

    byte属于Java中的整型,长度为1字节8bit,取值10000000(-128)到 01111111(127),变量初始化默认值为0,包装类Byte 2.short short属于Java中的整型,长度为2字节16bit,取值10000000 00000000(-32768)到 ...

    c++ 面试题 总结

    系统会初始化static int变量为0,但该值会一直保存,所谓的不可重入... -------------------------------------------------------------------------- 13.写出运行结果: {// test1 char str[] = "world"; cout (str...

    C语言面试题大汇总之华为面试题:1、局部变量能否和全局变量重名;2、如何引用一个已经定义过的全局变量;3、全局变量可不可以定义在可被多个.C文件包含的头文件中 为什么;4、语句for( ;1 ;)有什么问题 它是什么意思……

    static 局部变量只被初始化一次,下一次依据上一次结果值。static 函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝。 六、内存分配 程序的局部变量存在于堆栈中,全局变量存在于静态区中,动态申请数据...

    JAVA面试题解惑系列

    JAVA面试题解惑系列(一)——类的初始化顺序 大家在去参加面试的时候,经常会遇到这样的考题:给你两个类的代码,它们之间是继承的关系,每个类里只有构造器方法和一些变量,构造器里可能还有一段代码对变量值进行...

    C++ 成员变量的初始化顺序问题详解

    C++ 成员变量的初始化顺序问题详解 问题来源: 由于面试题中,考官出了一道简单的程序输出结果值的题:如下, class A { private: int n1; int n2; public: A():n2(0),n1(n2+2){} void Print(){ cout <&...

    Java变量初始化的时机

    以下是对java变量初始化的时机的分析。  【java变量执行初始化的步骤】  java是一门强类型语言,因此java语言规定每个变量必须先声明,然后才能使用,声明变量时必须指定该变量的数据类型。首先看下面这条语句的...

    Java变量类型常见面试题及答案

    本文提供了二十道常见的面试题,涵盖了Java中的基本数据类型、引用数据类型、作用域、初始化等方面的知识点。这些问题旨在考察候选人对Java变量类型的理解和应用能力。通过阅读本文,您将能够加深对Java变量类型的...

    JAVA面试题解惑系列合集

    1.1 JAVA面试题解惑系列(一)——类的初始化顺序 1.2 JAVA面试题解惑系列(二)——到底创建了几个String对象? 1.3 JAVA面试题解惑系列(三)——变量(属性)的覆盖 1.4 JAVA面试题解惑系列(四)——final、...

    Java-常见面试题.pdf

    如果修饰的是引用类型数据变量,则该变量不会再次初始化。 static 修饰的方法是否可以被继承 static 修饰的方法为静态方法,不能被重写,可以被继承。它可以直接使用类名.方法名进行调用,即该方法不属于某个对象...

    c++面试试题大全

    1) 引用必须被初始化,指针不必。 2) 引用初始化以后不能被改变,指针可以改变所指的对象。 2) 不存在指向空值的引用,但是存在指向空值的指针。 8. 描述实时系统的基本特性 在特定时间内完成特定的任务,实时性与...

    C语言面试题大全(很全的挺好)

    C语言面试题大全 1.限制变量的作用域(DL:使其只在定义的当前文件中起作用,static是只能由与变量在同一个文件中定义的程序 存取的全局变量。也就是说使全局变量成为文件的私有变量,以致其他文件不可以通过将它们...

    C / C++ 各种 面试题 笔试题

    3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放 4、文字...

    【Java高频面试题】–类的初始化过程以及实例的初始化过程

    1.1 类的初始化过程 要创建一个类的实例,必须加载和初始化该类。 main()方法所在的类,会被优先加载并初始化 子类初始化前,会先加载并初始化它的父类 初始化一个类,其实质上就是执行了()方法 ()方法包含了,静态...

    C语言最新面试题及答案.doc

    static局部变量只被初始化一次,下一次依据上一次结果值;static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝。 8、程序的局部变量存在于(堆栈)中,全局变量存在于(静态区)中,动态申请数据存在...

    Vue经典面试题_227题(部分题没答案).pdf_前端面试题

    Vue经典面试题_227题(部分题没答案).pdf_前端面试题 MVVM 模式 MVVM 模式是 Model-View-ViewModel 的缩写,代表一种设计思想。Model 层代表数据模型,也可以在 Model 中定义数据修改和操作的业务逻辑;View 代表 ...

    C、C++面试题.pdf

    面试题 面试题1:变量的声明和定义有什么区别 为变量分配地址和存储空间的称为定义,不分配地址的称为...说明:很多时候一个变量,只是声明不分配内存空间,直到具体使用时才初始化,分配内存空间, 如外部变量。

    最新华为面试题集合

    华为 1.static有什么用途?(请至少说明两种) 1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。 2) 在模块内(但在函数体外)...最新的统计华为面试题.无论面试还是学习指导都具有重要意义.

    JAVA面试题最全集

    静态变量和静态方法的意义,如何引用一个类的静态变量或者静态方法? 50.JAVA语言如何进行异常处理,关键字:thorws,throw,try,catch,finally 51.Object类(或者其子类)的finalize()方法在什么情况下被调用? 52....

Global site tag (gtag.js) - Google Analytics