我在世袭班上有方法上的麻烦

时间:2019-10-24 09:22:08

标签: java object

我有一个2类,其中一个扩展了超类。 当我从主对象调用子类时,出现错误,因为“我调用的方法不是该类的一部分”,但是随着程序的进行,它应该可以工作 我只需要在课堂上使用铸件,但是我的老师告诉我,铸件不应该在这样的作品中使用,因此,我想了解我在哪里错了,哪里可以做得更好

(我提供了3个类,子类,超类和主要类的代码)

主要

import java.util.Scanner;
public class Main {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        System.out.print("Type in the number");
        int number = in.nextInt();

        System.out.print("Type in the name");
        String name = in.next();

        Test testObj = new Test(number);


        testObj = new TestSub(number);

        testObj.setNameSub(name);

        in.close();
    }
}

超一流

public class Test {

    protected int number;
    protected String name;

    public Test(int number){
        this.number=number;
    }

    public void setName(String name){
        this.name=name;
    }

    public String toString(){
        return "the name is "+name+"the number is "+number;
    }
}

子类

public class TestSub extends Test {

    public TestSub(int number){
        super(number);
    }

    public void setNameSub(String name){
        setName(name);
    }

    public String toStringSub(){
        return toString();
    }
}

我得到的错误是:

  

未为类型Test定义setNameSub(String)方法

在最主要的地方有此指令:testObj.setNameSub(name);

1 个答案:

答案 0 :(得分:0)

这里的错误是(如注释中所示)您将testObj初始化为Test而不是TestSub,这导致当编译器无法在Test的方法之间找到setNameSub()时导致错误。

因此,简单的解决方案显然是将testObj初始化为TestSub。

利用方法继承的正确解决方案是保持初始化不变,而是调用方法testObj.setName(name),并从TestSub类中删除setNameSub()和toString()方法,因为它们与Test类中的方法没有任何区别。