java的一些关于类的继承问题,如下求高手指教

求详细解答啊
class A{
public int getNumber(int a){
return a+1;}
}
class B extends A{
public int getNumber (int a){
return a+100;
}
public static void main(String args[]) {
A a=new A(); System.out.println(a.getNumber(10)); //代码1 结果是11
a=new B(); System.out.println(a.getNumber(10)); } //代码2 为什么结果还是11 ??
}

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 E {
public static void main(String args[]){
B b=new B();
System.out.println(b.f(10.0,8.0)); //结果98.0
System.out.println(b.g(3)); //12
A a=new B();
System.out.println(a.f(10.0,8.0)); //为什么结果还是98.0
System.out.println(a.g(3)); //结果怎么是9 怎么调用的
}
}

经验证分别 输出11和110 并不是你说的都是11
都是98.0是因为,两次的计算其实都是调用B的f方法,尽管向上引用为A,java在真正执行的时候会动态的获取真正的对象,所以两次都是98.0
只属于为什么是9,因为静态方法是通过类名调用的,也就是说方法属于类而不是对象,所以
A a=new B() 的时候 a.g(3) 其实是调用了A.g(3),
如果你使用B.g(3) 那么就会输出12
温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-12-17
你的结果有一个错误,
a=new B(); System.out.println(a.getNumber(10)); } //代码2 为什么结果还是11 ??

这里结果应该是110,调用的是B的getNumber的方法

类E中

System.out.println(a.g(3)); //结果怎么是9 怎么调用的

方法g是static的,静态方法属于类不属于对象,所以a.g(3)=A.g(3),而b.g(3)=B.g(3),所以两次调用的结果不同
第2个回答  2014-12-17
你的疑问应该在於这里
System.out.println(a.f(10.0,8.0)); //为什么结果还是98.0
你可以看看他的指向
先指向B.class f 然後再指向A.class f
所以是 10.0 +8.0 =18.0
然後回到 B.class
m=18.0 看看回传 m+x*y
也就是 18+10.0*8.0
这样当然是 98.0 =="
再来看这个
System.out.println(a.g(3)); //结果怎么是9 怎么调用的
先指向B.class g 然後在指向 A.class g
所以是 3*3 =9
然後回到B.class
因为这里的B.class g 方法被复写掉所以就跳过回传直接使用A.class g本回答被提问者采纳
第3个回答  2014-12-17
扯淡 第一个的第二个明明就是110 动态绑定 自己百度下 父类引用指向子类对象,可见性是按照声明的时候来的 调用的时候如果有重写就是掉子类的方法
第4个回答  2021-05-14

本视频主要从Java语言基础、JavaSE核心、WEB全栈及数据库、Servlet/Jsp核心、 Java框架五个阶段进行讲解。在本教程中,会让大家从零基础快速掌握Java知识。想要配套学习资料的小伙伴可以联系我哦!