当前位置: 首页 > 知识库问答 >
问题:

Java无法识别我在声明子类,也找不到成员方法[重复]

隆飞宇
2023-03-14

我做了一个小玩具程序来复制我在一个更大的项目中遇到的问题。在下面的代码中,类A是类B继承的父类。ClassB添加了一个名为PrintStuff的新方法。在我的main方法中,我通过提供其超类来声明类B。我之所以需要这样做,是因为与实际用例相关的原因:

package com.company;
import java.lang.String;

class A {
    String x;

    A(String value) {
        x = value;
    }
}

class B extends A {
    B(String value) {
        super(value);
    }

    void printStuff() {
        System.out.println(x);
    }
}

public class test {
    public static void main(String[] args) {
        A Binstance = new B("B instance");

        Binstance.printStuff();
    }
}

但是,由于以下原因,程序无法编译:

C:\Users\me\Desktop\Library\src\com\company\test.java:28:18
java: cannot find symbol
  symbol:   method printStuff()
  location: variable Binstance of type com.company.

为什么Java不能认识到实际上我正在实例化B类的对象?我如何让编译器识别一个方法实际上存在?


共有3个答案

陶原
2023-03-14

请注意:当B扩展A时,所有B都是A,但不是相反。

在你的例子中,Binstance是A,然后不能访问B的printStuff方法。

为了使您的代码正常工作,您需要强制B实例为B类型;这在java中称为强制转换。

所以这应该可以工作:(A(B实例). printStuff();

快乐的编码!

厍浩广
2023-03-14

bin实例被声明为具有类型A,并且printStuff()不在A中声明,而是在B中声明。在这种情况下,只有A的方法可见。方法在那里,但不可见。要使其可见,请将bin实例声明为B。

B Binstance = new B("B instance");
Binstance.printStuff();

扶开诚
2023-03-14

在编译期间,我们只知道B实例对象是A类型,这意味着它对printStuff()方法(您在B类中声明的)一无所知,这就是您得到该错误的原因。

现在,你有两个选择:

>

  • 你可以使用石膏

     public static void main(String[] args) {
         A Binstance = new B("B instance");
    
         ((B)Binstance).printStuff(); //casting Binstance to B
     }
    

    您可以将类设为抽象类,并创建一个抽象方法-printStuff()

     abstract class A {
    
         abstract void printStuff();
     }
    

  •  类似资料:
    • 问题内容: 我想用主方法创建一个简单的Java类,但是在编译代码时,出现以下错误消息: 错误:在类error.TestErrors中找不到主方法,请将主方法定义为:public static void main(String [] args) 这是源代码: 为什么我看到此错误,如您所见,我已经声明了main方法! 问题答案: 正如我在评论中所说,您似乎已经在自己的类中声明了一个类。为了证明这一点,

    • 如何正确拆分字符串,使Words[1]实际上是?谢谢你的帮助!

    • null 同样的道理是什么?-理想情况下,访问子类的方式本质上是相同的-那么为什么会有这种限制呢?

    • 问题指出: 创建一个具有长度和宽度双属性的矩形类。默认构造函数应该将这些属性设置为1。提供计算矩形周长和面积的方法,以及两个数据字段的访问器和赋值器。length和width的mutator方法应该验证传入的数字是否大于0.0且小于20.0——如果不符合这些标准,就不应该更改字段的值。 在同一文件中编写一个驱动程序类来测试您的矩形类。它应该提示用户输入矩形的长度和宽度,然后打印出矩形的面积和周长。

    • 问题内容: 我正在尝试实现UITableViewDataSource的必需方法,但出现一个奇怪的错误: “无效的’tableview(_:cellForRowAtIndexPath :)重新声明’” 但是我不确定是什么问题。这是相关的两行代码,即类的声明和符合协议/超类的代码: 以及触发错误的函数声明: 问题答案: 您在课堂上有两次此功能。搜索它并删除其中之一。

    • 我试图将我的应用程序从Java转换为静态编程语言。 我使用了Android Studio内置转换器并修复了它生成的大部分错误。 对于科特林来说,这一次让我很难受: 我得到了这个用Java编写的类,并进行了转换,显然没有任何错误,这有助于我在回收视图中管理项目点击: 在main活动中,转换后在函数中设置如下: IDE给我以下错误: 类型不匹配: 必需:ItemClickSupport。OnItemC