引用与对象

  1. ADHero h = new ADHero();

h 是一个引用,它指向一个 ADHero 对象,他们的关系就类似于遥控器和具体的电视(可见 面向过程部分 章节中关于函数值传递的讲解)。

子类与父类的转换

子类转父类

汽车是车,白马是马,手机是电子设备……从特殊到一般,我们可以使用他们的特殊功能,但是我们同样可以使用他们的共性部分(因为子类本身已经包含了父类的所有属性和方法)

  1. public class Main {
  2. public static void main(String[] args) {
  3. Hero h = new Hero();
  4. ADHero ad = new ADHero();
  5. //类型转换指的是把一个引用所指向的对象的类型,转换为另一个引用的类型
  6. h = ad;
  7. }
  8. }

判断 A 能不能转成 B 很简单,只要问:A 是不是 B?是,那就可以转。

父类转子类

看情况,如果指向的这个子类刚好就是你想要转换的类型,就可以转换成功,否则会抛出 ClassCastException 异常。

  1. public class Main {
  2. public static void main(String[] args) {
  3. Hero h =new Hero();
  4. ADHero ad = new ADHero();
  5. Support s =new Support();
  6. h = ad;
  7. ad = (ADHero) h;//成功,因为h指向的对象就是ADHero
  8. h = s;
  9. ad = (ADHero) h;//失败,因为h指向的对象是Support
  10. }
  11. }

接口和实现类的转换

和父子类转换类似,此处不再赘述。

不同关系类的转换

语义语法都说不通,转不成。

运算符 instanceof

  1. public class Hero {
  2. public static void main(String[] args) {
  3. ADHero ad = new ADHero();
  4. APHero ap = new APHero();
  5. Hero h1= ad;
  6. Hero h2= ap;
  7. //判断引用h1指向的对象,是否是ADHero类型
  8. System.out.println(h1 instanceof ADHero);
  9. //判断引用h2指向的对象,是否是APHero类型
  10. System.out.println(h2 instanceof APHero);
  11. //判断引用h1指向的对象,是否是Hero的子类型
  12. System.out.println(h1 instanceof Hero);
  13. }
  14. }

语法为 A instanceof B 形式,值的类型为 boolean ,用于判断引用 A 指向的对象是不是 B 或者 B的子类型(子类或者实现类)。