首页 > 试题广场 >

阅读以下程序并写出运行结果:()

[填空题]
阅读以下程序并写出运行结果:1
class A {
    double f(double x, double y) {
        return x + y;
    }
    static int g(int n) {
        return n * n;
    }
}
class B extends A {
    double f(double x, double y) {
        double m = super.f(x, y);
        return m + x * y;
    }
    static int g(int n) {
        int m = A.g(n);
        return m + n;
    }
}
public class PrintMethod {
    public static void main(String[] args) {
        A a = new B( );
        System.out.println(a.f(10.0, 8.0));
        System.out.println(a.g(3));
    }
}
A类的对象a被类加载器加载时,静态方法g已经生成了。所以调用a时是直接调用A中g方法而不是B中的g方法。
发表于 2017-05-11 10:29:48 回复(0)
静态方法和静态变量属于类
父类中的静态方法和静态属性能被继承但不能被重写
就本题而言 向上转型A a = new B( );
若调用的是静态方法,则a调用的是父类的(前提父类和子类中有方法名一样的静态方法)
发表于 2017-06-15 19:46:39 回复(0)
向上转型,定义了一个A类型的引用,指向新建的B类型的对象。子类可以继承父类的静态方法,但是子类不能重写父类的静态方法。在这种情况下,子类隐藏了父类的静态方法。因为不能重写,所以a是A类型的引用时,调用的是父类中的g方法。加 @Override会报错
发表于 2017-05-26 19:25:52 回复(0)
A a = new B() 
如果方法是静态的。那么a就是一个A的对象,所以用A累的方法,返回:9
发表于 2017-05-08 15:03:38 回复(1)
1、父类方法如果是静态方法,子类不能覆盖为非静态方法;
2、父类方法如果是非静态方法,子类不能覆盖为静态方法;
3、父类静态方法可以被覆盖,允许在子类中定义同名的静态方法,但是没有多态。
通过子类创建对象来用对象名调用子类中的静态变量和静态方法,除非是父类没有的静态变量和静态方法,会显示其子类的静态变量和静态方法。否则,最后显示一定是从父类哪里引用来的静态变量和静态方法。
发表于 2017-06-26 10:29:07 回复(0)

你的答案 (错误)

1 98.0 9
参考答案 
(1) 98.0 9
发表于 2017-07-14 19:25:00 回复(0)
我还能说些什么。。。。
发表于 2017-07-06 22:36:44 回复(0)
怎样算是对的呢

发表于 2017-07-03 17:52:55 回复(0)
发表于 2017-07-03 17:35:21 回复(0)
a.g(3)调用的是父类的方法,static静态方法不能被重写
发表于 2017-07-03 14:20:54 回复(0)
一兴奋直接写成了98,看来还是要小心!
发表于 2017-06-26 05:38:39 回复(0)
请问98是怎么得来的?
编辑于 2017-06-12 18:20:38 回复(1)
还是不清楚,有大神解释下么
发表于 2017-05-18 14:11:27 回复(0)
上溯招型时不会把B类转换成A类吗,这时候调用的方法为什么还是B的f方法
发表于 2017-05-17 08:47:27 回复(2)
36 9
发表于 2017-05-11 00:17:29 回复(0)
运行结果就是98.0 9?哪里错了吗?
发表于 2017-05-10 17:14:59 回复(1)
因为a在加载类的时候被指定为`A`,而静态方法在类加载的时候就已经被加载了,所以a执行的`g`为`A`的静态方法。而直到实例构造时,才知道a实际上被初始化为了`B`。同时实例方法`f`也是在实例构造时才被装载的,因此执行的是`B`的`f`方法。
编辑于 2017-05-31 09:52:11 回复(2)
有和我一样是因为写的是“98 9”错的吗。。哎。基本功
发表于 2017-05-08 16:47:51 回复(2)