大家好,我是卷心菜,可以叫我菜菜(名副其实了属于是,哈哈~),大二学生一枚。本篇主要讲解Java向上转型和向下转型的区别以及instanceof关键字的使用。如果您看完文章有所收获,可以三连支持博主哦~,嘻嘻。
一、入门理解
向上转型
:即父类的引用指向子类的对象,此时该引用无法调用子类的成员变量和方法。向下转型
:通过类似于(int)double
的强制转换,恢复对成员变量和方法的使用。
向上转型解析图:
向下转型解析图:
向上向下转型,可以简单理解为:
二、功能作用
向下转型,那么这样有什么作用呢?
其实,无论是向上转型还是向下转型都是为了让类的使用范围和适用范围发生变化,以便操作不同范围的变量或者方法。这样其实就是一个java的继承多态,利于程序扩展.。我们需要这种设计方式,才会写出更易维护、简洁的代码。
三、代码举例
先写一个父类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关键字~
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);
运行结果:
感谢阅读,一起进步,嘻嘻~