在讨论FileInputStream之前,我首先介绍了一个场景,其中有两个完全有效的重载方法,但编译器会感到困惑,然后报告编译时错误以响应某些输入.
这是方法.
double calcAverage(double marks1, int marks2) {
return (marks1 + marks2)/2.0;
}
double calcAverage(int marks1, double marks2) {
return (marks1 + marks2)/2.0;
}
Run Code Online (Sandbox Code Playgroud)
以下是显示方法用法的完整代码:
class MyClass {
double calcAverage(double marks1, int marks2) {
return (marks1 + marks2)/2.0;
}
double calcAverage(int marks1, double marks2) {
return (marks1 + marks2)/2.0;
}
public static void main(String args[]) {
MyClass myClass = new MyClass();
myClass.calcAverage(2, 3);
}
}
Run Code Online (Sandbox Code Playgroud)
因为int文字值可以传递给double类型的变量,所以这两个方法都是文字值2和3的可接受候选者,因此编译器无法决定选择哪个方法.
当我对我采用上述概念,进一步深入Java 7 API到FileInputStream类,并研究该类的两个重载构造函数时,我就会感到困惑.
我正在尝试制定下面方案中使用的规则.请解释为什么我得到2个不同的输出.
场景1输出:我是一个对象.
class Test {
public static void main (String[] args) {
Test t = new Test();
byte b_var = 10;
t.do_the_test(b_var);
}
public void do_the_test(Character c) {
System.out.println("I am a character.");
}
public void do_the_test(Integer i) {
System.out.println("I am an integer.");
}
public void do_the_test(Object obj) {
System.out.println("I am an object.");
}
}
Run Code Online (Sandbox Code Playgroud)
场景2输出:我是一个整数.
class Test {
public static void main (String[] args) {
Test t = new Test();
byte b_var = 10;
t.do_the_test(b_var);
}
public void …
Run Code Online (Sandbox Code Playgroud) 以下看似微不足道的问题已经动摇了我对基元如何在Java中工作的理解的核心.
我所遇到的术语"implicit narrowing"
,由此更小的范围类型的变量被允许保持较大范围类型的一个文字值,如果该值落入该较小的范围内.
据我所知,Java只允许在byte,char,short和int之间.
例如,如果该值足够小以适合字节类型的范围,则字节变量CAN采用int.
byte b1 = 3; // allowed even though 3 is an int literal
byte b2 = 350; // compilation error because a byte cannot go beyond positive 127
Run Code Online (Sandbox Code Playgroud)
所以,这很好用:
byte k = 3;
Run Code Online (Sandbox Code Playgroud)
但我不知道为什么下面这行不起作用!!
Byte k = new Byte(3);
Run Code Online (Sandbox Code Playgroud)
除非我将后者更改为Byte k = new Byte((byte)3)
,否则我会收到此编译错误:
error: no suitable constructor found for Byte(int)
Byte k = new Byte(3);
^
constructor Byte.Byte(byte) is not applicable
(actual argument int cannot be converted to …
Run Code Online (Sandbox Code Playgroud) 我正在努力知道如何决定应该模拟与我的测试对象交互的哪些对象。
class MyClass {
private Customer customer;
private Invoice invoice;
private PrintService ps;
private DBAccessService da;
private EmailService em;
..........
}
Run Code Online (Sandbox Code Playgroud)
我可以看到最后 3 个将被嘲笑,因为它们处理一些外部系统。客户和发票怎么样?如果没有,为什么?
java ×4
autoboxing ×1
byte ×1
casting ×1
mockito ×1
overloading ×1
primitive ×1
unit-testing ×1