qq7779062 2011-12-30 10:55
浏览 266
已采纳

关于Java继承和多态的问题!!!

最近看到两个Java基础题,自己搞了半天糊里糊涂的,看来自己Java基础还有很多理解不到位,希望高手给俺讲讲!
[code="java"]
class A {}
class B extends A {
void print() {
System.out.println(super.getClass().getName());
}
public static void main(String[] args) {
B b = new B();
b.print();
}
}
[/code]
输出结果是什么?为什么?如果你懂了再讲讲下面这个问题:
[code="java"]
class A {
int i = 1;
void print() {
System.out.println(i);
}
}
class B extends A {
int i = 2;
public static void main(String[] args) {
B b = new B();
b.print();
}
}
[/code]
俺不是想问输出结果,想问为什么会输出这样的结果?

  • 写回答

10条回答 默认 最新

  • 仲涵 2011-12-30 14:52
    关注

    第一个问题:
    getClass在Object中的定义为 public final native Class<?> getClass();既然定义为final说明这个方法可以继承但不能重写,既然没有重写,那么调用this.getClass()和调用

    super.getClass()都是一样调用Object中的本地方法getClass()。所以我们只需知道getClass()是怎么实现的就可以了,但这是一个本地方法,我们没法看见源代码,那就看API:
    Returns the runtime class of this {@code Object}.
    这是API里的一句话,the runtime class当然是B了。

    第二个问题:
    这个问题无非就是考查能否继承实例变量?这里我先把Class A的代码变成这样:
    class A {

    int jjj = 1;

    void print() {

    System.out.println(jjj);

    }

    }
    我就是把变量名给变了一下而已,这里你肯定能理解了。剩下的问题就是子类定义与父类同名的成员变量时是个什么情况?子类定义与父类同名的成员变量,并没有覆盖父类的成

    员变量,而是两个成员变量共存。再把Class B代码修改一下:
    class B extends A {
    int i = 2;

    void print() {
        System.out.println(i);
        System.out.println(super.i);
    }
    
    public static void main(String[] args) {
        B b = new B();
        b.print();
    }
    

    }
    明白了吧。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(9条)

报告相同问题?

悬赏问题

  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?