我们在上一篇文章中了解到了java比较重要的特性多态,本篇文章,承接上一篇文章中的伏笔,一起来了解一下instanceof类型转换,引用类型之间的转换😀。
1、我们先创建三个类,人类,老师类,学生类,并在人类中写出一个run方法。
package oop.Demo08;
//Person
public class Person
{
public void run()
{
System.out.println("run");
}
}
package oop.Demo08;
//Student
public class Student extends Person
{
}
package oop.Demo08;
//Teacher
public class Teacher extends Person
{
}
2、我们用main方法,来使用一下instanceof。
import oop.Demo08.Student;
import oop.Demo08.Teacher;
public class Application {
public static void main(String[] args)
{
//Object > String
//Object > Person > Teacher
//Object > Person > Student
Object object = new Student();
System.out.println(object instanceof Object);
System.out.println(object instanceof Person);
System.out.println(object instanceof Student);
System.out.println(object instanceof Teacher);
System.out.println(object instanceof String);//因为Object和String有联系
}
}
我们执行以下代码,会看到以下的结果。
true
true
true
false
false
因为instanceof是判断是否存在父子类关系,我们的Teacher,和学生类是平级,所以不存在关系,String类型是引用类型,也不能作为关系的对比,就像猫不等于狗。
import oop.Demo08.Student;
import oop.Demo08.Teacher;
public class Application {
public static void main(String[] args)
{
//Object > String
//Object > Person > Teacher
//Object > Person > Student
Person person = new Student();
System.out.println(person instanceof Object);
System.out.println(person instanceof Person);
System.out.println(person instanceof Student);
System.out.println(person instanceof Teacher);
//System.out.println(person instanceof String);//没有关联,编译器会报错
}
}
true
true
true
false
我们再来看一个Student对象。
import oop.Demo08.Student;
import oop.Demo08.Teacher;
public class Application {
public static void main(String[] args)
{
//Object > String
//Object > Person > Teacher
//Object > Person > Student
Student student = new Student();
System.out.println(student instanceof Object);
System.out.println(student instanceof Person);
System.out.println(student instanceof Student);
//System.out.println(student instanceof Teacher);//没有关联,编译器会报错
//System.out.println(person instanceof String);//没有关联,编译器会报错
}
}
true
true
true
我们在Student类中,写一个go方法,现在的Student类中有自己的go方法和父类的run方法。
package oop.Demo08;
public class Student extends Person
{
public void go()
{
System.out.println("go");
}
}
我们之前了解过,基本类型转换,由高转低,需要强转,但是低转高,不需要强转。
类型之间的转化:父子转换
父比子高,所以不需要强制转换。
public class Application {
public static void main(String[] args)
{
Person person = new Student();//Person类型
}
}
但是我们想使用学生类中的go方法,由于学生类是低类型,Person是高类型,所以需要强制转换。
public class Application {
public static void main(String[] args)
{
Person person = new Student();//Person类型
((Student) person).go();
}
}
也可以用下面的方法,清晰一些。
public class Application {
public static void main(String[] args)
{
Person person = new Student();
Student student=(Student) person;
student.go();
}
}
public class Application {
public static void main(String[] args)
{
Student student = new Student();
Person person=student;
}
}