解析java中的instanceof关键字
1 含义
用于判断对象是否是某个类的实例(实例化对象)
2 为什么用?
2.1 分析
在向下转型时,如果不是父子类关系的,编译是可以通过的,但是运行通不过,会出现ClassCastException(类型转换)异常,我们为了规避这个问题,一般会在向下转型前进行判断,判断该对象是否是要向下转型的那个类的实例,若是,才可以进行转换,否则不能向下转换
2.2 错误示例代码
Animal01
package Work;
public class Animal01 {
private String name;
//姓名
private int age;
//年龄
private String sex;
//性别
public Animal01() {
}
public Animal01(String name, int age, String sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
public void say(){
System.out.println("动物在说话!!!");
}
}
Cat01
package Work;
public class Cat01 extends Animal01{
public Cat01() {
}
public Cat01(String name, int age, String sex) {
super(name, age, sex);
}
@Override
public void say() {
System.out.println("喵喵喵!!!");
}
}
Dog01
package Work;
public class Dog01 extends Animal01{
public Dog01() {
}
public Dog01(String name, int age, String sex) {
super(name, age, sex);
}
@Override
public void say() {
System.out.println("汪汪汪!!!");
}
}
Test
package Work;
public class Test {
public static void main(String[] args) {
Animal01 animal01=new Dog01("旺财",12,"雄性");
//向下转型是想要用子类特有的属性和方法,只能是有父子关系的去进行转换
Cat01 d=((Cat01)animal01);
}
}
2.3 错误示例代码运行截图
3 如何使用instanceof关键字?
3.1 语法
对象 instanceof 类A;
//当对象是类A或者是类A的父类(直接、间接)的实例化对象(实例)时,才返回true
//否则返回false,注意匿名对象(new Dog())也是符合前面的判断规则
//当对象所指向的空间就是类A类型时.如new Cat() instanceof Cat是true
// new Cat() instanceof Animal也是true,
3.2 用途
3.2.1 用途1
a 内容
使用多态后,想要根据对象的不同,调用相同的方法去表现出不同形态(自己独特的)
b 示例代码
Animal01
package Work;
public class Animal01 {
private String name;
//姓名
private int age;
//年龄
private String sex;
//性别
public Animal01() {
}
public Animal01(String name, int age, String sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
public void say(Animal01 animal01){
if(animal01 instanceof Dog01){
//如果animal01对象是Dog01类的一个实例化对象时,就输出汪汪汪
System.out.println("汪汪汪");
}else if(animal01 instanceof Cat01){
//如果animal01对象是Cat01类的一个实例化对象时,就输出喵喵喵
System.out.println("喵喵喵");
}
}
}
Cat01
package Work;
public class Cat01 extends Animal01{
public Cat01() {
}
public Cat01(String name, int age, String sex) {
super(name, age, sex);
}
}
Dog01
package Work;
public class Dog01 extends Animal01{
public Dog01() {
}
public Dog01(String name, int age, String sex) {
super(name, age, sex);
}
}
Test
package Work;
public class Test {
public static void main(String[] args) {
Animal01 test=new Animal01();
Animal01 animal01=new Dog01("旺财",12,"雄性");
test.say(animal01);
Animal01 animal02=new Cat01("铃铛",8,"雌性");
test.say(animal02);
}
}
c 示例代码运行截图
3.2.2 用途2
a 内容
使用多态后,想要根据对象的不同,去执行自己特有的属性和方法(子类中有,父类中没有)
b 示例代码
Animal01
package Work;
public class Animal01 {
private String name;
//姓名
private int age;
//年龄
private String sex;
//性别
public Animal01() {
}
public Animal01(String name, int age, String sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public void action(Animal01 animal01){
if(animal01 instanceof Dog01){
//如果animal01对象是Dog01类的一个实例化对象时,就输出狗特有的方法
((Dog01)animal01).guardHourse();
}else if(animal01 instanceof Cat01){
//如果animal01对象是Cat01类的一个实例化对象时,就输出猫特有的方法
((Cat01)animal01).catchMouse();
}
}
}
Cat01
package Work;
public class Cat01 extends Animal01{
public Cat01() {
}
public Cat01(String name, int age, String sex) {
super(name, age, sex);
}
//Cat类型特殊的方法是抓老鼠
public void catchMouse(){
System.out.println("名字为: "+getName()+"年龄为: "+getAge()+"性别为: "+getSex()+"的猫在捉老鼠");
}
}
Dog01
package Work;
public class Dog01 extends Animal01{
public Dog01() {
}
public Dog01(String name, int age, String sex) {
super(name, age, sex);
}
//Dog类型特殊的方法是看门
public void guardHourse(){
System.out.println("名字为: "+getName()+"年龄为: "+getAge()+"性别为: "+getSex()+"的狗在看门");
}
}
Test
package Work;
public class Test {
public static void main(String[] args) {
Animal01 test=new Animal01();
Animal01 animal01=new Dog01("旺财",12,"雄性");
test.action(animal01);
Animal01 animal02=new Cat01("铃铛",8,"雌性");
test.action(animal02);
}
}
c 示例代码运行截图
3.3 记忆规则
对象 instanceof 类A,若对象指向的堆内存的开辟的空间的类型是A类型或者A类型的父类时,就返回true,否则返回false;