java基础学习总结——对象转型
一、对象转型介绍

对象转型分为两种:一种叫向上转型(父类对象的引用或者叫基类对象的引用指向子类对象,这就是向上转型),另一种叫向下转型。转型的意思是:如把float类型转成int类型,把double类型转成float类型,把long类型转成int类型,这些都叫转型。把一种形式转成另外一种形式就叫转型。除了基础数据类型的转型之外(基础数据类型的转型:大的可以转成小的,小的也可以转成大的。),对象领域里面也有对象之间的转型。
1.1.对象转型实例一
1 package javastudy.summary;
2
3 /**
4 * 父类Animal
5 * @author gacl
6 *
7 */
8 class Animal {
9
10 public String name;
11
12 public Animal(String name) {
13 this.name = name;
14 }
15 }
16
17 /**
18 * 子类Cat继承Animal
19 * @author gacl
20 *
21 */
22 class Cat extends Animal {
23
24 /**
25 * Cat添加自己独有的属性
26 */
27 public String eyeColor;
28
29 public Cat(String n, String c) {
30 super(n);//调用父类Animal的构造方法
31 this.eyeColor = c;
32 }
33 }
34
35 /**
36 * 子类Dog继承Animal
37 * @author gacl
38 *
39 */
40 class Dog extends Animal {
41 /**
42 * Dog类添加自己特有的属性
43 */
44 public String furColor;
45
46 public Dog(String n, String c) {
47 super(n);//调用父类Animal的构造方法
48 this.furColor = c;
49 }
50
51 }
52
53 /**
54 * 下面是这三个类的测试程序
55 * @author gacl
56 *
57 */
58 public class TestClassCast {
59
60 /**
61 * @param args
62 */
63 public static void main(String[] args) {
64
65 Animal a = new Animal("name");
66 Cat c = new Cat("catname","blue");
67 Dog d = new Dog("dogname", "black");
68 /**
69 * a instanceof Animal这句话的意思是a是一只动物吗?
70 * a是Animal这个类里面的是一个实例对象,所以a当然是一只动物,其结果为true。
71 */
72 System.out.println(String.format("a instanceof Animal的结果是%s",a instanceof Animal));//true
73 /**
74 * c是Cat类的实例对象的引用,即c代表的就是这个实例对象,
75 * 所以“c是一只动物”打印出来的结果也是true。
76 * d也一样,所以“d是一只动物”打印出来的结果也是true。
77 */
78 System.out.println(String.format("c instanceof Animal的结果是%s",c instanceof Animal));//true
79 System.out.println(String.format("d instanceof Animal的结果是%s",d instanceof Animal));//true
80 /**
81 * 这里判断说“动物是一只猫”,不符合逻辑,所以打印出来的结果是false。
82 */
83 System.out.println(String.format("a instanceof Cat的结果是%s",a instanceof Cat));
84 /**
85 * 这句话比较有意思了,a本身是Animal类的实例对象的引用,
86 * 但现在这个引用不指向Animal类的实例对象了,而是指向了Dog这个类的一个实例对象了,
87 * 这里也就是父类对象的引用指向了子类的一个实例对象。
88 */
89 a = new Dog("bigyellow", "yellow");
90 System.out.println(a.name);//bigyellow
91 /**
92 * 这里的furColor属性是子类在继承父类的基础上新增加的一个属性,是父类没有的。
93 * 因此这里使用父类的引用对象a去访问子类对象里面新增加的成员变量是不允许的,
94 * 因为在编译器眼里,你a就是Animal类对象的一个引用对象,你只能去访问Animal类对象里面所具有的name属性,
95 * 除了Animal类里面的属性可以访问以外,其它类里面的成员变量a都没办法访问。
96 * 这里furColor属性是Dog类里面的属性,因此你一个Animal类的引用是无法去访问Dog类里面的成员变量的,
97 * 尽管你a指向的是子类Dog的一个实例对象,但因为子类Dog从父类Animal继承下来,
98 * 所以new出一个子类对象的时候,这个子类对象里面会包含有一个父类对象,
99 * 因此这个a指向的正是这个子类对象里面的父类对象,因此尽管a是指向Dog类对象的一个引用,
100 * 但是在编译器眼里你a就是只是一个Animal类的引用对象,你a就是只能访问Animal类里面所具有的成员变量,
101 * 别的你都访问不了。
102 * 因此一个父类(基类)对象的引用是不可以访问其子类对象新增加的成员(属性和方法)的。
103 */
104 //System.out.println(a.furColor);

