JAVA程序设计--继承和多态(三)

对象转化和instanceof运算符

上一节中可知:对象的引用科类型转化为对另外一种对象的引用,

这称为:对象转化~


两个问题将隐式和显式转换(casting)

①Object o = new Student(); 为什么是合法的?

因为Student的实例也是Object的~所以可将new Student()赋值给Object类型的参数。


②Student b = o;为什么报错?

因为o是哪个类的对象编译器不知道。

修改:Student b = (Student)o;


       总是可以将一个子类的实例转化为一个父类的变量,称为向上转换(upcasting),

因为子类的实例永远是它的父类的实例。

       当把一个父类的实例转换为它的子类变量,称为向下转换(downcasting),

必须用转换记号"(子类名)",向浏览器表示你的意图。


转换前为确保父类对象是子类的一个实例(多态所做就是这个),需要用到:instanceof运算符

用法: 
result = object instanceof class 
参数: 
Result:布尔类型。 
Object:必选项。任意对象表达式。 
Class:必选项。任意已定义的对象类。 
说明: 
如果 object 是 class 的一个实例,则 instanceof 运算符返回 true。如果 object 不是指定类的一个实例,或者 object 是 null,则返回 false。

上一节代码改进:

package test;

public class Test2 {
  public static void main(String[] args) {
	Object o = new GraduateStudent(); // implicit casting
	
	Object o1 = new Object();
	
	if (o1 instanceof GraduateStudent) {
	  System.out.println("Never got here");
	}
	
	else { m(o);
    m(new Student());
    m(new Person());
    m(new Object());
  }
  }
  public static void m(Object x) {
    System.out.println(x.toString());
  }
}

class GraduateStudent extends Student {
}

class Student extends Person {
  public String toString() {
    return "Student";
  }
}

class Person extends Object {
  public String toString() {
    return "Person";
  }
}

o1是object类但不是GraduateStudent类,所以程序跳到了else

如果if是去判断o instanceof object或者GraduateStudent,都对,那就执行输出语句~


ps:为了能进行通用程序设计,一个好的经验是把变量定义为父类型。这样,它就可以接受任何子类型的值。



实例:

package test;

public class CastingDemo {
  /** Main method */
  public static void main(String[] args) {
    // Create and initialize two objects
    Object object1 = new CircleFromSimpleGeometricObject(1);
    Object object2 = new RectangleFromSimpleGeometricObject(1, 1);

    // Display circle and rectangle
    displayObject(object1);
    displayObject(object2);
  }

  /** A method for displaying an object */
  public static void displayObject(Object object) {
    if (object instanceof CircleFromSimpleGeometricObject) {
      System.out.println("The circle area is " +
        ((CircleFromSimpleGeometricObject)object).getArea());
      System.out.println("The circle diameter is " +
        ((CircleFromSimpleGeometricObject)object).getDiameter());
    }
    else if (object instanceof 
                  RectangleFromSimpleGeometricObject) {
      System.out.println("The rectangle area is " +
        ((RectangleFromSimpleGeometricObject)object).getArea());
    }
  }
  
}

用圆括号保证在点运算符之前进行转换!!!

例如:

ps:对象成员访问运算符(.)优先于类型转换运算符,使

((Circle)object).getArea();

猜你喜欢

转载自blog.csdn.net/qq_35827280/article/details/80385189