黑马程序员技术交流社区

标题: 初始化的问题 [打印本页]

作者: 石欣欣    时间: 2011-9-16 15:00
标题: 初始化的问题
class A
{
        int x=1;
        int y=2;
}


class B extends A
{
        int x=5;
        B()
        {
                System.out.println(x+y);
                System.out.println(super.x+y);
        }
}
class  C
{
        public static void main(String[] args)
        {
                new B();
        }
}
结果是:7和3;为什么第一个x是5而不是1?
作者: 程辰    时间: 2011-9-16 15:21
在B中已经重载了x变量,所以以前在A中的的int x = 1已经在B中被覆盖掉变成5了。要想使用A中的x变量,就必须使用super关键字。答案自然就是7和3。
作者: 匿名    时间: 2011-9-16 17:53
B继承了A,B就拥有A的所有成员,如果你不定义A中的成员,就不会改变其值,如果你一旦改变了A中成员的值,比如你在B中定义了x=5,那么,在B中使用x就按照5来取值,要使用父类的成员,只能用super这个关键字了。所以在B中x=5,super.x=1
作者: 匿名    时间: 2011-9-17 15:04
看到了楼主提出的这个问题,我昨天也弄明白了一个类似的问题,现在想起来,特意把我的心得给大家分享一下。以求共同进步吧。
class B {
static int value = 100; static { System.out.println("Class B is initialized."); //输出
}
}
class A extends B {
static { System.out.println("Class A is initialized."); //不会输出
}
}
public class InitTest { public static void main(String[] args) {
System.out.println(A.value); //输出100
}
}
在上述代码中,类InitTest通过A.value引用了类B中声明的静态域value。由于value是在类B中声明的,只有类B会被初始化,而类A则不会被初始化。


1:继承类时会调用父类的Static的成员变量和Static代码块、顺序是按照2个Static代码的先后顺序执行
2:继承情况下,首先是从顶层父类的静态变量和代码块开始执行,依次向下。
3:同一个类中,执行的顺序是依照静态变量和静态代码在类中的编码顺序执行,:变量和代码块无任何优先级之分。
全部继承树中的类静态变量和代码块都初始化完毕后,开始从顶层父类执行非静态的类变量和类代码块初始化,执行顺序同静态,
然后紧接着是执行构造函数,完毕后才向下,执行子类的类变量、代码块和构造函数。 非静态内部类中不能定义类静态代码块和非final的类静态变量;
作者: 匿名    时间: 2011-9-20 22:57
继承应该注意的事:
               a) 父类有的,子类也有
               b) 父类没有的,子类可以增加
               c) 父类有的,子类可以改变
               d) 构造方法不能被继承
              e) 方法和属性可以被继承
               f ) 子类的构造方法隐式地调用父类的不带参数的构造方法
             g) 当父类没有不带参数的构造方法时,子类需要使用super来显
式地调用父类的构造方法,super指的是对父类的引用
           h) super关键字必须是构造方法中的第一行语句。
由上述几点可以知道,父类的成员变量x被子类的成员变量x覆盖了,所以才得出了  7  这个结果,
第二个结果是因为使用super关键字,调用的是父类的成员变量,所以才得出了 3  这个结果。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2