关键字instanceof

简介: 关键字instanceof

关键字instanceof

*有了对象的多态性以后,内存中实际上是加载了子类特有的属性和方法的,但是由于变量声明为父类类型,导致编译时,只能调用父类中声明的属性和方法。子类特有的属性和方法不能调用。
*如何才能调用子类所特有的属性和方法?

向下转型,使用强制类型转换符


Man m1 = (Man)p2;

m1.earnMoney();

m1.isSmoking=true;


*使用强转时,可能出现ClassCastException的异常。


Woman w1=(Woman)p2;

w1.goshopping();//Exception in thread “main” java.lang.ClassCastException: com.day0126_1.Man cannot be cast to com.day0126_1.Womanat com.day0126_1.PersonTest.main(PersonTest.java:61)


instanceof关键字的使用


a instanceof A:判断对象a是否是类A的实例。如果是,返回true;如果不是,返回false。

使用情境:为了避免在向下转型时出现ClassCastException的异常,我们在向下转型之前,先进行instanceof的判断,一旦返回true,就进行向下转型。如果返回false,不进行向下转型。




  • 如果a instanceof A返回true,则a instanceof B也返回true, 其中类B是类A的父类。

在B站学习java写的代码

代码如下

PersonTestl类

package com.day0126_1;
//import java.util.Date;
public class PersonTest {
  public static void main(String[] args) {
    //有了对象的多态性以后,内存中实际上是加载了子类特有的属性和方法的,但是由于变量声明为父类类型,导致
    //编译时,只能调用父类中声明的属性和方法。子类特有的属性和方法不能调用。
    //如何才能调用子类所特有的属性和方法?
    //向下转型,使用强制类型转换符
    Man m1 = (Man)p2;
    m1.earnMoney();
    m1.isSmoking=true;
    //使用强转时,可能出现ClassCastException的异常。
//    Woman w1=(Woman)p2;
//    w1.goshopping();//Exception in thread "main" java.lang.ClassCastException: com.day0126_1.Man cannot be cast to com.day0126_1.Womanat com.day0126_1.PersonTest.main(PersonTest.java:61)
    /*
     * instanceof关键字的使用
     *  
     * a instanceof A:判断对象a是否是类A的实例。如果是,返回true;如果不是,返回false。
     * 
     * 使用情境:为了避免在向下转型时出现ClassCastException的异常,我们在向下转型之前,先
     * 进行instanceof的判断,一旦返回true,就进行向下转型。如果返回false,不进行向下转型。
     * 
     * 如果a instanceof A返回true,则a instanceof B也返回true,
     * 其中类B是类A的父类。
     * 
     */
    if(p2 instanceof Woman) {
      Woman w1=(Woman)p2;
      w1.goshopping();
      System.out.println("*******Woman*****");
    }
    if(p2 instanceof Man) {
      Man m2 = (Man)p2;
      m2.earnMoney();
      System.out.println("********Man******");
    }
    if(p2 instanceof Person) {
      System.out.println("******Person******");
    }
        if(p2 instanceof Object) {
      System.out.println("******Object******");
    }
        //练习:
        //问题一:编译时通过,运行时不通过
        //举例一:
//        Person p3=new Woman();
//        Man m3 =(Man)p3;
        //举例二
//        Person p4=new Person();
//        Man m4=(Man)p4;
        //问题二:编译时通过,运行时也通过
//        Object obj=new Woman ();
//        Person p=(Person)obj;
        //问题三:编译不通过
//        Man m5=new Woman();//Type mismatch: cannot convert from Woman to Man
//        String str=new Date();//Type mismatch: cannot convert from Date to String
//        Object o=new Date();
//        String str1=(String)o;
  }
}

Person类

package com.day0126_1;
public class Person {
  String name;
  int age;
  int id=1001;
  public void eat() {
    System.out.println("人:吃饭");
  }
  public void walk() {
    System.out.println("人:走路");
  }
}

Man类

package com.day0126_1;
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("男人霸气的走路");
  }
}

Woaman类

package com.day0126_1;
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("女人窈窕的走路");
  }
}
相关文章
|
9天前
|
前端开发 JavaScript
|
3月前
|
存储 Java 编译器
关键字: final详解
掌握final关键字的使用对于Java程序员来说至关重要。它不仅能够提高程序的安全性和清晰性,还可以帮助编译器在一些情况下进行优化。恰当使用final可以使你的Java代码更加健壮、高效。
42 0
|
6月前
|
C#
29.C#关键字throw初步学习
29.C#关键字throw初步学习
78 0
|
6月前
|
Java
JavaSE基础篇:instanceof关键字
JavaSE基础篇:instanceof关键字
final 和 finally 关键字
final 和 finally 关键字
64 0
|
PHP 开发者
Return 关键字使用|学习笔记
快速学习 Return 关键字使用
Java 中 instanceof 关键字用法
Java 中 instanceof 关键字用法
131 0
Java 中 instanceof 关键字用法