请看下面程序:
package com.msn.spaces.bryantd001.packageone;public class SuperClass{
protected void show(){
System.out.println("This is a protected-access method in the super class in the package one.");
}
}package com.msn.spaces.bryantd001.packagetwo;
import com.msn.spaces.bryantd001.packageone.*;public class OverridingTest extends SuperClass{
//是否覆盖了超类的方法啊????
public void show(){
System.out.println("This is a real overriding method in the sub class in the package two.");
} public static void main(String[] args){
//SuperClass superObj=new SuperClass();
SuperClass superObj=new OverridingTest();
superObj.show();//这里报错!!!说show()方法在packageone的SuperClass中具有protected访问权限,因此无法调用。我昏~~~在子类中不是已经将这个方法覆盖了吗???
}
}
通过实验,这两个文件要是不写在不同的包中就没有问题。但是protected访问权限不是包和子类吗???所以子类的同名方法应该覆盖了超类的show()方法啊!!所以我觉得superObj.show();应该是调用的子类的方法啊!!为什么不行呢??
package com.msn.spaces.bryantd001.packageone;public class SuperClass{
protected void show(){
System.out.println("This is a protected-access method in the super class in the package one.");
}
}package com.msn.spaces.bryantd001.packagetwo;
import com.msn.spaces.bryantd001.packageone.*;public class OverridingTest extends SuperClass{
//是否覆盖了超类的方法啊????
public void show(){
System.out.println("This is a real overriding method in the sub class in the package two.");
} public static void main(String[] args){
//SuperClass superObj=new SuperClass();
SuperClass superObj=new OverridingTest();
superObj.show();//这里报错!!!说show()方法在packageone的SuperClass中具有protected访问权限,因此无法调用。我昏~~~在子类中不是已经将这个方法覆盖了吗???
}
}
通过实验,这两个文件要是不写在不同的包中就没有问题。但是protected访问权限不是包和子类吗???所以子类的同名方法应该覆盖了超类的show()方法啊!!所以我觉得superObj.show();应该是调用的子类的方法啊!!为什么不行呢??
不过, 要知道 protected方法 在包外的子类中,只能以子类或者子类的子类的引用访问
2、superObj.show();这个调用的不是子类的方法,这个是他自己(SuperClass )的方法,你创建的是SuperClass 的对象而不是OverridingTest的对象。所以这里你这样调用是不行的,因为他们不在一个包里。
而真正的问题是:这种多态机制为什么在包外就不起作用了呢?还有你说的第一点,如果子类覆盖了超类的方法,理论上说对于子类就是屏蔽了,当然这不意味着子类就无法访问被屏蔽的这个同名方法,比如如果被覆盖的超类方法是public,我们仍然可以在子类中利用super.的方法来访问。我并没有混淆这个概念,谢谢~~曾曾胡朋友,我想知道为什么“protected方法在包外的子类中,只能以子类或者子类的子类的引用访问”呢?难道我上面说得多态机制在有包的情况下就丧失了吗?
在这里,你的父类对象在父类所处的包外被创建,所以它“看不见”自己类中定义的那个protected方法,这个方法只能被它的子类的实例调用,父类自己的实例不能调用它。
在编码时确实是在调用自己的show()方法.
如楼上讲的,子类和父类不在一个包中是不能调用的.当然子类的确也覆盖了父类的show()方法
SuperClass superObj=new OverridingTest();
是后期绑定.(运行时动态绑定)
LZ看看<<Java编程思想>>的"运行期类型鉴定"和"多形态"的章节,
自然就明白了.
class SuperClass{
protected void show(){
System.out.println("This is a protected-access method in the super class.");
}
}public class OverridingTest extends SuperClass{
public void show(){
System.out.println("This is a real overriding method in the sub class.");
} public static void main(String[] args){
SuperClass superObj=new OverridingTest();
superObj.show();
}
}您能解释一下这样为什么就没问题吗?
疑惑了,swing中很多Model类的protected方法被我们自己写的类extands后都要覆盖的呀~~
package com.msn.spaces.bryantd001.packageone;public class SuperClass{
protected void show(){
System.out.println("This is a protected-access method in the super class in the package one.");
}
public void call(){
show();
}
}
package com.msn.spaces.bryantd001.packagetwo;
import com.msn.spaces.bryantd001.packageone.*;public class OverridingTest extends SuperClass{
public void show(){
System.out.println("This is a real overriding method in the sub class in the package two.");
}
public static void main(String[] args){
SuperClass superObj=new OverridingTest();
superObj.call();
}
}
结果调用子类方法,这是lz要得答案吧