Java A b = new B(); B继承A 。
定义类A和类B如下:classA{inta=1;doubled=2.0;voidshow(){System.out.println("ClassA:a="+a+"\td=...
定义类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();
则输出的结果如何?
(我知道答案,只是求详解,第二小问的详细解释,初学不懂,求教!) 展开
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();
则输出的结果如何?
(我知道答案,只是求详解,第二小问的详细解释,初学不懂,求教!) 展开
5个回答
展开全部
A b=new B():
因为B类是A类的子类,所以上面语句发生了向上转型. new B()会在堆内存中产生一个B类的实例,
A b会在栈内存中产生一个A类的引用.
A b = new B()会让b指向堆内存中的new B()实例,但是该实例时B类的实例,这是就会发生向上转型.
如果子类中存在和父类相同名称和参数的方法,这种情况叫做多态性,子类覆写父类方法,
发生向上转型后,调用这种被子类覆写过的方法,那么会直接调用类B的方法show().
因为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类,所以这就发生了多态,
其中将子类实例赋给父类引用叫向上转型.
将子类实例赋给父类引用,再将该父类引用赋给另一个子类引用,这叫做向下转型.
推荐于2018-03-14 · 知道合伙人软件行家
关注
展开全部
A b=new B(); 这就是java的多太性了, 父类定义一个变量, 实例却是子类.
也就是说, A b 这个变量实例对象其实是 B , 由于B 类方法中又调用 super.show 因为会先调用A类的 show
也就是说, A b 这个变量实例对象其实是 B , 由于B 类方法中又调用 super.show 因为会先调用A类的 show
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
粗浅回答,希望能为你解惑
public class TB {
public static void main(String args[]){
//(1)
A a=new A();
a.show(); //这里的show相当于从对象a中调用了A中show()的方法
//(2)
A b=new B(); //这里无非是上转型
b.show();
}
}
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( ); //先super,调用了父类中的输入方法 ,也就是输出了 Class A: a=1 d=2.0
System.out.println("Class B: a="+a +"\td="+d);
}
}
public class TB {
public static void main(String args[]){
//(1)
A a=new A();
a.show(); //这里的show相当于从对象a中调用了A中show()的方法
//(2)
A b=new B(); //这里无非是上转型
b.show();
}
}
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( ); //先super,调用了父类中的输入方法 ,也就是输出了 Class A: a=1 d=2.0
System.out.println("Class B: a="+a +"\td="+d);
}
}
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这是一个继承的问题,当子类对象中有调用的方法时,就不会去父类中找方法,这是优先级的问题
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询