10. 定义A,B如下:
class A {
int a=1;
double d=2.0;
void show( ) {
System.out.println("Class A:a="+a +" d="+d);
}
}
class B extends A {
float a=3.0f;
String d="Java program.";
void show( ) {
super.show( );
System.out.println("Class B:a="+a +" d="+d);
}
}
若在应用程序的main方法中定义类B的对象b:
A b=new B(); //这句话是什么意思????
b.show();
则输出的结果如何?
class A {
int a=1;
double d=2.0;
void show( ) {
System.out.println("Class A:a="+a +" d="+d);
}
}
class B extends A {
float a=3.0f;
String d="Java program.";
void show( ) {
super.show( );
System.out.println("Class B:a="+a +" d="+d);
}
}
若在应用程序的main方法中定义类B的对象b:
A b=new B(); //这句话是什么意思????
b.show();
则输出的结果如何?
Class B:a=3.0 d=Java program.
调用b构造函数
new B(); 内存空间生成一个B类实例
A b 内存空间生成一个可存放A类的地址
A b=new B(); 将b指向 new b()生成的对象
b.show(); 执行b的函数
super.show( ); 执行A的函数
System.out.println("Class B:a="+a +" d="+d); 结果
Class A:a=1 d=2.0
Class B:a=3.0 d=Java program.
A b=new B();
这是子类的向上转型,A类 的引用 b,调用B类的构造函数生成B类对象。
子类向上转型后,其通过继承并覆写后的函数仍能被唤起,并能被准确识别及执行,即向上转型后的对象,其内有效的函数别调用时,能准确执行其自身未转型时的功能。
这个机制主要由java函数(非final函数)的“后期邦定”性质保障。
再问一个问题,是不是只有被覆盖的方法才有这样的性质,如果B中另外定义了一个新的方法show2(),就不可以被b调用的,这是为什么,希望一并解答:)
若在应用程序的main方法中定义类B的对象b:
A b=new B(); //这句话是什么意思????
b.show();
则输出的结果如何?知道了吧。。分数给天下有雪拉.