Java重载中的自动类型提升
在进入实际主题之前,首先,我们需要了解方法重载和类型提升。
什么是方法重载?
当一个类由多个具有相同名称但具有不同签名和返回类型的方法组成时,我们将这些方法称为重载方法,该过程称为方法重载。
例子:
void method(int i)
int method(int i,int j)
void method(double d)
什么是自动类型提升?
名称类型提升指定可以将小型数据类型提升为大型数据类型。即,整数数据类型可以提升为 long、float、double 等。这种自动类型提升是在使用较小数据类型调用任何接受较大数据类型参数的方法时完成的。
例子:
public void method(double a){
System.out.println("Method called");
}
public static void main(){
method(2);
}
在上面的方法调用中,我们传递了一个整数作为参数,但在下面的代码中没有方法接受整数。由于自动类型提升, Java编译器不会抛出错误。 Integer 被提升为可用的大尺寸数据类型 double。
Note:- This is important to remember is Automatic Type Promotion is only possible from small size datatype to higher size datatype but not from higher size to smaller size. i.e., integer to character is not possible.
示例 1:在此示例中,我们正在测试从小型数据类型到大型数据类型的自动类型提升。
Java
class GFG {
// A method that accept double as parameter
public static void method(double d)
{
System.out.println(
"Automatic Type Promoted to Double-" + d);
}
public static void main(String[] args)
{
// method call with int as parameter
method(2);
}
}
Java
class GFG {
// A method that accept integer as parameter
public static void method(int i)
{
System.out.println(
"Automatic Type Promoted possible from high to small?");
}
public static void main(String[] args)
{
// method call with double as parameter
method(2.02);
}
}
Java
class GFG {
// A method that accept integer as parameter
public static void method(int i)
{
System.out.println(
"Automatic Type Promoted to Integer-" + i);
}
// A method that accept double as parameter
public static void method(double d)
{
System.out.println(
"Automatic Type Promoted to Double-" + d);
}
// A method that accept object as parameter
public static void method(Object o)
{
System.out.println("Object method called");
}
public static void main(String[] args)
{
// method call with char as parameter
method('a');
// method call with int as parameter
method(2);
// method call with float as parameter
method(2.0f);
// method call with a string as parameter
method("Geeks for Geeks");
}
}
Java
class GFG {
// overloaded methods
// Method that accepts integer and double
public static void method(int i, double d)
{
System.out.println("Integer-Double");
}
// Method that accepts double and integer
public static void method(double d, int i)
{
System.out.println("Double-Integer");
}
public static void main(String[] args)
{
// method call by passing integer and double
method(2, 2.0);
// method call by passing double and integer
method(2.0, 2);
// method call by passing both integers
// method(2, 2);
// Ambiguous error
}
}
Automatic Type Promoted to Double-2.0
说明:这里我们将一个 Integer 作为参数传递给一个方法,并且同一个类中有一个方法接受 double 作为参数但不接受 Integer。在这种情况下, Java编译器执行从 int 到 double 的自动类型提升并调用该方法。
示例 2:让我们尝试编写一个代码来检查自动类型提升是否发生从大尺寸数据类型到小尺寸数据类型。
Java
class GFG {
// A method that accept integer as parameter
public static void method(int i)
{
System.out.println(
"Automatic Type Promoted possible from high to small?");
}
public static void main(String[] args)
{
// method call with double as parameter
method(2.02);
}
}
输出:
说明:从这个例子中,证明了自动类型提升只适用于从小尺寸数据类型到大尺寸数据类型。由于与整数相比双倍大小较大,因此大大小到小大小的转换失败。
示例 3:在此示例中,我们将查看重载方法以及自动类型的提升是如何在那里发生的。
Java
class GFG {
// A method that accept integer as parameter
public static void method(int i)
{
System.out.println(
"Automatic Type Promoted to Integer-" + i);
}
// A method that accept double as parameter
public static void method(double d)
{
System.out.println(
"Automatic Type Promoted to Double-" + d);
}
// A method that accept object as parameter
public static void method(Object o)
{
System.out.println("Object method called");
}
public static void main(String[] args)
{
// method call with char as parameter
method('a');
// method call with int as parameter
method(2);
// method call with float as parameter
method(2.0f);
// method call with a string as parameter
method("Geeks for Geeks");
}
}
Automatic Type Promoted to Integer-97
Automatic Type Promoted to Integer-2
Automatic Type Promoted to Double-2.0
Object method called
解释:在上面的代码中,
- 首先,我们调用了一个以字符为参数的方法,但我们没有定义任何接受字符的方法,因此它将检查下一个大数据类型,即整数。如果存在接受 Integer 的方法,则它会执行自动类型提升并调用该方法。如果未找到,它会搜索下一级更高大小的数据类型。
- 这里我们有一个接受 Integer 的方法,因此字符'a' 被转换为整数 - 97,并调用相应的方法。
- 接下来,我们通过传递两个整数变量来调用一个方法。由于它直接找到了一个方法,所以没有发生任何提升,并且调用了该方法。
- 接下来,传递一个浮点变量,即2.0f。这里我们有一个接受双精度的方法,所以浮点数被转换为双精度并调用该方法。
- 最后,传递一个字符串,它与双精度相比占用更多空间。因此,它搜索接受字符串或对象的方法,这是所有类型的超类。在这段代码中,没有接受字符串的方法,但有一个接受对象的方法。所以在类型提升之后调用该方法。
示例 4:在此示例中,考虑具有多个参数的重载方法,并观察自动类型转换是如何在这里发生的:
Java
class GFG {
// overloaded methods
// Method that accepts integer and double
public static void method(int i, double d)
{
System.out.println("Integer-Double");
}
// Method that accepts double and integer
public static void method(double d, int i)
{
System.out.println("Double-Integer");
}
public static void main(String[] args)
{
// method call by passing integer and double
method(2, 2.0);
// method call by passing double and integer
method(2.0, 2);
// method call by passing both integers
// method(2, 2);
// Ambiguous error
}
}
Integer-Double
Double-Integer
解释:在上面的代码中,当我们将参数传递给方法调用时,编译器会搜索接受相同参数的对应方法。如果存在,那么它将调用该方法。否则,它将寻找自动类型提升的场景。
- 对于第一个方法调用,已经有一个接受类似参数的方法,因此它将调用该 Integer-Double 方法。
- 对于第二个方法调用,类中也定义了一个方法,编译器将调用相应的方法。 (双整数)
- 但是当我们传递 2 个整数作为参数时,编译器首先会检查接受 2 个整数的相应方法。在这种情况下,没有接受两个整数的方法。所以它会检查类型提升的场景。
- 这里有两种方法可以接受整数和双精度,并且任何整数都可以简单地提升为双精度,但问题是模棱两可。如果类型被提升,编译器不知道调用什么方法。因此,如果我们在上面的代码中取消注释第 20 行,编译器会抛出如下所示的错误消息 -
这些是可以清楚地了解重载方法中的自动类型转换的几个示例。