java程序值的传递,这段程序的结果是什么,为什么会出现这种结果,程序运行的流程顺序是什么,运行时父类Base中的this又指什么

祁仙森 2019-01-12 10:49:06
//java程序值的传递,这段程序的结果是什么,为什么会出现这种结果,程序运行的流程顺序是什么,运行时父类Base中的this又指什么
public class ExamTest {
public static void main(String[] args) {
new Derived();
}
}

class Base {
private int i = 2;
public Base() {
this.display();
}
public void display() {
System.out.println(i);
}
}

class Derived extends Base {
private int i = 22;
public Derived() {
super();
i = 222;
}
public void display() {
System.out.println(i);
}
}
...全文
488 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_39936465 2019-01-25
  • 打赏
  • 举报
回复
[/quote]

执行顺序 是先父类给i1 ,i2赋值,再到构造里的子类方法?然后由于子类i1被覆盖,所以i1会默认为0,并不显示2,但i2是继承父类的,所以显示为i2=2 ;这样理解对吗。
[/quote]

初始化顺序先父再子,覆盖的变量和方法,默认为子类的,i1默认为0是因为子类还没初始化.
胖鸟飞不动 2019-01-25
  • 打赏
  • 举报
回复
引用 2 楼 qq_39936465 的回复:
我们把程序改一下可以看的更清楚


public class Examtest {
	public static void main(String[] args) {
		new Derived();
	}
}

class Base {
	int i1 = 2;
	int i2 = 2;

	public Base() {
		display();
	}

	public void display() {
		System.out.println("Base.i" + i1);
		System.out.println("Base.i" + i2);
	}
}

class Derived extends Base {
	private int i1 = 22;

	public Derived() {
		display();
		i2 = 222;
		display();
	}

	public void display() {
		System.out.println("Derived.i1="+i1);
		System.out.println("Derived.i2="+i2);
	}
}

输出结果: Derived.i1=0 Derived.i2=2 Derived.i1=22 Derived.i2=2 Derived.i1=22 Derived.i2=222 这里可以看出,初始化子类时先初始化父类,这里的super();可以省略默认被执行,但是子类初始化变量和父类相同时,该变量不会初始化所以该变量值还是0,而子类中没有的变量会被初始化。而子类方法同父类方法同名时,直接覆盖父类方法,这里就是我们所说的重写父类方法。所以这里display();只会执行子类中的方法。父类被初始化后子类才会被初始化,i1这时才会被赋值,i2默认被子类继承。
执行顺序 是先父类给i1 ,i2赋值,再到构造里的子类方法?然后由于子类i1被覆盖,所以i1会默认为0,并不显示2,但i2是继承父类的,所以显示为i2=2 ;这样理解对吗。
qq_39936465 2019-01-24
  • 打赏
  • 举报
回复
我说的还不太全面,子类有父类相同名称的变量和方法,默认都是子类,但是父类中该变量和方法还是存在的,需要在变量和方法前加super来调用,可以查看下面的程序。

public class Examtest {
public static void main(String[] args) {
new Derived();
}
}

class Base {
int i1 = 2;
int i2 = 2;

public Base() {
display();
}

public void display() {
System.out.println("Base.i1=" + i1);
System.out.println("Base.i2=" + i2);
}
}

class Derived extends Base {
private int i1 = 22;

public Derived() {
super.display();
}

public void display() {
System.out.println("Derived.i1="+i1);
System.out.println("Derived.i2="+i2);
}
}




输出结果:

Derived.i1=0
Derived.i2=2
Base.i1=2
Base.i2=2
qq_39936465 2019-01-24
  • 打赏
  • 举报
回复
我们把程序改一下可以看的更清楚



public class Examtest {
public static void main(String[] args) {
new Derived();
}
}

class Base {
int i1 = 2;
int i2 = 2;

public Base() {
display();
}

public void display() {
System.out.println("Base.i" + i1);
System.out.println("Base.i" + i2);
}
}

class Derived extends Base {
private int i1 = 22;

public Derived() {
display();
i2 = 222;
display();
}

public void display() {
System.out.println("Derived.i1="+i1);
System.out.println("Derived.i2="+i2);
}
}



输出结果:

Derived.i1=0
Derived.i2=2
Derived.i1=22
Derived.i2=2
Derived.i1=22
Derived.i2=222


这里可以看出,初始化子类时先初始化父类,这里的super();可以省略默认被执行,但是子类初始化变量和父类相同时,该变量不会初始化所以该变量值还是0,而子类中没有的变量会被初始化。而子类方法同父类方法同名时,直接覆盖父类方法,这里就是我们所说的重写父类方法。所以这里display();只会执行子类中的方法。父类被初始化后子类才会被初始化,i1这时才会被赋值,i2默认被子类继承。



northwesternwind 2019-01-12
  • 打赏
  • 举报
回复
this: 表示这个对象自己。 因为代码中这个对象本身是Derived 类型,所以调用的是Derived 类中的Display(). 而Derived中的Display()输出的是子类中的变量i.
父类构造函数执行时,子类成员变量还没有开始初始化(这个也是合理的,因为子类变量初始化可以引用基类变量,所以需要在基类构造函数之后执行)。 所以显示结果为0.

这个代码修改成这样,更能体现这个过程:

public class JavaTest {
public static void main(String[] args) {
new Derived();
}
}

class Base {
private int i = 2;

public Base() {
this.display();
}

public int geti() {
return i;
}

public void display() {
System.out.println("Base i=" + i);
}
}

class Derived extends Base {
private int i = super.geti() + 22;

public Derived() {
display();
}

public void display() {
System.out.println("Derived i=" + i);
}
}

输出结果:
Derived i=0
Derived i=24

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧