如何在另一个类中调用子类方法而不是其父类?

4
我想在Java中的另一个类中调用子类函数。我该怎么做?
以下是我的超类和子类示例:
public abstract class a
{
  method 0;
}

class b extends a
{
   method 1;
}

还有一个称为 c 的类。我想在类 c 中进行以下操作。C是另一个文件中的类,但在同一个包中。

class c
{
   c val;
   public c
   {
      a var1 =( (b)val.method0()).method1;

   }
}

但是在运行程序时,我遇到了一个异常,提示无法将类型a强制转换为类型b。有人有什么建议可以解决这个问题吗?

以下是我收到的实际异常错误。(我上面写的是一个演示)

Exception in thread "main" java.lang.ClassCastException: classfileparser.ConstantClass无法转换为 classfileparser.ConstantUtf8,在classfileparser.ClassFile.(ClassFile.java:50) 中, 在classfileparser.ClassFileParser.main(ClassFileParser.java:18)中 C:\Users\Dave\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53: Java返回:1 BUILD FAILED(总时间:0秒)


我认为您缺少一些“extends”语句... - lucasvw
你试图将某些c转换为某些b,但这是不可能的,因为这些类之间没有任何继承关系(特别是因为b不是c的超类)。 - Turing85
请遵循Java命名规范,并发布可编译的代码。 - Lew Bloch
4个回答

0

嗯,从你的代码看来,除非你有限制性修饰符(除非你有),否则你所要做的就是实例化子类并在c类中调用它的方法。

这些是静态方法吗?


不,它们不是静态方法。您能否解释一下如何在类c中实例化子类? - Doctor.008

0

一个属于类 a 的对象不一定是子类 b 的实例。例如,如果您还有子类 d

  a
 / \
b   d

d 类型的对象不是 b 的实例,因此无法访问在 b 中定义的类方法。抛出 ClassCastException 是因为您试图将对象转换为其不是实例的类型。有关详细信息,请参见 https://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html

根据异常消息,method0 返回一个 ConstantClass,但您正在尝试将其强制转换为 ConstantUtf8。您可以在 ConstantClass(或其超类)中实现 method1 并进行转换,或者您必须更改 method0 以返回 ConstantUtf8 的实例而不是 ConstantClass


0

0

我认为你在这里做的是声明另一个顶级类并使用不同的名称,编译器会调用classname.java,所以当你调用类b时找不到它,因为编译器会查找a.java如果这是你的文件名。如果类b在新的b.java文件中,你可以按照你想要的方式进行操作或者你可以将类b声明为内部类,并像这样从类c中调用:

在类a中:

public abstract class a
{
method 0;

class b{
method 1;
}
}

在类c中:

class c extends a{// because a is abstract c extends a
a obj1 = new a();//obj1 of class a is declared
a.b obj2 = obj1.new b();//obj2 declared for class b through obj1

public c{
obj2.method(1);//call method in inner class b
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接