关键字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("女人窈窕的走路");
  }
}
相关文章
|
27天前
|
UED
throw和catch关键字的作用。
`throw` 和 `catch` 关键字在异常处理机制中起着至关重要的作用。`throw` 用于抛出异常,而 `catch` 用于捕获并处理异常。通过正确使用这些关键字,可以编写更加健壮和可靠的代码,提升程序的容错能力和稳定性。掌握异常处理机制是编写高质量软件的必备技能。
47 4
|
8月前
|
Java
instanceof是什么~
instanceof是什么~
|
8月前
|
C#
29.C#关键字throw初步学习
29.C#关键字throw初步学习
102 0
|
8月前
|
Java
JavaSE基础篇:instanceof关键字
JavaSE基础篇:instanceof关键字
|
Java 编译器 C#
C#中的override和new关键字
在 C# 中,派生类可以包含与基类方法同名的方法。 基类方法必须定义为 virtual。 如果派生类中的方法前面没有 new 或 override 关键字,则编译器将发出警告,该方法将有如存在 new 关键字一样执行操作。 如果派生类中的方法前面带有 new 关键字,则该方法被定义为独立于基类中的方法。 如果派生类中的方法前面带有 override 关键字,则派生类的对象将调用该方法,而不是调用基类方法。 可以从派生类中使用 base 关键字调用基类方法。
82 1
|
Java
关键字abstract
关键字abstract
66 0
final 和 finally 关键字
final 和 finally 关键字
69 0
|
PHP 开发者
Return 关键字使用|学习笔记
快速学习 Return 关键字使用