小编Moh*_*gar的帖子

关于Java 7 API中两个重载的FileInputStream构造函数的一些有趣内容

在讨论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类型的变量,所以这两个方法都是文字值23的可接受候选者,因此编译器无法决定选择哪个方法.

当我对我采用上述概念,进一步深入Java 7 API到FileInputStream类,并研究该类的两个重载构造函数时,我就会感到困惑.

  1. public FileInputStream(String name)抛出FileNotFoundException {.....}
  2. public FileInputStream(File file)抛出FileNotFoundException …

java constructor-overloading

22
推荐指数
2
解决办法
839
查看次数

使用基元及其包装器重载的方法

我正在尝试制定下面方案中使用的规则.请解释为什么我得到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 autoboxing overloading

15
推荐指数
1
解决办法
2948
查看次数

对Java中原语隐式缩小的想法感到困惑

以下看似微不足道的问题已经动摇了我对基元如何在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)

java primitive byte casting

5
推荐指数
1
解决办法
1637
查看次数

我应该模拟与我的测试对象交互的所有对象吗?

我正在努力知道如何决定应该模拟与我的测试对象交互的哪些对象。

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 unit-testing mockito

3
推荐指数
1
解决办法
819
查看次数