对象转化和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。
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();