重温经典《Thinking in java》第四版之第五章 初始化与清理(二十八)

简介: 重温经典《Thinking in java》第四版之第五章 初始化与清理(二十八)

“5.2.2 涉及基本类型的重载”举了两个例子,介绍了基本类型传递给重载方法中,如果重载方法定义了一些能够互相转化的类型时,会出现类型提升或者类型窄化的现象。下面先看一个基本类型从“较小”类型提升至“较大”类型的例子:

importstaticnet.mindview.util.Print.*; 
publicclassPrimitiveOverloading { 
voidf1(charx) { printnb("f1(char) "); } 
voidf1(bytex) { printnb("f1(byte) "); } 
voidf1(shortx) { printnb("f1(short) "); } 
voidf1(intx) { printnb("f1(int) "); } 
voidf1(longx) { printnb("f1(long) "); } 
voidf1(floatx) { printnb("f1(float) "); } 
voidf1(doublex) { printnb("f1(double) "); } 
voidf2(bytex) { printnb("f2(byte) "); } 
voidf2(shortx) { printnb("f2(short) "); } 
voidf2(intx) { printnb("f2(int) "); } 
voidf2(longx) { printnb("f2(long) "); } 
voidf2(floatx) { printnb("f2(float) "); } 
voidf2(doublex) { printnb("f2(double) "); } 
voidf3(shortx) { printnb("f3(short) "); } 
voidf3(intx) { printnb("f3(int) "); } 
voidf3(longx) { printnb("f3(long) "); } 
voidf3(floatx) { printnb("f3(float) "); } 
voidf3(doublex) { printnb("f3(double) "); } 
voidf4(intx) { printnb("f4(int) "); } 
voidf4(longx) { printnb("f4(long) "); } 
voidf4(floatx) { printnb("f4(float) "); } 
voidf4(doublex) { printnb("f4(double) "); } 
voidf5(longx) { printnb("f5(long) "); } 
voidf5(floatx) { printnb("f5(float) "); } 
voidf5(doublex) { printnb("f5(double) "); } 
voidf6(floatx) { printnb("f6(float) "); } 
voidf6(doublex) { printnb("f6(double) "); } 
voidf7(doublex) { printnb("f7(double) "); } 
voidtestConstVal() { 
printnb("5: "); 
f1(5);f2(5);f3(5);f4(5);f5(5);f6(5);f7(5); print(); 
    } 
voidtestChar() { 
charx=‘x’; 
printnb("char: "); 
f1(x);f2(x);f3(x);f4(x);f5(x);f6(x);f7(x); print(); 
    } 
voidtestByte() { 
bytex=0; 
printnb("byte: "); 
f1(x);f2(x);f3(x);f4(x);f5(x);f6(x);f7(x); print(); 
    } 
voidtestShort() { 
shortx=0; 
printnb("short: "); 
f1(x);f2(x);f3(x);f4(x);f5(x);f6(x);f7(x); print(); 
    } 
voidtestInt() { 
intx=0; 
printnb("int: "); 
f1(x);f2(x);f3(x);f4(x);f5(x);f6(x);f7(x); print(); 
    } 
voidtestLong() { 
longx=0; 
printnb("long: "); 
f1(x);f2(x);f3(x);f4(x);f5(x);f6(x);f7(x); print(); 
    } 
voidtestFloat() { 
floatx=0; 
printnb("float: "); 
f1(x);f2(x);f3(x);f4(x);f5(x);f6(x);f7(x); print(); 
    } 
voidtestDouble() { 
doublex=0; 
printnb("double: "); 
f1(x);f2(x);f3(x);f4(x);f5(x);f6(x);f7(x); print(); 
    } 
publicstaticvoidmain(String[] args) { 
PrimitiveOverloadingp=newPrimitiveOverloading(); 
p.testConstVal(); 
p.testChar(); 
p.testByte(); 
p.testShort(); 
p.testInt(); 
p.testLong(); 
p.testFloat(); 
p.testDouble(); 
    } 
}

/* Output:

5: f1(int) f2(int) f3(int) f4(int) f5(long) f6(float) f7(double)

char: f1(char) f2(int) f3(int) f4(int) f5(long) f6(float) f7(double)

byte: f1(byte) f2(byte) f3(short) f4(int) f5(long) f6(float) f7(double)

short: f1(short) f2(short) f3(short) f4(int) f5(long) f6(float)

f7(double)

int: f1(int) f2(int) f3(int) f4(int) f5(long) f6(float) f7(double)

long: f1(long) f2(long) f3(long) f4(long) f5(long) f6(float) f7(double)

float: f1(float) f2(float) f3(float) f4(float) f5(float) f6(float)

f7(double)

double: f1(double) f2(double) f3(double) f4(double) f5(double)

f6(double) f7(double)

*///:~

上述例子中,int类型会被提升为float,long,double分别调用提升类型的重载函数。同理,如果传一个“较大”类型的参数比如double,会被窄化成long,float,int等分别调用窄化类型的重载函数。在这里就不贴窄化例子的代码了,读者可以自己模仿实验一下。要重点说明的是,一般很少定义这么多重载函数,可能一些库和框架会用到,但是他们一般会做一些类型判断,可能只以Object作为参数类型。

5.2.3 以返回值区分重载方法,从这一小节的命名可以看出来是一个行不通的方案。虽然我们可以从有返回值的方法中获取返回值,但是在调用方法的时候,可以不获取返回值,这就让编译器无法区分调用那个方法,所以,不能以返回值区分重载方法方法。举例说明:

void f() {}

int f() { return 1; }

如果像下面这样调用方法:f();此时Java如何才能判断调用哪一个f()呢?答案是无法判断。

目录
相关文章
|
1月前
|
Java 编译器
java“变量 x 可能未被初始化”解决
在Java中,如果编译器检测到变量可能在使用前未被初始化,会报“变量 x 可能未被初始化”的错误。解决方法包括:1. 在声明变量时直接初始化;2. 确保所有可能的执行路径都能对变量进行初始化。
|
16天前
|
Java
Java 静态变量的初始化顺序
【10月更文挑战第15天】了解 Java 静态变量的初始化顺序对于正确编写和维护代码至关重要。通过深入理解初始化顺序的原理和细节,我们可以更好地避免潜在的问题,并提高代码的质量和可靠性。
|
1月前
|
Java 编译器
【一步一步了解Java系列】:子类继承以及代码块的初始化
【一步一步了解Java系列】:子类继承以及代码块的初始化
22 3
|
1月前
|
Java
java构造方法时对象初始化,实例化,参数赋值
java构造方法时对象初始化,实例化,参数赋值
47 1
|
3月前
|
安全 Java 关系型数据库
Java连接Mysql SSL初始化失败
Java连接Mysql SSL初始化失败
|
3月前
|
存储 Java
如何在 Java 中初始化二维 ArrayList
【8月更文挑战第23天】
90 1
|
3月前
|
存储 JavaScript Java
Java中未被初始化的字符串打印出“null”?
在Java中,未初始化的`String`变量默认值为`null`。打印此类变量时输出“null”,是因为`PrintStream`类中的`print`方法特别处理了`null`值,将其转换为字符串“null”。从JDK 17开始,`println`方法通过`String.valueOf`间接实现相同功能。当拼接包含`null`的字符串时,如`s1 + "BLACK"`,结果为“nullBLACK”,这是因为字符串构建过程中`StringBuilder`的`append`方法将`null`转换为“null”。
|
3月前
|
存储 Java 编译器
如何在 Java 中初始化对象 Arraylist?
【8月更文挑战第23天】
103 0
|
3月前
|
存储 Java 开发工具
【Azure Developer】VS Code运行Java 版Azure Storage SDK操作Blob (新建Container, 上传Blob文件,下载及清理)
【Azure Developer】VS Code运行Java 版Azure Storage SDK操作Blob (新建Container, 上传Blob文件,下载及清理)
|
3月前
|
Java Spring
Java SpringBoot Bean InitializingBean 项目初始化
Java SpringBoot Bean InitializingBean 项目初始化
53 0