大家好,我是卷心菜,可以叫我菜菜(名副其实了属于是,哈哈~),大二学生一枚。本篇主要讲解Java向上转型和向下转型的区别以及instanceof关键字的使用。如果您看完文章有所收获,可以三连支持博主哦~,嘻嘻。
文章目录
一、入门理解
向上转型:即父类的引用指向子类的对象,此时该引用无法调用子类的成员变量和方法。向下转型:通过类似于(int)double的强制转换,恢复对成员变量和方法的使用。
向上转型解析图:
 
 向下转型解析图:
 
 向上向下转型,可以简单理解为:
 
二、功能作用
向下转型,那么这样有什么作用呢?
三、代码举例
先写一个父类Person:
public class Person {
    String name;
    int age;
    int id = 1001;
    public void eat(){
        System.out.println("人:吃饭");
    }
    public void walk(){
        System.out.println("人:走路");
    }
}
 
接着写两个子类Man和Woman:
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("男人霸气的走路");
    }
}
 
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("女人窈窕的走路");
    }
}
 
public class PersonTest {
	public static void main(String[] args) {
	    Person person1 = new Person();
        Person person2 = new Man();
        Person person3 = new Woman();
        
        //编译时通过,运行时不通过
//      Man man1 = (Man) person1;
//      Man man2 = (Man) person3;
//		Object o = new Date();
//		String s = (String)o;
        //编译时通过,运行时也通过
//		Object obj = new Woman();
//		Person p = (Person)obj;
        //编译不通过
//		Man m = new Woman();
	}
}
 
四、特点介绍
-  
父类引用对象指向的是子类对象,那么在向下转型的过程中是安全的,编译是不会出错误。但是如果父类引用对象是父类本身,那么在向下转型的过程中是不安全的,编译不会出错,但是运行时会出现 Java 强制类型转换异常
 -  
有了对象的多态性以后,内存中实际上是加载了子类特有的属性和方法的,但是由于变量声明为父类类型,导致编译时,只能调用父类中声明的属性和方法。子类特有的属性和方法不能调用。
 -  
如何才能调用子类特有的属性和方法?向下转型:使用强制类型转换符,向下转型可以调用子类类型中所有的成员。
 -  
使用强转时,可能出现ClassCastException的异常。
 
五、instanceof的使用
instanceof关键字的使用:
-  
a instanceof A:判断对象a是否是类A的实例。如果是,返回true;如果不是,返回false。
 -  
使用情境:为了避免在向下转型时出现ClassCastException的异常,我们在向下转型之前,先进行instanceof的判断,一旦返回true,就进行向下转型。如果返false,不进行向下转型。
 -  
如果 a instanceof A返回true,则 a instanceof B也返回true;其中,类B是类A的父类。
 
        if (person2 instanceof Person)
            System.out.println(1);
        if (person2 instanceof Man)
            System.out.println(2);
        if (person2 instanceof Woman)
            System.out.println(3);
        if (person2 instanceof Object)
            System.out.println(4);
 
运行结果:
 
感谢阅读,一起进步,嘻嘻~










