在讨论FileInputStream之前,我先从一个场景开始,其中有两个完全有效的重载方法,但编译器会感到困惑,然后在响应某些输入时报告一个编译时错误。
以下是方法。
double calcAverage(double marks1, int marks2) {
return (marks1 + marks2)/2.0;
}
double calcAverage(int marks1, double marks2) {
return (marks1 + marks2)/2.0;
}
下面是显示方法使用的完整代码:
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);
}
}
由于int文本值可以传递给double类型的变量,因此这两个方法都是文本值2和3的可接受候选方法,因此编译器无法决定选择哪一个方法。
这就是当我带着上面的概念,深入研究FileInputStream类的Java 7API并研究该类的两个重载构造函数时,我感到困惑的地方。
根据Java 7 API源代码,以String对象为参数的版本定义为:
public FileInputStream(String name) throws FileNotFoundException {
this(name != null ? new File(name) : null);
}
现在,如果“name”确实为null,则这个(name!=null?new File(name):null);求值为this(null);这又相当于对FileInputStream(null)的调用;但是FileInputStream(String)和FileInputStream(File)都成为可能的选择,可以使用null值进行调用。难道这不会引起歧义吗?那么,难道没有编译时错误吗?
我知道最终会提出一个FileNotFoundException,但这是一个单独的问题,以后才会出现。在此之前的歧义是如何解决的?
您的错误在这里:
现在,如果“name”确实为null,this(name!=null?new File(name):null);
计算为this(null);
,这又相当于调用FileInputStream(null);
它实际上计算为this((File)null)
--即显式键入为File
的空值。这是因为表达式name!=null?new File(name):null
必须有一个类型,而该类型是两个备选项中最具体的类型。在这种情况下,一个备选类型被键入为file
,另一个被键入为null
,因此最具体的常见类型是file
。
这就是为什么它能够明确地将其解析为FileInputStream(File)
构造函数的原因。类似于:
File file = null;
new FileInputStream(file);
null 我不太确定如何处理我的代码,以下是我得到的: 我只是不知道我应该打什么。我相信我已经完成了第一个重载构造函数,但我对此还是新手。 那么,我应该做些什么来使重载构造函数工作呢? 我对Java和面向对象编程非常陌生。
我的问题是关于OOP(C)中的构造函数。当我在一个类中将默认构造函数定义为private,并且在main中将该类的一个对象初始化为default时,就会出现默认构造函数不可访问的错误。这很好。但我也在Public部分中使用默认参数构造函数,当我再次在main中初始化对象时,就会出现对函数重载的不明确调用。所以我的问题是,如果不能从main访问私有构造函数,那么编译器应该调用公共部分中的构造函数,这
本文向大家介绍C++中构造函数重载,包括了C++中构造函数重载的使用技巧和注意事项,需要的朋友参考一下 当类中没有定义构造函数时,C++编译器自动提供无参构造函数和拷贝构造函数 当类中定义了任意的拷贝构造函数,C++不提供无参构造函数。 系统自动提供的构造函数 无参构造函数 函数体为空 拷贝构造函数 简单的进行成员变量的值复制 Test t1;
本文向大家介绍解析C++中构造函数的默认参数和构造函数的重载,包括了解析C++中构造函数的默认参数和构造函数的重载的使用技巧和注意事项,需要的朋友参考一下 C++构造函数的默认参数 和普通函数一样,构造函数中参数的值既可以通过实参传递,也可以指定为某些默认值,即如果用户不指定实参值,编译系统就使形参取默认值。 【例】 程序运行结果为: 程序中对构造函数的定义(第12-16行)也可以改写成参数初始化
假设我们有以下简单的代码: 这段代码使用clang编译并打印“T”,但使用gcc我们有以下错误: 我的问题是哪个编译器有bug,gcc还是叮当声?