abstract class BaseView
{

public void initView(String moi){};
public BaseView(){}
}class AlarmView extends BaseView{
public AlarmView(String moi){
super();
initView(moi);
}
}public class CurrentAlarmView extends AlarmView
{
String moi = null;
public CurrentAlarmView(String str){
super(str);
}
public void initView(String str){
moi = str;
System.out.println("initView moi = "+moi);
}
public void print(){
System.out.println("moi = "+moi);
}
public static void main(String[] args){
CurrentAlarmView view = new CurrentAlarmView("test");
view.print();
}
}
结果:
initView moi = test
moi = null
请问大虾,为什么moi会为空而不是test?

解决方案 »

  1.   

    String moi = null;
    楼主这一句重新将moi赋值为null,呵呵
      

  2.   

    我认为:initView()是它的父类AlarmView调用的,只会使父类的那个moi变为test,而没有涉及到子类变量的改变.
      

  3.   

    调用CurrentAlarmView view = new CurrentAlarmView("test");
    依次执行顺序:
    执行CurrentAlarmView构造函数,
    执行AlarmView 的构造函数
    执行BaseView的构造函数
    执行CurrentAlarmView.initView
    (在执行构造函数之前,如果类中有static成员,那就先执行static成员初始化。)
    初始化CurrentAlarmView的成员。
    理解了这个顺序,你就知道为什么是你要的答案了。
      

  4.   

    public void initView(String str){
    moi = str;
    System.out.println("initView moi = "+moi);
    }莫非楼主以为上边变了,所以下边也变了???? public void print(){
    System.out.println("moi = "+moi);
    }
      

  5.   

    abstract class BaseView
    {public void initView(String moi){};
    public BaseView(){System.out.println("(1)");}
    }class AlarmView extends BaseView{
    public AlarmView(String moi){
    super();
    System.out.println("(2)");
    initView(moi);
    System.out.println("(5)");
    }
    }public class CurrentAlarmView extends AlarmView
    {
    String moi = null;
    public CurrentAlarmView(String str){super(str);
    System.out.println("(6)");
    }
    public void initView(String str){
    System.out.println("(3)");
    moi = str;
    System.out.println("(4)");
    System.out.println("initView moi = "+moi);
    }
     public void print(){
    System.out.println("moi = "+moi);
    }
    public static void main(String[] args){
    CurrentAlarmView view = new CurrentAlarmView("test");
    view.print();
    }
    }自己看
      

  6.   

    改一下:abstract class BaseView
    {public void initView(String moi){};
    public BaseView(){System.out.println("(1)");}
    }class AlarmView extends BaseView{
    public AlarmView(String moi){
    super();
    System.out.println("(2)");
    initView(moi);
    System.out.println("(5)");
    }
    }public class CurrentAlarmView extends AlarmView
    {
    {
     System.out.println("(6)");
    }
    String moi = null;
    public CurrentAlarmView(String str){super(str);
    System.out.println("(7)");
    }
    public void initView(String str){
    System.out.println("(3)");
    moi = str;
    System.out.println("(4)");
    System.out.println("initView moi = "+moi);
    }
     public void print(){
    System.out.println("moi = "+moi);
    }
    public static void main(String[] args){
    CurrentAlarmView view = new CurrentAlarmView("test");
    view.print();
    }
    }
      

  7.   

    在public void print(){
    System.out.println("moi = "+moi);
    }
    输出的moi是CurrentAlarmView类中String moi = null;因为你使用super(str);将str值赋值给了AlarmView类的moi.所以CurrentAlarmView类在继承父类AlarmView类的方法:
    public void initView(String str){
    moi = str;
    System.out.println("initView moi = "+moi);
    }
    中输出的是父类AlarmView类moi的值。而CurrentAlarmView类的方法:
    public void print(){
    System.out.println("moi = "+moi);
    }
    中输出的是你赋值的String moi = null本类的值。
      

  8.   

    CurrentAlarmView的构造方法的执行顺序的问题啊:先
      super(); // 其中把view中的moi变成了"test"

      String moi = null; // 又将其改回成为null不明白String moi是在什么时候初始化的??..??
      

  9.   

    谢谢大家。yanxiazhiqiu(艳夏之秋) 的程序加了两句才搞明白顺序。呵呵。abstract class BaseView
    {
    {
    System.out.println("(grandfather)");
    }
    public void initView(String moi){};
    public BaseView(){System.out.println("(1)");}
    }class AlarmView extends BaseView{
    {
    System.out.println("(father)");
    }
    public AlarmView(String moi){
    super();
    System.out.println("(2)");
    initView(moi);
    System.out.println("(5)");
    }
    }public class CurrentAlarmView extends AlarmView
    {
    {
    System.out.println("(6)");
    }
    String moi = null;
    public CurrentAlarmView(String str){super(str);
    System.out.println("(7)");
    }
    public void initView(String str){
    System.out.println("(3)");
    moi = str;
    System.out.println("(4)");
    System.out.println("initView moi = "+moi);
    }
    public void print(){
    System.out.println("moi = "+moi);
    }
    public static void main(String[] args){
    CurrentAlarmView view = new CurrentAlarmView("test");
    view.print();
    }
    }
    谢谢。
      

  10.   

    听了zsjin0208(从零开始) 的解答,还有一个问题:AlarmView也有moi变量么?应该没有吧?应该是执行子类的时候moi又被重新赋值为null的吧。大家看呢?
      

  11.   

    这题目有意思,主要考了4个概念:1.对JAVA类初始化顺序的理解 2.super()的用法的理解 3.方法的动态绑定 4.类变量的设置加了this和不加this的区别哈哈,我决定下次面试人家的时候就用这道题来考人家~
      

  12.   

    public class CurrentAlarmView extends AlarmView
    {
    {
    System.out.println("(6)");
    }
    String moi = null;
    public CurrentAlarmView(String str){super(str);
    System.out.println("(7)");
    }
    输出为:
    (1)
    (2)
    (3)
    (4)
    initView moi = test
    (5)
    (6)
    (7)
    moi = null
    请问yanxiazhiqiu(艳夏之秋) 为什么{System.out.println("(6)");}String moi = null;这两句在System.out.println("(7)");之前执行.
    一个小问题:为什么{System.out.println("(6)");}不加{}会报错?
      

  13.   

    public class CurrentAlarmView extends AlarmView
    {
    {
    System.out.println("(6)");
    }
    String moi = null;
    public CurrentAlarmView(String str){super(str);
    System.out.println("(7)");
    }
    输出为:
    (1)
    (2)
    (3)
    (4)
    initView moi = test
    (5)
    (6)
    (7)
    moi = null
    请问yanxiazhiqiu(艳夏之秋) 为什么{System.out.println("(6)");}String moi = null;这两句在System.out.println("(7)");之前执行.
    一个小问题:为什么{System.out.println("(6)");}不加{}会报错?JAVA程序的初始化顺序中:子类构造器最后初始化。我认为不加{},就不是一个语句块。