【问题标题】:OOP in Java: problem with constructor and methodsJava中的OOP:构造函数和方法的问题
【发布时间】:2019-11-11 21:43:02
【问题描述】:

我是 Java 新手,我正在尝试编写一个带有构造函数和方法的类,这些构造函数和方法可以将两个数字相加和相除,并比较一个对象是否大于或等于另一个对象。但我收到一个错误:The method plus(int) in the type Compare is not applicable for the arguments (Compare)。怎么了?

代码如下:

public class Compare {
    // fields
    private int number;
    private int plus;
    private double div; 

    // constructor
    public Compare (int n) {
        number = n;
    }


    public int plus (int x) {
        return this.number + x;
    }

    public int div (int x) {
        return this.number / x;
    }   

    public boolean isLargerThan (int x) {
        return this.number > x;
    }       

    public boolean isEqualTo (int x) {
        return this.number == x;
    }           

    public static void main(String[] args) {
        Compare n1 = new Compare(9);
        Compare n2 = new Compare(4);

        Compare sum = n1.plus(n2);

        Compare div = n1.div(n2);

        boolean check1 = sum.isLargerThan(n1);

        boolean check2 = div.isLargerThan(n2);

        boolean check3 = div.isEqualto(sum);            

    }       

}

要求是使用 Compare 构造函数创建 sum 和 div 对象,该构造函数将等于 n1 加上 n2,加上适用的 plus 方法或除法。

【问题讨论】:

  • boolean check1 = sum.isLargerThan(n1);,n1的类型是什么,你通过定义public boolean isLargerThan (int x) {期待什么?
  • n1 必须由比较器初始化。以便可以将方法应用于它。方法 public boolean isLargerThan 将应用于 n1,与 n2 或由 Compare 初始化的任何对象进行比较。
  • SMA 的意思是您声明了采用integers 的方法,但您将其传递给Compare。当你这样做时,你希望编译器做什么?

标签: java oop methods constructor


【解决方案1】:

您可能需要一个新的比较,包含总和。

public Compare plus (int x) {
    return new Compare(number + x);
}

public Compare plus (Compare x) {
    return new Compare(number + x.number);
}

这也暗示了期望一个 Compare 对象,而不是所示的 int。

这样Compare 将变得不可变,这非常好,因为您可以毫无问题地共享不同变量中的对象(更改一个变量的值会改变其他变量的值)。

@Override
public String toString() {
    return Integer.toString(number);
}

public int intValue() {
    return number;
}

【讨论】:

  • 我添加了一个toString 方法,在执行System.out.println(n1); 时总是使用该方法,否则使用父类Object.toString(),它只打印类名+'@'加上对象的“地址”在记忆中。
【解决方案2】:

我建议你阅读简单的 Java 类并阅读教程。

为了清楚起见,我创建了一个与您的目标相似的简单类和应用程序。

package stackoverflow;

public class CompareExample {

    public static void main(String[] args) {

        MyNumber one = new MyNumber(1);
        MyNumber two = new MyNumber(2);
        MyNumber three = new MyNumber(3);
        MyNumber four = new MyNumber(4);
        MyNumber five = new MyNumber(5);

        one.add(two);
        System.out.println(one);

        two.substract(three);
        System.out.println(two);

        int comparison = four.compareTo(five);

        if(comparison > 0) {
            System.out.println("gr");
        }
        else if(comparison < 0) {
            System.out.println("ls");
        }
        else {
            System.out.println("eq");
        }

    }  

    static class MyNumber{
        private int number;

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

        public void add(MyNumber that) {
            this.number += that.number;
        }

        public void substract(MyNumber that) {
            this.number -= that.number;
        }

        public int compareTo(MyNumber that) {
            return this.number - that.number;
        }

        @Override
        public String toString() {
            return "MyNumber -> Value:" + number;
        }
    }
}

【讨论】:

    【解决方案3】:

    问题来了:

    比较 sum = n1.plus(n2);

    比较 div = n1.div(n2);

    方法:plusdiv 返回 int 值不是 Compare 类的对象。

    public int plus (int x) { 返回 this.number + x; }

    公共 int div (int x) { 返回 this.number / x; }


    Add getter method in Compare Class.
    
    public int getNumber(){
    return number;
    }
    

    使用下面的代码并尝试运行:

    public static void main(String[] args) {
        Compare sum = new Compare(9);
        Compare divObj = new Compare(4);
    
        sum.plus(n2);
    
        divObj.div(n2);
    
        boolean check1 = sum.isLargerThan(sum.getNumber());
    
        boolean check2 = divObj.isLargerThan(divObj.getNumber());
    
        boolean check3 = divObj.isEqualto(sum.getNiumber());            
    
    }        
    

    【讨论】:

      【解决方案4】:

      plusdiv 方法接受int 并返回int,您正试图在Compare 对象中接收它们的输出。此外,isLargerThan 采用 int 而不是 Compare

      【讨论】:

        【解决方案5】:

        这里的问题是“Compare”类中的“plus”、“div”、“isLargerThan”和“isEqualTo”方法的参数/返回类型是“int”类型。但是在“main”函数中,您传递对象并期望“Compare”类型的对象。

        要修复它,请将“Compare”类中的那些方法的参数/返回类型更改为“Compare”,或者将“int”值作为参数传递并在“main”函数中获取“int”值。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-07-09
          • 2021-02-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多