我可以通过隐式分配char数组在java中创建字符串
String s = "asd";
而不是
String s = new String("asd");
这种行为类似于使用隐式单参数构造函数的c++。
那么为什么不能使用另一个用户定义的类呢?
public class Foo {
public Foo(int i) {
System.out.println(i);
}
}
public class Main {
public static void main(String[] args) {
Foo f = 9;
}
}
给予
Type mismatch: cannot convert from int to Foo
那么,为什么一些来自javaapi的“高级”类可以通过赋值行为隐式地进行构造,而自定义的、用户定义的类却不能?
2条答案
按热度按时间0ve6wy6x1#
java中没有隐式构造函数。用双引号括起来的一系列字符是字符串文字。正如您所怀疑的,这个定义是语言本身的一部分,无法在java中为您自己的类型创建文本。
polkgigr2#
首先,你错了:
"asd"
不是char数组,而是字符串文本,当然与new String("asd")
.与其他一些编程语言不同,java非常静态,不支持扩展语言本身,例如,不支持运算符重载和隐式构造等功能。
java语言有一组内置的数据类型,如第4章所述。类型、值和变量:
String
所有的原始类型(boolean
,byte
,short
,int
,long
,char
,float
,和double
). 这些类型之间的转换包含在第5章中。转换和上下文。一些java类型,主要是
java.lang
包,是java语言的一部分。它们有非常特殊的含义,在java语言规范中有明确的文档记录,不被认为是“高级的”,而只是该语言的“本机的”。以下是一些示例:String
是本机java类:§4.3.3. 类字符串,§3.10.5. 字符串文字,§5.1.11. 字符串转换,§5.4. 字符串上下文,以及§15.18.1. 字符串连接运算符+
.Throwable
,Error
,Exception
. 以及RuntimeException
是本机java类,有一整章专门介绍它们:第11章。例外情况。许多注解,例如
Override
以及FunctionalInterface
,对java语言有特殊意义:§9.6.4. 预定义的注解类型。AutoCloseable
是对try with resources语句具有特殊意义的本机java接口:§14.20.3. 尝试使用资源。Iterable
以及Iterator
是本机java接口,对for
回路:§14.14.2. 增强的for语句。