当前位置: 技术问答>java相关
多重继承(多于两重)中怎样调用最上层的隐藏的成员?
来源: 互联网 发布时间:2015-04-25
本文导语: 问题描述: 三个类的继承关系如下: a |--b |--c 三个类都有方法print(); 在类c中可以用this.print()来调用自己的print()方法; 可以用super.print()来调用b的方法 问:在类c中怎么样调用a的print()方法 ...
问题描述:
三个类的继承关系如下:
a
|--b
|--c
三个类都有方法print();
在类c中可以用this.print()来调用自己的print()方法;
可以用super.print()来调用b的方法
问:在类c中怎么样调用a的print()方法
三个类的继承关系如下:
a
|--b
|--c
三个类都有方法print();
在类c中可以用this.print()来调用自己的print()方法;
可以用super.print()来调用b的方法
问:在类c中怎么样调用a的print()方法
|
辛苦辛苦,这个知识点给忘记了,呵呵,好不容易找了回来,你自己看看吧
public class ShadowTest {
public static void main(String s[]){
new STChild().demo();
}
}
class STGrandParent {
double wealth = 50000.00;
public double getWealth() {
System.out.println("GrandParent-" + wealth);
return wealth;
}
}
class STParent extends STGrandParent {
double wealth = 100000.00;
public double getWealth() {
System.out.println("Parent-" + wealth);
return wealth;
}
}
class STChild extends STParent {
double wealth = 200000.00;
public double getWealth() {
System.out.println("Child-" + wealth);
return wealth;
}
public void demo() {
getWealth(); // Calls Child method
super.getWealth(); // Calls Parent method
//super.super.getWealth(); // Compiler error, GrandParent method cannot be accessed
((STParent)this).getWealth(); // Calls Child method, due to dynamic method lookup
((STGrandParent)this).getWealth(); // Calls Child method, due to dynamic method
// lookup
System.out.println(wealth); // Prints Child wealth
System.out.println(super.wealth); // Prints Parent wealth
System.out.println(((STParent)(this)).wealth); // Prints Parent wealth
System.out.println(((STGrandParent)(this)).wealth); // Prints GrandParent wealth
}
}
public class ShadowTest {
public static void main(String s[]){
new STChild().demo();
}
}
class STGrandParent {
double wealth = 50000.00;
public double getWealth() {
System.out.println("GrandParent-" + wealth);
return wealth;
}
}
class STParent extends STGrandParent {
double wealth = 100000.00;
public double getWealth() {
System.out.println("Parent-" + wealth);
return wealth;
}
}
class STChild extends STParent {
double wealth = 200000.00;
public double getWealth() {
System.out.println("Child-" + wealth);
return wealth;
}
public void demo() {
getWealth(); // Calls Child method
super.getWealth(); // Calls Parent method
//super.super.getWealth(); // Compiler error, GrandParent method cannot be accessed
((STParent)this).getWealth(); // Calls Child method, due to dynamic method lookup
((STGrandParent)this).getWealth(); // Calls Child method, due to dynamic method
// lookup
System.out.println(wealth); // Prints Child wealth
System.out.println(super.wealth); // Prints Parent wealth
System.out.println(((STParent)(this)).wealth); // Prints Parent wealth
System.out.println(((STGrandParent)(this)).wealth); // Prints GrandParent wealth
}
}
|
修正一下楼上的,这样可以实现上上级方法回嗍,但是记住,面向对象的类继承最好的是到3层,如果多了将大大增加系统的开销。你可以在每一层实现对上层的重载。
public class ShadowTest {
public static void main(String args[]){
new STChild().demo();
}
}
class STGrandParent {
double wealth = 50000.00;
public double getWealth() {
System.out.println("GrandParent-" + wealth);
return wealth;
}
}
class STParent extends STGrandParent {
double wealth = 100000.00;
public double getWealth() {
System.out.println("Parent-" + wealth);
return wealth;
}
public double getGrandPWealth() {
return super.getWealth();
}
}
class STChild extends STParent {
double wealth = 200000.00;
public double getWealth() {
System.out.println("Child-" + wealth);
return wealth;
}
public double getGrandPWealth() {
return super.getGrandPWealth();
}
public void demo() {
getWealth(); // Calls Child method
super.getWealth(); // Calls Parent method
//super.super.getWealth(); // Compiler error, GrandParent method cannot be accessed
((STParent)this).getWealth(); // Calls Child method, due to dynamic method lookup
((STGrandParent)this).getWealth(); // Calls Child method, due to dynamic method
this.getGrandPWealth(); // Calls GrandParent method;
// lookup
System.out.println(wealth); // Prints Child wealth
System.out.println(super.wealth); // Prints Parent wealth
System.out.println(((STParent)(this)).wealth); // Prints Parent wealth
System.out.println(((STGrandParent)(this)).wealth); // Prints GrandParent wealth
}
}
public class ShadowTest {
public static void main(String args[]){
new STChild().demo();
}
}
class STGrandParent {
double wealth = 50000.00;
public double getWealth() {
System.out.println("GrandParent-" + wealth);
return wealth;
}
}
class STParent extends STGrandParent {
double wealth = 100000.00;
public double getWealth() {
System.out.println("Parent-" + wealth);
return wealth;
}
public double getGrandPWealth() {
return super.getWealth();
}
}
class STChild extends STParent {
double wealth = 200000.00;
public double getWealth() {
System.out.println("Child-" + wealth);
return wealth;
}
public double getGrandPWealth() {
return super.getGrandPWealth();
}
public void demo() {
getWealth(); // Calls Child method
super.getWealth(); // Calls Parent method
//super.super.getWealth(); // Compiler error, GrandParent method cannot be accessed
((STParent)this).getWealth(); // Calls Child method, due to dynamic method lookup
((STGrandParent)this).getWealth(); // Calls Child method, due to dynamic method
this.getGrandPWealth(); // Calls GrandParent method;
// lookup
System.out.println(wealth); // Prints Child wealth
System.out.println(super.wealth); // Prints Parent wealth
System.out.println(((STParent)(this)).wealth); // Prints Parent wealth
System.out.println(((STGrandParent)(this)).wealth); // Prints GrandParent wealth
}
}
|
可不可以这样:
在b中通过super调用a的print(),然后再在c中调用b的这个method!
小弟初学java四天,如果不对请多多原谅,献丑了
在b中通过super调用a的print(),然后再在c中调用b的这个method!
小弟初学java四天,如果不对请多多原谅,献丑了
|
有这样的情况,说明你的类设计有问题。
|
是不是可以这样:
在C类中设定一个方法,其参数行为(A a)
方法体中使用if(a instanceof A)
{
a.print();
}
将一个类的实例传入,如果是A类型的则会执行A中的print();
你还可以去查一下“下溯造型”==“DownCasting”;
在C类中设定一个方法,其参数行为(A a)
方法体中使用if(a instanceof A)
{
a.print();
}
将一个类的实例传入,如果是A类型的则会执行A中的print();
你还可以去查一下“下溯造型”==“DownCasting”;
|
不可以调用a.print
|
其实类设计的好的话,不会碰到这种问题的
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。