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

时间:2017-05-23 16:47:23

标签: java subclass

我想在java中的另一个类中调用子类函数。我这样做吗?

这里的例子是我的超类和子类。

public abstract class a
{
  method 0;
}

class b extends a
{
   method 1;
}

还有另一个班级电话c。我想在课堂上做以下操作。 C是新文件中的另一个类。但是在同一个包中。

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

   }
}

但是我在运行程序时遇到异常,说明cant转换类型为b。有没有人建议摆脱这个?

这是我得到的实际异常错误。(我在上面的代码中写了一个演示)

  

线程“main”中的异常java.lang.ClassCastException:   classfileparser.ConstantClass无法强制转换为   classfileparser.ConstantUtf8 at   classfileparser.ClassFile。(ClassFile.java:50)at   classfileparser.ClassFileParser.main(ClassFileParser.java:18)   C:\ Users \用户戴夫\应用程序数据\本地\的NetBeans \缓存\ 8.2 \执行人-片段\ run.xml:53:   Java返回:1 BUILD FAILED(总时间:0秒)

4 个答案:

答案 0 :(得分:0)

嗯,你的代码看起来的方式,并且因为你的代码中没有限制性修饰符(除非你这样做),你所要做的就是实例化子类并在你的c类中调用它的方法。 / p>

这些是静态方法吗?

答案 1 :(得分:0)

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

  a
 / \
b   d

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

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

答案 2 :(得分:0)

你正在尝试将一个c类项目转换为b,这是不可能的。如果你想使用类a和b的方法,你应该创建c的b超类,以便类c的项可以访问这些方法和c类的领域。 这可能有助于您更好地理解课程:https://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html

答案 3 :(得分: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
}