A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 石欣欣 黑马帝   /  2011-9-16 15:00  /  1550 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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?

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

4 个回复

倒序浏览
在B中已经重载了x变量,所以以前在A中的的int x = 1已经在B中被覆盖掉变成5了。要想使用A中的x变量,就必须使用super关键字。答案自然就是7和3。

评分

参与人数 1技术分 +2 收起 理由
wangfayin + 2

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-16 17:53:45
藤椅
B继承了A,B就拥有A的所有成员,如果你不定义A中的成员,就不会改变其值,如果你一旦改变了A中成员的值,比如你在B中定义了x=5,那么,在B中使用x就按照5来取值,要使用父类的成员,只能用super这个关键字了。所以在B中x=5,super.x=1

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-17 15:04:35
板凳
看到了楼主提出的这个问题,我昨天也弄明白了一个类似的问题,现在想起来,特意把我的心得给大家分享一下。以求共同进步吧。
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的类静态变量;

评分

参与人数 1技术分 +2 收起 理由
admin + 2

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-20 22:57:47
报纸
继承应该注意的事:
               a) 父类有的,子类也有
               b) 父类没有的,子类可以增加
               c) 父类有的,子类可以改变
               d) 构造方法不能被继承
              e) 方法和属性可以被继承
               f ) 子类的构造方法隐式地调用父类的不带参数的构造方法
             g) 当父类没有不带参数的构造方法时,子类需要使用super来显
式地调用父类的构造方法,super指的是对父类的引用
           h) super关键字必须是构造方法中的第一行语句。
由上述几点可以知道,父类的成员变量x被子类的成员变量x覆盖了,所以才得出了  7  这个结果,
第二个结果是因为使用super关键字,调用的是父类的成员变量,所以才得出了 3  这个结果。

评分

参与人数 1技术分 +2 收起 理由
admin + 2

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马