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