Java基础语法53-向下转型
1.instanceof关键字使用
有了对象的多态性以后,内存中实际上是加载了子类特有的属性和方法的,但是由于变量声明为父类类型,导致编译时只能调用父类的属性和方法,而子类特有的属性和方法不能调用。
如何调用子类特有的属性和方法?
向下转型:强制类型转换
使用instanceof关键字避免转换时出现异常
package com.duotai;
public class PersonTest {
public static void main(String[] args) {
Person p = new Man();
if(p instanceof Man){
Man man = (Man)p;
man.eat();
man.earnMoney();
man.walk();
System.out.println("转换成功");
}
}
}
package com.duotai;
public class Person {
String name;
int age;
public void eat() {
System.out.println("人:吃饭");
}
public void walk(){
System.out.println("人:走路");
}
}
package com.duotai;
public class Man extends Person{
boolean isSmoking;
public void earnMoney(){
System.out.println("男人负责挣钱养家");
}
@Override
public void eat() {
System.out.println("男人多吃肉,长肌肉");
}
@Override
public void walk() {
System.out.println("男人霸气的走路");
}
}
2.向下转型的几个常见问题
问题1:编译时通过,运行时不通过
package com.duotai;
public class PersonTest {
public static void main(String[] args) {
//练习
//问题1:编译时通过,运行时不通过
Person p3 = new Woman();
Man man = (Man)p3;
}
}
这种情况要加instanceof去判断
问题2:编译时通过,运行时通过
package com.duotai;
public class PersonTest {
public static void main(String[] args) {
//练习
//问题1:编译时通过,运行时不通过
Person p3 = new Woman();
Man man = (Man)p3;
//问题2:编译时通过,运行时也通过
Object object = new Woman();
Person p = (Person)object;
}
}
问题3:编译时不通过
package com.duotai;
public class PersonTest {
public static void main(String[] args) {
//练习
//问题1:编译时通过,运行时不通过
Person p3 = new Woman();
Man man = (Man)p3;
//问题2:编译时通过,运行时也通过
Object object = new Woman();
Person p = (Person)object;
//问题3:编译时不通过,运行时不通过
Man man = new Woman();
}
}