instanceof和类型转换
-
-
代码如下:
package oop.demo01.demo07;
public class Application {
public static void main(String[] args) {
//Object>String
//Object>Person>Teacher
//Object>Person>Student
Object object = new Student();
//System.out.println(x instanceof y);x与y是否存在父子关系,不存在的话,编译会报错;编译正常后,看结果的true和 false,看变量x所指的实际类型是否是y的子类型,如果x所指的实际类型Student和y有关系(在一条分支上),结果为true。
System.out.println(object instanceof Student); //true
System.out.println(object instanceof Person); //true,满足父子关系,而且是这个类型,所以为true。因为是new Student();,所以看Student类与那些类是否存在父子关系。
System.out.println(object instanceof Object); //true,前三个因为都是new Student();的对象,都属于从Object到Student的这条分支内部,所以与类型有关,是true.
System.out.println(object instanceof Teacher); //false,object属于从Object到Student的这条分支内部,不属于从Object到Teacher的这条分支内部,开头部分重叠无效,所以无关,是false。
System.out.println(object instanceof String); //false,object不属于从Object到String的这条分支内部。
Person person = new Student();
System.out.println(person instanceof Student); //true
System.out.println(person instanceof Person); //true
System.out.println(person instanceof Object); //true
//System.out.println(person instanceof String); //Person和String属于同级别的,毫无关系,都在Object下面,所以这两者不能进行比较和转化的。两个对象之间有一点联系才可以,string和person完全属于不同的分支,所以编译会报错。
System.out.println(person instanceof Teacher); //false
Student student = new Student();
System.out.println(student instanceof Student); //true
System.out.println(student instanceof Person); //true
System.out.println(student instanceof Object); //true
//System.out.println(student instanceof String); //编译报错
//System.out.println(student instanceof Teacher); //编译报错,同级别,不是一个分支,编译就会报错。
}
}
类型转换
package oop.demo01.demo07;
public class Application {
public static void main(String[] args) {
//类型之间的转换: 父类(高) 子类(低) 基本类型转换(从高64位到低8位需要强制转换,从低到高自动转换)
//高类型(类似double) 低类型(类似char) 从低转高自动转,不需要强制转换
Person person = new Student();
//person.go(); //Person类中没有go方法,不能调用子类中的方法,所以会报错。
((Student)person).go(); //想调用低类型Student中的方法,需要把这个对象从高类型强制往低类型转,然后才能用低类型中的方法。(与基本类型强制转换类似)
//将student这个对象转换为Student这个类型,我们就可以使用Student类型的方法了。
Student person1 = (Student) person;
person1.go();
//子类转换为父类,可能丢失自己本来的一些方法。(低转高)
Student student = new Student();
student.go();
Person s1 = student; //低类型转高类型,自动转。
//s1.go(); //会报错,丢失了Student类中的方法go();
}
}
/*
1.父类引用指向引用的对象。 存在条件。
2.把子类转换为父类,向上转型,自动。
3.把父类转换为子类,向下转型,强制转换。
4.方便方法的调用,减少重复的代码,简洁。
5.抽象:核心思想。 封装,继承,多态。抽象类更加抽象,在类往上抽象。接口,比抽象类还要抽象。
*/
代码二:
package oop.demo01.demo07;
public class Student extends Person{
public void go(){
System.out.println("go");
}
}
代码三:
package oop.demo01.demo07;
public class Person {
public void run(){
System.out.println("run");
}
}