方法重载和原始类型

时间:2014-06-30 15:45:02

标签: java method-overriding

我有一个java程序,我想在这里讨论并得到你的想法和意见

public class StackFriends {

    public static void go(short n) {
        System.out.println("short");
    }

    public static void go(Short n) {
        System.out.println("SHORT");
    }
    public static void go(Long n) {
        System.out.println("LONG");
    }

    public static void main(String[] args) {
        Short y = 6;
        int z = 7;
        go(y);
        go(z);
    }
}

为什么会出现编译时错误?

  1. 是因为对于go(y)和go(z),编译器无法决定是调用go(Long n),go(Short n)还是go(short n)?

    < / LI>
  2. 是声明

    Short y = 6;
    

    有效?如果它有效,public static void go(Short n) - 只接受Short类型的包装器对象?

  3. 请告诉我包装类的行为方式,以及在这种情况下它们可以作为参数的可能值吗?

  4. 我知道我可以做更多的研究并自己找到它,但是单独使用编译器会有点孤独,我只是想讨论它并学习,它给了很多乐趣。 / p>

3 个答案:

答案 0 :(得分:2)

注意:此答案不会涵盖代码中的拼写错误,例如System.out.println("SHORT")之后缺少的分号(;)或类似内容。

  

是因为对于go(y)go(z),编译器无法决定是调用go(Long n),go(Short n)还是go(short n)

编译器可以选择使用哪种方法。原因如下:

  • short是原始类型。
  • Short是一个类,而不是基本类型,因此shortShort变量的方式不同,编译器可以选择使用哪个。
  • Longlong的包装类,而Long 不是 a Short(不要通过is-a测试)并且short无法自动装箱到Long

go(z)的调用无法编译,因为编译器无法自动将int变量缩小为short。在此之后,int无法自动生成,也不能Short也不能Long,因此没有可以接收int的有效方法。如果你想通过go(short),你需要做一个明确的演员:

go((short)z);

  

是声明Short y = 6;有效吗?

没有,它̶任何̶i̶s̶n̶'̶t̶.̶面值整数数值变量被转换成̶̶i̶n̶t̶̶̶v̶a̶r̶i̶a̶b̶l̶e̶.̶̶̶i̶n̶t̶̶̶c̶a̶n̶n̶o̶t̶是̶a̶u̶t̶o̶b̶o̶x̶e̶d̶到̶̶S̶h̶o̶r̶t̶̶, ̶所以这就提出了一个编译器̶e̶r̶r̶o̶r̶.̶使它编译,̶添加类型强制转换为̶̶s̶h̶o̶r̶t̶̶第一:̶

是的,确实如此。这是因为字面值将自动从int输入到short,然后自动装箱到Short。此外,文字整数值6适合short变量的值范围。如果您的文字值超出范围,您将收到编译器错误:

Short s1 = 6; //compiles fine
Short s2 = 32768; //compiler error

  

请告诉我包装类的行为方式,以及在这种情况下它们可以作为参数的可能值吗?

这是非常广泛的。阅读有关它的教程。以下是相关的官方教程:

答案 1 :(得分:1)

public static void go(Short n)

{ 

    System.out.println("SHORT")

}

应该是(你忘了半结肠)

public static void go(Short n)

{ 

    System.out.println("SHORT");

}

您也可以致电

go(z);

z为int,但没有

public static void go(int n)

仅限longshortShort。我添加了半冒号并更改了

    int z = 7;

    Long z = 7L;

它会为我编译。上面两个问题是我发现的唯一会引发编译时问题的问题,如果你修复这些问题,你的编译时问题就会得到解决。

int z更改为long z的解决方案是:

public class StackFriends {

    public static void go(short n) {
        System.out.println("short");
    }

    public static void go(Short n) {
        System.out.println("SHORT");
    }

    public static void go(Long n) {
        System.out.println("LONG");
    }

    public static void main(String[] args) {
        Short y = 6;
        Long z = 7L;
        go(y);
        go(z);
    }

}

您还可以添加其他go()功能来接受int

public static void go(int n) {
    System.out.println("INT");
}

完整代码为

public class StackFriends {

    public static void go(short n) {
        System.out.println("short");
    }

    public static void go(Short n) {
        System.out.println("SHORT");
    }

    public static void go(Long n) {
        System.out.println("LONG");
    }

    public static void go(int n) {
        System.out.println("INT");
    }

    public static void main(String[] args) {
        Short y = 6;
        int z = 7;
        go(y);
        go(z);
    }

}

答案 2 :(得分:0)

在方法;

print语句后添加go(Short n)
public static void go(Short n) {
    System.out.println("SHORT");
}

定义方法go()以将整数作为参数

public static void go(int n) {
    System.out.println("int");
}