JAVA中的类型转换

容易混淆的java 动态类型 与 静态类型 在这里将会得到易于理解的解释

动态方法选择和类型检查谜题

Java中每个变量都有一个静态变量类型,这是在声明变量是定义的,并在编译中进行检查。
其实每个变量还有一个动态变量类型,这是在实例化变量时指定,在运行中进行检查。

  1. 当 Java 检查应调用哪个方法时,它会根据静态类型来选择,并调用与参数类型匹配的方法。
  2. 当 Java 运行一个被重写的方法时,它会在其动态类型中搜索适当的方法签名并运行它。

以下是一个演示动态方法选择和类型检查的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class Animal {
void makeSound() {
System.out.println("Animal sound");
}
}

class Dog extends Animal {
@Override
void makeSound() {
System.out.println("Bark");
}
}

class Cat extends Animal {
@Override
void makeSound() {
System.out.println("Meow");
}
}

public class Main {
public static void main(String[] args) {
Animal myDog = new Dog(); // 静态类型为 Animal,动态类型为 Dog
Animal myCat = new Cat(); // 静态类型为 Animal,动态类型为 Cat

myDog.makeSound(); // 输出: Bark
myCat.makeSound(); // 输出: Meow
}
}

编译时类型检查和表达式

  1. 表达式具有编译时类型:

    1
    2
    3
    4
    5
    SLList<Integer> sl = new VengefulSLList<Integer>();
    //VengefulSLList 是 SLList 的一种,因此允许赋值。

    VengefulSLList<Integer> vsl = new SLList<Integer>();
    //这个则不被允许,SLList 不一定是 VengefulSLLis
  2. 方法调用的编译时类型与其声明类型相同。

类型转换

Java提供了一种强大的类型转换机制,可以让编译器忽略某些类型检查,允许开发者显式地将一种类型转换为另一种类型。然而,这种转换有时可能会带来风险。

Does not actually change anything: sunglasses don’t make the world dark.

实际上并没有改变任何东西:太阳镜不会让世界变暗。

1
2
3
4
5
6
7
8
public class PrimitiveCasting {
public static void main(String[] args) {
double myDouble = 9.78;
// 强制将 double 转换为 int
int myInt = (int) myDouble; // 结果为 9
System.out.println("Converted int value: " + myInt);
}
}