Java向上向下转型、向下转型关键字intanceof的使用

新建people类

   public interface People {   

   }

新建China类

public class China implements People {

   public String name;
   
   public China() {
   }
   public China(String name) {
       this.name = name;
   }
   public void getAge(){
       System.out.println("18");
   }

} 

新建Teacher 类

public class Teacher extends China {
     public String count;
     public Teacher() { 
     
     }    

     public Teacher(String count) {
     	    this.count = count;   
     }
     public void getCount(){
     System.out.println("3Billion");   
      }
     @Override    
     public void getAge(){
     System.out.println("17");    
     } 
     }

转型测试方法

public static void main(String[] args) {
  
          /**
           * 向上转型时会遗失子类自己特有的属性和方法
           */
          China chinaTeacher = new Teacher();
          China china = new China();
  
          //向上转型
          chinaTeacher.getAge();
  
          //安全的向下转型
          Teacher teacher = (Teacher) chinaTeacher;
          teacher.getCount();
          teacher.getAge();
  
          //不安全的向下转型
          //不安全的向下转型,编译不错,运行出错,
          Teacher teacher1 = (Teacher) china;
           //不安全的向下转型,编译不错,运行出错
          teacher1.getAge();
          //不安全的向下转型,编译不错,运行出错,
          teacher1.getCount();
      }

向下不安全的转型所抛出的异常

  Exception in thread "main" java.lang.ClassCastException: updowncast.China cannot be cast to updowncast.Teacher
  Disconnected from the target VM, address: '127.0.0.1:64964', transport: 'socket'
  	at updowncast.UpDownCastTest.main(UpDownCastTest.java:22)

向下转型 用instanceof 判断

public class InstanceOfTest {
  
      public static void main(String[] args) {
   /**
          result = object instanceof class
          参数:
          Result:布尔类型。
          Object:必选项。任意对象表达式。
          Class:必选项。任意已定义的对象类。
          说明:
          如果 object 是 class 的一个实例,则 instanceof 运算符返回 true。
          如果 object 不是指定类的一个实例,或者 object 是 null,则返回 false。
          但是instanceof在Java的编译状态和运行状态是有区别的:
          在编译状态中,class可以是object对象的父类,自身类,子类。在这三种情况下Java编译时不会报错。
          在运行转态中,class可以是object对象的父类,自身类,不能是子类。在前两种情况下result的结果为true,最后一种为false。但是class为子类时编译不会报错。运行结果为false
      */
          People teacherPeople = new Teacher();
          Teacher teacher = new Teacher();
  
          China china = new China();
          People chinaPeople = new China();
  
          //true
          System.out.println(teacher instanceof China);
  
          //true
          System.out.println(teacher instanceof People);
  
          //true
          System.out.println(chinaPeople instanceof People);
  
          //true
          System.out.println(chinaPeople instanceof China);
  
          //false
          System.out.println(china instanceof Teacher);
  
      }
  }
发布了22 篇原创文章 · 获赞 3 · 访问量 6757

猜你喜欢

转载自blog.csdn.net/weixin_39910081/article/details/88700305
今日推荐