instanceof和类型转换

instanceof

  1. 判断一个对象是什么类型,判断两个类之间是否存在父子关系。

  2. 代码如下:

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");
  }
}

 

posted @ 2021-02-02 17:04  爱罗翔的张三  阅读(170)  评论(0编辑  收藏  举报