Java 语言的多态性机制导致了引用变量的声明类型和其实际引用对象的类型可能不一致,在结合虚方法调用规则可以得出下述结论:声明为同种类型的两个引用变量调用同一个方法时,也可能会有不同的行为。为更准确的鉴别一个对象的真正类型,java语言引入了instanceof操作符,其使用格式为:<引用类型变量>instanceof<引用类型>
这是boolean类型的表达式,当instanceof左侧的引用类型所引用的对象的实际类型是其右侧给出的类型或其子类类型时,整个表达式的结果为true,反之为false。
案例名称:instanceof关键字的使用
程序名称:InstanceOfTest.java- class Person2 extends Object{}
- class Student2 extends Person2{}
- class Worker extends Person2{}
- public class InstanceOfTest {
- public void method(Person2 e){
- if(e instanceof Person2){
- System.out.println("this is Students");
- }
- else if(e instanceof Worker){
- System.out.println("this is Worker");
- }
- else{
- System.out.println("this is a Person");
- }
- }
- public static void main(String[] args) {
- InstanceOfTest t=new InstanceOfTest();
- Worker w=new Worker();
- t.method(w);
- }
- }
复制代码 程序解释:InstanceOfTest类的method1方法,根据传入的不同对象确定调用不同的语句,java基本类型的相互转换,包括自动类型转换和强制类型转换机制,java引用类型数据也存在类似的机制。
○1默认类型转换:子类类型的数据可以直接赋值给父类类型的引用变量。
○2强制类型转换:也称为对象造型,父类类型的数据可以被强制转换为其子类的类型。造型的语法格式为:(子类类型)父类类型数据,使用方法如程序CastingTest.java所示。
案例名称:强制类型转换
程序名称:CastingTest.java- class Person3{
- String name;
- }
- class Student3 extends Person3{
- String school="pku";
- public String getSchool(){
- return school;
- }
- }
- public class CastingTest {
- public void method(Person3 e){
- //System.out.println(e.getSchool());//非法
- if(e instanceof Student3){
- Student3 me=(Student3)e;
- System.out.println(me.getSchool());
- }
- }
- public static void main(String[] args) {
- CastingTest t=new CastingTest();
- Student3 m=new Student3();
- t.method(m);
- }
- }
复制代码 程序解释:语句t.method(m)中的m是Student3的实例,method方法的参数“method(Person3e)”因此吗赋值给了Person3声明的变量。因此方法getSchool()没有在父类Person3中定义,因此不能直接调用,使用前需要竞夺强制转换。
强制转换是还需要注意一次额问题:
无继承关系的引用类型间的转换是非法的,编译时会出错;
并不是任意的父类类型数据都可以被造型为子类类型,在造型前可以使用instanceof操作符测试一个对象的类型,以避免运行是出错。
这写的挺不错的转来给你看看 |