论坛首页 入门技术论坛

Java 子类对象实例化 面试题

浏览 2967 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-07-28  
子类对象实例化面试题,拿来给大家分享下了,希望指点哦
package com.gem.j2SE03;
abstract class A {
	private int x = 100;
	public A(){
		this.print();
	}
	public abstract void print();
}
class B extends A {
	
		private int x = 200;
		public B(int x){
			this.x = x;
		}
		public void print(){
			System.out.println("x=" + x);
		}
	}


public class TestJava
{
	private void mian()
	{
		A a = new B(20);

	}

}
答案:x=0
子类的实例化过程:应该是先调用父类中的构造方法,然后再执行子类中的自己的构造方法了,查了资料才看到的,学了不少哦

 

   发表时间:2009-07-29  
A a = new B(20);  
这个时候a已经向上转型,只能看成A类型,不能看成B类型.
A的x,与B的x,作用范围不一样.

楼主:先调用父类中的构造方法,然后再执行子类中的自己的构造方法...这个是对的,就是这样.
A a =这个时候 x的时候是100,但是A构造器,调度print(); 由于B实现A类方法,这个时候,又会去调度B的print(); 但是这个时候并没有调度到B的构造器,导致B的x的没有赋值200,所以x=0;

A a = new B(20); 
的执行顺序:A的构造器,A的print()方法; B的print()方法;B的构造器.(而调度B的构造器才会赋值成功)
建议在把构造器在加一下下面语句,就会明白他们真正执行顺序.
public A(){  
        this.print();
        System.out.println("x=" + x);  
    } 
public B(){  
        this.print();
        System.out.println("x=" + x);  
    }
0 请登录后投票
   发表时间:2009-07-29  
有道理,又学习了新东西了,谢谢,大家共进步
0 请登录后投票
   发表时间:2009-08-05  
进一步学习了子类与父类间的关系
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics