我想找出1)派生类变量的初始化/实例的顺序,2)在这个代码片段中调用基类构造函数。
public class base
{
int y = 1;
public base()
{
y = 2;
function();
}
void function ()
{
System.out.println("In base Value = " + String.valueOf(y));
}
public static class derived extends base
{
int y = 3;
public derived()
{
function();
}
void function ()
{
System.out.println("In derived Value = " + String.valueOf(y));
}
}
public static void main(String[] args)
{
base b = new base.derived();
return;
}
}我的理解是,首先,派生类被初始化,然后调用基类构造函数,然后初始化派生类变量y。这个命令正确吗?
发布于 2015-09-09 23:36:59
执行顺序如下:
1)静态初始化器
基类实例化
2)实例初始化器
3)构造函数
4)主体的其余部分。
基类实例化之前的静态初始化程序。
如果有多个实例初始化器,则它们按照从上到下写入的顺序进行。
你的代码
您没有任何实例块。
父类构造函数首先运行,基类中的y变量设置为2,然后调用函数方法,但是函数方法在子类中被重写,因此使用子类方法。
但是,派生的.y变量尚未初始化,因此y的值默认为0。
在此之后,子类;派生的构造函数运行,派生.y的值声明为3,派生类中定义的覆盖函数方法运行,因此打印派生值为3。
注:这两个y变量并不相同。
发布于 2022-06-01 00:35:26
要添加到会话(这是在Kotlin中,它类似于Java),以下程序的输出
open class Base {
val x = 1
constructor() {
println("x=$x")
function()
}
open fun function() {
}
open class Derived1 : Base {
val y = 2
constructor() {
println("y=$y")
function()
}
override fun function() {
println("In derived Value = $y")
}
}
class Derived2 : Derived1 {
var z = 3
constructor() : super() {
println("z=$z")
function()
}
override fun function() {
println("In derived Value = $z")
}
}
}
fun main(args: Array<String>) {
val b: Base = Base.Derived2()
return
}是
x=1
In derived Value = 0
y=2
In derived Value = 0
z=3
In derived Value = 3
Process finished with exit code 0https://stackoverflow.com/questions/32490714
复制相似问题