子类的对象不能调用它自己的方法

问题描述:

如果cChildClass对象,那么为什么它不能调用ChildClass的方法? 喜欢:子类的对象不能调用它自己的方法

ParentClass c=new ChildClass(); //Here ChildClass extends ParentClass 

特别是:

Object s=new StringBuffer(); 

这里sStringBuffer对象,但s.append(null)是编译时间错误。为什么这样?

+1

因为你**的参考变量的类型**是'ParentClass',父类对其子女的功能毫无头绪。 – 2014-09-06 03:59:27

c被宣布为ParentClass。因此,所有编译器都知道它是一个ParentClass它的一些的子类。假设其他一些语句重新分配c地方:

c = new SomeOtherChildClass(); 

这是合法的,因为SomeOtherChildClass也是ParentClass一个子类,你告诉编译器c可以是任何ParentClass。现在,如果编译器看到

c.methodOfChildClass(); 

怎么会知道cChildClass,而不是一个SomeOtherChildClass不具有该方法?

P.S.如果你确定c真是ChildClass,在某些时候,你可以得到它的向下转换调用ChildClass方法:

((ChildClass)c).methodOfChildClass(); 

演员会导致编译器看到cChildClass;在运行时,程序会检查以确保c确实是ChildClass否则程序将抛出ClassCastException

,因为编译器不知道参考s将要提到的StringBuffer在运行时Java一个实例是statically typed language

+0

什么是静态类型语言? – 2014-09-06 03:59:22

+0

http://en.wikipedia.org/wiki/Type_system#Static_and_dynamic_type_checking_in_practice – 2014-09-06 03:59:56

你需要转换使用的实例

Object s = new StringBuffer(); 
StringBuffer s2 = (StringBuffer) s; 
s2.append(null); 

的方法尽管是StringBuffer的实例对象,它仍然是Object类型和对象没有方法追加

这是编译器的工作以确保您不会调用任何与您所调用的变量不匹配的方法。为了帮助编译器,我们给所有变量一个“类型”。类型可能是像“int”这样的基本类型,或者是一个类,一个枚举或一个接口。如果它是一个类,一个接口或一个枚举;那么该类,接口或枚举中列出的方法是编译器允许您在该变量上使用的方法。

变量的“类型”不一定与变量引用的对象的“类”相同。在你的例子中,类型是Object,但是类是StringBuffer。但类型,而不是类,编译器用来检查你的方法调用是否正确;因为不能期望编译器知道你可能使用变量引用的每个对象的类。

如果语言不这样工作,那么根本就没有类型的变量。这就是Javascript的工作方式 - 所有内容都被声明为var,并且没有真正的类型系统。当我们说Java是“静态类型”时,我们的意思是我们必须给变量类型,这样做有助于编译器保护我们免于滥用我们的变量。

你有你的对象转换为StringBuffer的类型,或者您必须声明这样的StringBuffer S =新的StringBuffer对象s(),那么你可以调用这个类的所有方法