天天看點

java顯式轉換_Java中的顯式類型轉換示例

我在http://www.javabeginner.com/learn-java/java-object-typecasting上遇到了這個示例,在談到顯式類型轉換的部分中,有一個示例使我感到困惑。

這個例子:

class Vehicle {

String name;

Vehicle() {

name = "Vehicle";

}

}

class HeavyVehicle extends Vehicle {

HeavyVehicle() {

name = "HeavyVehicle";

}

}

class Truck extends HeavyVehicle {

Truck() {

name = "Truck";

}

}

class LightVehicle extends Vehicle {

LightVehicle() {

name = "LightVehicle";

}

}

public class InstanceOfExample {

static boolean result;

static HeavyVehicle hV = new HeavyVehicle();

static Truck T = new Truck();

static HeavyVehicle hv2 = null;

public static void main(String[] args) {

result = hV instanceof HeavyVehicle;

System.out.print("hV is an HeavyVehicle: " + result + "\n");

result = T instanceof HeavyVehicle;

System.out.print("T is an HeavyVehicle: " + result + "\n");

result = hV instanceof Truck;

System.out.print("hV is a Truck: " + result + "\n");

result = hv2 instanceof HeavyVehicle;

System.out.print("hv2 is an HeavyVehicle: " + result + "\n");

hV = T; //Sucessful Cast form child to parent

T = (Truck) hV; //Sucessful Explicit Cast form parent to child

}

}

在最後一個為T配置設定了參考hV且類型轉換為(Truck)的行中,為什麼在注釋中說這是從父級到子級的成功顯式轉換?據我了解,強制轉換(隐式或顯式)隻會更改對象的聲明類型,而不會更改實際類型(除非您将新的類執行個體實際配置設定給該對象的字段引用,否則不應更改)。如果已經為hv配置設定了HeavyVehicle類的執行個體,該執行個體是Truck類的超類,那麼如何将該字段類型轉換為一個更具體的子類,該子類從HeavyVehicle類擴充而來?

據我了解,強制轉換的目的是限制對對象(類執行個體)某些方法的通路。是以,您不能将對象轉換為比該對象實際配置設定的類具有更多方法的更具體的類。這意味着該對象隻能轉換為超類或與實際執行個體化該類的類相同的類。這是正确的還是我錯了?我仍在學習,是以不确定這是否是正确看待事物的方法。

我也知道這應該是向下轉換的示例,但是如果實際類型沒有向下轉換該對象的類的方法,則我不确定這實際上如何工作。顯式轉換是否會以某種方式更改對象的實際類型(而不僅僅是聲明的類型),進而使該對象不再是HeavyVehicle類的執行個體,而是現在成為Truck類的執行個體?