Java对象类型转换:向上转型和向下转型
Java 语言允许某个类型的引用变量引用子类的实例,而且可以对这个引用变量进行类型转换。Java 中引用类型之间的类型转换(前提是两个类是父子关系)主要有两种,分别是向上转型(upcasting)和向下转型(downcasting)。
1)向上转型
父类引用指向子类对象为向上转型,语法格式如下:其中,fatherClass 是父类名称或接口名称,obj 是创建的对象,sonClass 是子类名称。fatherClass obj = new sonClass();
向上转型就是把子类对象直接赋给父类引用,不用强制转换。使用向上转型可以调用父类类型中的所有成员,不能调用子类类型有成员,最终运行效果看子类的具体实现。
2)向下转型
与向上转型相反,子类对象指向父类引用为向下转型,语法格式如下:其中,fatherClass 是父类名称,obj 是创建的对象,sonClass 是子类名称。sonClass obj = (sonClass) fatherClass;
向下转型可以调用子类类型中所有的成员,不过需要注意的是如果父类引用对象指向的是子类对象,那么在向下转型的过程中是安全的,也就是编译是不会出错误。但是如果父类引用对象是父类本身,那么在向下转型的过程中是不安全的,编译不会出错,但是运行时会出现我们开始提到的 Java 强制类型转换异常,一般使用 instanceof 运算符来避免出此类错误。
例如,Animal 类表示动物类,该类对应的子类有 Dog 类,使用对象类型表示如下:
Animal animal = new Dog(); // 向上转型,把Dog类型转换为Animal类型
Dog dog = (Dog) animal; // 向下转型,把Animal类型转换为Dog类型
例 1
下面通过具体的示例演示对象类型的转换。例如,父类 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对象类型
- 随机文章
- 马累 马尔代夫旅游(探索马尔代夫:不可错过的旅游胜地马累)
- 黄蜡水库马尔代夫(黄蜡水库:千姿百态的中国马尔代夫)
- 东吉尔湖马尔代夫(东吉尔湖为您带来马尔代夫的无限美好)
- 马尔代夫彩蛋图片(神秘的马尔代夫彩蛋招来无数游客)
- 乡村马尔代夫沙滩(乡村版马尔代夫:探索美丽的沙滩生活)
- 东方航空马尔代夫(东航马尔代夫航线上客座率超八成!)
- 嘉祥马尔代夫泳衣(嘉祥推荐的马尔代夫泳衣挑战夏日时光)
- 小马尔代夫厦门湾(厦门湾:像小马尔代夫一样的度假胜地)
- 广州马尔代夫岛屿(广州人现在能够前往马尔代夫度假岛!)
- 印度咖喱马尔代夫(印度咖喱让你在马尔代夫感受家的味道)
- 国内马尔代夫岛屿(中国马尔代夫岛屿:度假胜地重新定义)
- 女性推油马尔代夫(马尔代夫女性推油服务实践与经验分享)
- 长春 马尔代夫(长春市民能在马尔代夫旅游啦!)
- 深圳马尔代夫好玩(深圳的马尔代夫拥有哪些好玩的活动?)
- 收购马尔代夫酒店(公司收购马尔代夫酒店,扩大旅游业务)
- 柳州马尔代夫烧烤(柳州美食:马尔代夫式烧烤打卡新地标)
- 晚上上岛马尔代夫(晚上在马尔代夫度假:一个浪漫的天堂)
- 酷航 马尔代夫(酷航全新开航,带你畅游马尔代夫)
- 越南 马尔代夫(越南和马尔代夫:探索两个度假天堂)
- 温州号称马尔代夫(温州旅游局称温州打造中国版马尔代夫)
- 芳香世家马尔代夫(马尔代夫香水品牌,芳香世家闪亮登场)
- 赫敏马尔代夫照片(赫敏晒出马尔代夫游玩美照,仙气十足)
- 西北马尔代夫风景(探秘西北马尔代夫风光,惊叹自然美景)
- 抚州三江马尔代夫(抚州三江打造仿佛马尔代夫的度假胜地)
- 重庆马尔代夫火了(重庆网红马尔代夫风景区吸引游客涌入)
- 贵溪马尔代夫简介(探秘贵溪马尔代夫:全新度假胜地介绍)
- 陕西有马尔代夫吗(陕西有没有类似马尔代夫的度假胜地?)
- 男足 马尔代夫(中国队进军世界杯预选赛,战胜马尔代夫)
- 你好 马尔代夫(去马尔代夫旅游前必看,详细介绍马尔代夫!)
- 韩国马尔代夫旅游(韩国游客喜爱的度假胜地——马尔代夫)
