深圳龙华做网站的公司,提交网站到谷歌,做网站的那些个人工作室,物流网络平台都有哪些将一个类型强制转换成另一个类型的过程被称为类型转换。本节所说的对象类型转换#xff0c;是指存在继承关系的对象#xff0c;不是任意类型的对象。当对不存在继承关系的对象进行强制类型转换时#xff0c;会抛出 Java 强制类型转换#xff08;java.lang.ClassCastExcepti…将一个类型强制转换成另一个类型的过程被称为类型转换。本节所说的对象类型转换是指存在继承关系的对象不是任意类型的对象。当对不存在继承关系的对象进行强制类型转换时会抛出 Java 强制类型转换java.lang.ClassCastException异常。
Java 语言允许某个类型的引用变量引用子类的实例而且可以对这个引用变量进行类型转换。
Java 中引用类型之间的类型转换前提是两个类是父子关系主要有两种分别是向上转型upcasting和向下转型downcasting。
1 . 向上转型 父类引用指向子类对象为向上转型语法格式如下
fatherClass obj new sonClass();其中fatherClass 是父类名称或接口名称obj 是创建的对象sonClass 是子类名称。
向上转型就是把子类对象直接赋给父类引用不用强制转换。使用向上转型可以调用父类类型中的所有成员不能调用子类类型中特有成员最终运行效果看子类的具体实现。
2 . 向下转型 与向上转型相反子类对象指向父类引用为向下转型语法格式如下
sonClass obj (sonClass) fatherClass;其中fatherClass 是父类名称obj 是创建的对象sonClass 是子类名称。
向下转型可以调用子类类型中所有的成员不过需要注意的是如果父类引用对象指向的是子类对象那么在向下转型的过程中是安全的也就是编译是不会出错误。但是如果父类引用对象是父类本身那么在向下转型的过程中是不安全的编译不会出错但是运行时会出现我们开始提到的 Java 强制类型转换异常一般使用 instanceof 运算符来避免出此类错误。
例如Animal 类表示动物类该类对应的子类有 Dog 类使用对象类型表示如下
Animal animal new Dog(); // 向上转型把Dog类型转换为Animal类型Dog dog (Dog) animal; // 向下转型把Animal类型转换为Dog类型示例对象类型的转换。例如父类 Animal 和子类 Cat 中都定义了实例变量 name、静态变量 staticName、实例方法 eat() 和静态方法 staticEat()。此外子类 Cat 中还定义了实例变量 str 和实例方法 eatMethod()。
父类 Animal 的代码如下
public class Animal {public String name Animal动物;public static String staticName Animal可爱的动物;public void eat() {System.out.println(Animal吃饭);}public static void staticEat() {System.out.println(Animal动物在吃饭);}
}子类 Cat 的代码如下
public class Cat extends Animal {public String name Cat猫;public String str Cat可爱的小猫;public static String staticName Dog我是喵星人;public void eat() {System.out.println(Cat吃饭);}public static void staticEat() {System.out.println(Cat猫在吃饭);}public void eatMethod() {System.out.println(Cat猫喜欢吃鱼);}public static void main(String[] args) {Animal animal new Cat();Cat cat (Cat) animal; // 向下转型System.out.println(animal.name); // 输出Animal类的name变量System.out.println(animal.staticName); // 输出Animal类的staticName变量animal.eat(); // 输出Cat类的eat()方法animal.staticEat(); // 输出Animal类的staticEat()方法System.out.println(cat.str); // 调用Cat类的str变量cat.eatMethod(); // 调用Cat类的eatMethod()方法}
}通过引用类型变量来访问所引用对象的属性和方法时Java 虚拟机将采用以下绑定规则 实例方法与引用变量实际引用的对象的方法进行绑定这种绑定属于动态绑定因为是在运行时由 Java 虚拟机动态决定的。例如animal.eat() 是将 eat() 方法与 Cat 类绑定。静态方法与引用变量所声明的类型的方法绑定这种绑定属于静态绑定因为是在编译阶段已经做了绑定。例如animal.staticEat() 是将 staticEat() 方法与 Animal 类进行绑定。成员变量包括静态变量和实例变量与引用变量所声明的类型的成员变量绑定这种绑定属于静态绑定因为在编译阶段已经做了绑定。例如animal.name 和 animal.staticName 都是与 Animal 类进行绑定。对于 Cat 类运行时将会输出如下结果
Animal动物
Animal可爱的动物
Cat吃饭
Animal动物在吃饭
Cat可爱的小猫
Cat猫喜欢吃鱼强制对象类型转换
Java 编译器允许在具有直接或间接继承关系的类之间进行类型转换。对于向下转型必须进行强制类型转换对于向上转型不必使用强制类型转换。
例如对于一个引用类型的变量Java 编译器按照它声明的类型来处理。如果使用 animal 调用 str 和 eatMethod() 方法将会出错如下
animal.str ; // 编译出错提示Animal类中没有str属性animal.eatMethod(); // 编译出错提示Animal类中没有eatMethod()方法如果要访问 Cat 类的成员必须通过强制类型转换如下
((Cat)animal).str ; // 编译成功((Cat)animal).eatMethod(); // 编译成功把 Animal 对象类型强制转换为 Cat 对象类型这时上面两句编译成功。对于如下语句由于使用了强制类型转换所以也会编译成功例如
Cat cat (Cat)animal; // 编译成功将Animal对象类型强制转换为Cat对象类型类型强制转换时想运行成功就必须保证父类引用指向的对象一定是该子类对象最好使用 instanceof 运算符判断后再强转例如
Animal animal new Cat();
if (animal instanceof Cat) {Cat cat (Cat) animal; // 向下转型...
}子类的对象可以转换成父类类型而父类的对象实际上无法转换为子类类型。因为通俗地讲父类拥有的成员子类肯定也有而子类拥有的成员父类不一定有。因此对于向上转型不必使用强制类型转换。例如
Cat cat new Cat();
Animal animal cat; // 向上转型不必使用强制类型转换如果两种类型之间没有继承关系那么将不允许进行类型转换。例如
Dog dog new Dog();Cat cat (Cat)dog; // 编译出错不允许把Dog对象类型转换为Cat对象类型