活动地址:CSDN21天学习挑战赛
目录
向下转型 与 关键字:instanceof
1,向下转型
有了对象的多态性后,内存中实际上加载了子类特有的属性和方法,但由于变量声明为父类类型导致编译时只能调用父类中声明的属性和方法。子类特有的属性和方法不能调用。
如何调用子类特有的属性和方法?
向下转型:使用强制类型转换符
例:Man m1 = (Man)p2;
2,关键字:instanceof
a instanceof A : 判断对象a是否是类A的实例,如果是返回true,如果不是返回false。
为了避免向下转型异常,先进行instanceof判断,返回true向下转型,返回false不向下转型
3,举例
父类
public class Person { String name ; int age; int id = 1001; public void eat() { System.out.println("吃饭"); } public void walk() { System.out.println("走路"); } }
子类
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("跑步"); } }
测试类
public class PersonTest { public static void main(String[] args) { Person p1 = new Man(); p1.name = "Tom"; //p1.earnMoney();//无法调用子类特有的方法 //使用instanceof关键字判断 if(p1 instanceof Man){ //向下转型:使用强制类型转换符 Man m1 = (Man)p1; m1.earnMoney(); } } }
**
向下转型的常见问题
1,编译时通过,运行时不通过
Person p3 = new Woman(); Man m3 = (Man)p3;
2,编译不过
Man m5 = new Dog( );
3,编译时通过,运行时也通过
Object object = new Woman(); Person p = (Person)object;
**
Object类
java.lang.Object类
1、Object类是所有Java的根父类
2、类中为使用extends关键字指明,则默认父类是java.lang.Object类
3、Object类中的功能具有通用性
4、Object类只声明了一个空参构造器
**
== 和 equals() 的区别
1,==
== 是运算符
1、可以使用在基本数据类型变量和引用数据类型变量中
2、如果比较的是基本数据类型,比较两个变量保存的数据是否相等。(类型不一定相等)
3、如果比较的是引用数据类型,比较两个对象的地址值是否相同,即两个引用是否指向同一个对象实体
2,equals( )
equals( ) 是一个方法,不是运算符
1、只能适用于引用数据类型
2、Object类中定义的equals()和 == 的作用是相同的,比较两个对象的地址值是否相同,即两个引用是否指向同一个对象实体
3、像String、Date、File、包装类等都重写了Object类中的equals()方法,重写以后比较的不是两个引用的地址是否相同,而是比较两个对象的"实体内容"是否相同。
5、通常情况下,我们自定义的类如果使用equals()的话,也通常比较两个对象的"实体内容"是否相同那么就需要对Object类中的equals()进行重写
3,重写equals( )
自定义的类使用equals()和==是相同的,如果想比较两个对象的"实体内容"是否相同那么就需要对Object类中的equals()进行重写
重写原则:比较两个对象的实体内容(即:name和age)是否相同
手动实现equals的重写
@Override public boolean equals(Object obj) { if (this == obj) { return true;//两个对象地址值相同 直接输出true } if (obj instanceof Customer) {//判断对象是否为Customer Customer cust = (Customer)obj;//强转 //比较两个对象的每个属性是否都相同 return this.age == cust.age && this.name.equals(cust.name); }else { return false; } }
提醒:在发布作品前请把不用的内容删掉(活动地址请保留)