Java A b = new B(); B继承A .

问题描述:

Java A b = new B(); B继承A .
定义类A 和类B 如下:
class A {
int a=1;
double d=2.0;
void show(){
System.out.println("Class A: a="+a +"\td="+d);
}
}
class B extends A{
float a=3.0f;
String d="Java program.";
void show(){
super.show( );
System.out.println("Class B: a="+a +"\td="+d);
}
}
(1) 若在应用程序的main 方法中有以下语句:
A a=new A();
a.show();
则输出的结果如何?
(2) 若在应用程序的main 方法中定义类B 的对象b :
A b=new B();
b.show();
则输出的结果如何?

(我知道答案,只是求详解,第二小问的详细解释,初学不懂,求教!)
1个回答 分类:综合 2014-12-11

问题解答:

我来补答
A b=new B():
因为B类是A类的子类,所以上面语句发生了向上转型. new B()会在堆内存中产生一个B类的实例,
A b会在栈内存中产生一个A类的引用.
A b = new B()会让b指向堆内存中的new B()实例,但是该实例时B类的实例,这是就会发生向上转型.
如果子类中存在和父类相同名称和参数的方法,这种情况叫做多态性,子类覆写父类方法,
发生向上转型后,调用这种被子类覆写过的方法,那么会直接调用类B的方法show().
再问: 什么是向上转型? 我第二问原本是觉得结果应该是这样的: Class A: a=3 d=Java program. Class B: a=3 d=Java program. 我就是不懂,为什么A b = new B(); 会是A的成员变量,而不是B的成员变量
再答: 向上转型是java多态的知识,所谓向上转型,就是让父类引用变量指向子类实例. 正常情况下是:栈内存中的子类引用变量指向堆内存中的子类实例, 本质来说:java对象类型有编译时类型和运行时类型,编译时类型是定义时指定的类型,运行时类型是申请空间之后实际赋予的类型,当编译时类型与运行时类型不同时就叫做多态. 比如此题.A b=new B()它的编译时类型是A类,运行时类型是B类,所以这就发生了多态, 其中将子类实例赋给父类引用叫向上转型. 将子类实例赋给父类引用,再将该父类引用赋给另一个子类引用,这叫做向下转型.
再问: 向上转型,A a = new B(); B继承A a对象会遗失和父类不同的方法,也会覆盖与父类相同的方法。 如果A类和B类都有静态方法,会在类加载的时候被首先执行,然后再执行他们的构造方法。 publicclass A { publicint m = 1; publicvoid view(){ System.out.println(this.m); System.out.println(this.getClass()); } }
再答: 静态成员总是会在类实例化之前被初始化,这是因为静态成员属于类,而不属于某个实例. 如果你还想访问a对象中与父类不同得方法,那么就需要在向上转型之后再向下转型.
再问: (接上面的) B类也有:publicint m = 2; view()方法同样覆盖父类的,方法块是这样的:System.out.println(this.m); System.out.println(super.m); System.out.println(this.getClass()); 如果执行: B b = new B(); b.view(); 结果为:2 1 class B(中间换行) 如果把B中的方法注释掉,结果为:1 class B(中间换行) 发现,是不是执行父类的方法,都会去引用父类的成员变量? 不懂里面的变量是怎样的
 
 
展开全文阅读
剩余:2000