Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java扩展或覆盖开关案例_Java_Switch Statement_Overriding_Extend - Fatal编程技术网

java扩展或覆盖开关案例

java扩展或覆盖开关案例,java,switch-statement,overriding,extend,Java,Switch Statement,Overriding,Extend,我在上java课程,所以我试着对代码有点模糊,这样我可以学习,但不能作弊。作业是学习上周的课程并扩展功能。基本上,我编写了一个程序,在其中我将switch用于两种情况(不确定这是最佳选择,但我就是这么做的),我想添加更多的用户选项。因此,它目前允许输入“w”、“x”,但我想通过用类B扩展类A来添加“y”和“z”作为选项 在类a中有一个默认情况,基本上输出“只输入‘w’和‘x’”。问题是,即使使用扩展它的新B类,它也会阻止除‘w’和‘x’之外的任何内容 我知道我需要B类来覆盖它,这样它就允许w、x

我在上java课程,所以我试着对代码有点模糊,这样我可以学习,但不能作弊。作业是学习上周的课程并扩展功能。基本上,我编写了一个程序,在其中我将switch用于两种情况(不确定这是最佳选择,但我就是这么做的),我想添加更多的用户选项。因此,它目前允许输入“w”、“x”,但我想通过用类B扩展类A来添加“y”和“z”作为选项

在类a中有一个默认情况,基本上输出“只输入‘w’和‘x’”。问题是,即使使用扩展它的新B类,它也会阻止除‘w’和‘x’之外的任何内容

我知道我需要B类来覆盖它,这样它就允许w、x、y和z,然后当输入除这四个选项之外的任何选项时,默认触发。不管怎样,请帮帮我

下面是A类(我去掉了一些问题的代码,但所有变量、用户输入和扫描仪都可以工作。这就是我遇到的问题):

下面是B类,它扩展了A,我无法说服允许更多的案例。注意,在编译之后,我正在执行B,但它仍然只允许来自A的案例

 import java.util.Scanner;
 public class B extends A {
 public B() 
 {
  // define and implement variables
  // call scanner into existance to read inputs from the user
  // Ask for user input (abbreviated section) and store in variables

  oper = myManager.next(".").charAt(0);

  switch(oper)
    {
       // case w call to firstMethod method
       case 'w':
          DoSomething = firstMethod(num1,num2);
          System.out.println(" The result is "+FirstAns);
        break;
       // case w call to secondMethod method
       case 'x':
          DoSomethingElse = secondMethod(num1,num2);
          System.out.println(" The result is "+SecondAns);
       break;
       case 'y':
          DoSomethingMore = thirdMethod(num1,num2);
          System.out.println(" The result is "+ThirdAns);
        break;
       // case w call to firstMethod method
       case 'z':
          DoSomethingLast = fourthMethod(num1,num2);
          System.out.println(" The result is "+FourthAns);
       break;
          default:
          System.out.println(" Please Enter 'w', 'x', 'y', or 'z' only.");
        }
      }
   // again, simplified this portion

 static char thirdMethod(char a)
 {
 return a;
 }
 static char fourthMethod(char a)
 {
 return a;
 }
 public static void main(String[] args) {
    B b = new B();
 }
}

然后,我将测试程序更新为导入类B(而不是导入A的旧程序,因为B应该扩展A)。但它仍然只显示A中的实例。我知道这是程序加载实例的操作顺序,只是不确定如何修复它。

子类的默认构造函数总是首先调用超类的默认构造函数

在您的示例中,当使用默认构造函数创建类B时,将调用类A构造函数

解决方案是将逻辑移动到两个类中具有相同签名的方法中,并在超类的构造函数中调用该方法

大概是这样的:

class A {
    public A() {
        logic();
    }

    private void logic() {
        // Your switch of A
    }
}

class B extends A {
    public B() {
        super();
    }

    private void logic() {
        // Your switch of B
    }
}

动态绑定是此解决方案背后的OO原则。

使用调试器。
A
B
的构造函数都将被调用。我不确定你的意思。我正在使用调试器。而且它没有向我抛出任何标志。将断点放在
B
构造函数的开头,然后逐步完成。啊,明白了!谢谢你,我要去试试。好的,那么。。。我已经让它返回“请只输入‘w’、‘x’、‘y’或‘z’”。但不管我输入什么,它都会这样做,就像wxyz一样,都会返回那个。。。但是好消息是,我能够让它用新的逻辑()更改旧逻辑()的开关。现在我只需要找出我做错了什么,明白了!您的代码起到了帮助作用,我让它替换了开关,但我在B中再次错误地初始化了num1、num2和char,这在加载A和B之间消除了它们的输入。。。谢谢你的帮助!
class A {
    public A() {
        logic();
    }

    private void logic() {
        // Your switch of A
    }
}

class B extends A {
    public B() {
        super();
    }

    private void logic() {
        // Your switch of B
    }
}