首页 > 解决方案 > Java - 尝试同时传递无值和布尔值,但返回 null

问题描述

试图在为同一类设置的两个不同对象上传递不传递值和布尔值 true。

根据TestDriver:以下应该通过布尔值传递truepublic Iron(boolean val)

Metal m1 = new Iron(true);
System.out.println("Should be Iron->"+m1);
System.out.println("Should be Enchanted (True)->"+m1.isEnchanted());`

但是,作为 null 传递,就好像它没有到达这个构造函数一样。告诉我它不是试图用 Iron 的构造函数来查看 Metal 类吗?

第二段代码不提交任何值,但也返回 null。我尝试使用Boolean.parseBoolean()以尝试将字符串转换为布尔值,反之亦然。

我已经尝试了很多不同的方法来让它工作,但是看不到任何地方,如果我遗漏了一些明显的东西,请告诉我。

干杯。

public class TestDriver {

    public static void main(String[] args) {

        Metal m1 = new Iron(true);
        System.out.println("Should be Iron->"+m1);
        System.out.println("Should be Enchanted (True)->"+m1.isEnchanted());
        Iron i1 = new Iron();
        System.out.println("Should not be Enchanted (False)->"+i1.isEnchanted());
    }

}

public class Iron extends Metal {

    public boolean isEnchanted(boolean val) {       

        boolean res = false;

        if(val == true) {
            res = true;
        } else {
            res = false;
        }
        return (res);

    }

    public Iron() {

    }

    public Iron(boolean val) {

        boolean res = false;

        if(val == true) {
            res = true;
        } else {
            res = false;
        }
        //return (res);

    }
}

传递真值时预期为真,不传递值时预期为假,但是在调用 isEnchanted 时 - 应该以某种方式调用。

标签: java

解决方案


你没有包括你的Metal课程,但我会放一个你在这里指定的工作示例来帮助你入门。

以下是Metal我为满足您想要的要求而制作的课程:

public class Metal {

    private boolean res;
    private String name;

    public Metal() {
        this.res = false;
    }

    public Metal (boolean res, String name) {
        this.res = res;
        this.name = name;
    }

    public boolean isEnchanted() {
        return res;       
    }

    @Override
    public String toString() {
        return name;       
    }
}

我添加了一个name要在您想要覆盖时使用的类字段,toString因为您想在System.out.println. toString()除了名称之外,仍然可以修改以打印您想要的任何内容。

还要注意对IsEnchanted(). 这应该只是return类变量的一个,res因此您可以看到该值设置为什么,您不应该在boolean此处放入更改逻辑的逻辑。

您还尝试使用许多局部变量,这不是利用Object的正确方法。看看变量现在res是如何在class级别上的,您不再需要传递它,因为在第一次从构造函数设置它之后,您可以随时访问它。

这是对Iron课程进行修改后的Metal课程。Iron请注意,此时在内部需要做的事情很少。我假设的大部分逻辑也会被其他Metals 使用,因此您现在可以extend Metal轻松地获取功能,例如 a Coppernow:

public class Iron extends Metal {

    public Iron() {
    }

    public Iron(boolean val) {
        super(val, "Iron");
    }
}

这里要注意的最重要的事情是super(val, "Iron")res参数传递给super类的构造函数并将名称定义为的调用"Iron"。本super例中的类是Metal.

现在您可以使用您的测试代码,它可以按预期工作:

public static void main(String args[]){
    Metal m1 = new Iron(true);
    System.out.println("Should be Iron->"+ m1);
    System.out.println("Should be Enchanted (True)->" + m1.isEnchanted());
    Metal i1 = new Iron();
    System.out.println("Should not be Enchanted (False)->"+i1.isEnchanted());
}

输出:

应该是铁->铁

应该被附魔(真)->真

不应该被附魔(假)->假


推荐阅读