关键字instanceof
*有了对象的多态性以后,内存中实际上是加载了子类特有的属性和方法的,但是由于变量声明为父类类型,导致编译时,只能调用父类中声明的属性和方法。子类特有的属性和方法不能调用。
*如何才能调用子类所特有的属性和方法?
向下转型,使用强制类型转换符
Man m1 = (Man)p2;
m1.earnMoney();
m1.isSmoking=true;
*使用强转时,可能出现ClassCastException的异常。
Woman w1=(Woman)p2;
w1.goshopping();//Exception in thread “main” java.lang.ClassCastException: com.day0126_1.Man cannot be cast to com.day0126_1.Womanat com.day0126_1.PersonTest.main(PersonTest.java:61)
instanceof关键字的使用
a instanceof A:判断对象a是否是类A的实例。如果是,返回true;如果不是,返回false。
使用情境:为了避免在向下转型时出现ClassCastException的异常,我们在向下转型之前,先进行instanceof的判断,一旦返回true,就进行向下转型。如果返回false,不进行向下转型。
如果a instanceof A返回true,则a instanceof B也返回true, 其中类B是类A的父类。
在B站学习java写的代码
代码如下
PersonTestl类
package com.day0126_1; //import java.util.Date; public class PersonTest { public static void main(String[] args) { //有了对象的多态性以后,内存中实际上是加载了子类特有的属性和方法的,但是由于变量声明为父类类型,导致 //编译时,只能调用父类中声明的属性和方法。子类特有的属性和方法不能调用。 //如何才能调用子类所特有的属性和方法? //向下转型,使用强制类型转换符 Man m1 = (Man)p2; m1.earnMoney(); m1.isSmoking=true; //使用强转时,可能出现ClassCastException的异常。 // Woman w1=(Woman)p2; // w1.goshopping();//Exception in thread "main" java.lang.ClassCastException: com.day0126_1.Man cannot be cast to com.day0126_1.Womanat com.day0126_1.PersonTest.main(PersonTest.java:61) /* * instanceof关键字的使用 * * a instanceof A:判断对象a是否是类A的实例。如果是,返回true;如果不是,返回false。 * * 使用情境:为了避免在向下转型时出现ClassCastException的异常,我们在向下转型之前,先 * 进行instanceof的判断,一旦返回true,就进行向下转型。如果返回false,不进行向下转型。 * * 如果a instanceof A返回true,则a instanceof B也返回true, * 其中类B是类A的父类。 * */ if(p2 instanceof Woman) { Woman w1=(Woman)p2; w1.goshopping(); System.out.println("*******Woman*****"); } if(p2 instanceof Man) { Man m2 = (Man)p2; m2.earnMoney(); System.out.println("********Man******"); } if(p2 instanceof Person) { System.out.println("******Person******"); } if(p2 instanceof Object) { System.out.println("******Object******"); } //练习: //问题一:编译时通过,运行时不通过 //举例一: // Person p3=new Woman(); // Man m3 =(Man)p3; //举例二 // Person p4=new Person(); // Man m4=(Man)p4; //问题二:编译时通过,运行时也通过 // Object obj=new Woman (); // Person p=(Person)obj; //问题三:编译不通过 // Man m5=new Woman();//Type mismatch: cannot convert from Woman to Man // String str=new Date();//Type mismatch: cannot convert from Date to String // Object o=new Date(); // String str1=(String)o; } }
Person类
package com.day0126_1; public class Person { String name; int age; int id=1001; public void eat() { System.out.println("人:吃饭"); } public void walk() { System.out.println("人:走路"); } }
Man类
package com.day0126_1; public class Man extends Person{ boolean isSmoking; int id=1002; public void earnMoney() { System.out.println("男人负责挣钱养家"); } public void eat() { System.out.println("男人多吃肉,长肌肉"); } public void walk() { System.out.println("男人霸气的走路"); } }
Woaman类
package com.day0126_1; public class Woman extends Person{ boolean isBeauty; public void goshopping() { System.out.println("女人喜欢购物"); } public void eat() { System.out.println("女人少吃,为了减肥"); } public void walk() { System.out.println("女人窈窕的走路"); } }