一.向上转型和向下转型
(1)向上转型
1,什么是多态性(向上转型)
可以理解为一个事物的多种状态,父类引用指向字类的对象(或子类对象赋给父类使用)
2,多态的使用
当调用子父类同名同参数的方法时,实际执行的是子类重写父类的方法,这种方法叫------虚拟方法调用
调用的时候只能调用父级的对象,调用子类对象是会报错
3,多态的使用:虚拟方法调用
有了对象的多态性以后,我们在编译期,只能调用父类中声明的方法,但是运行期,我们实际执行的是子类重写父类的方法
总结:编译看左边;运行:看右边
4,多态性的使用前提
1,类的继承性;
2,方法的重写;
5,对象的多态性:只适用于方法,不适用于属性(编译和运行都看左边)
(2)向下转型
1,认识向下转型
向下转型不能调用子类特殊所有的方法、属性。有了对象的多态性以后,内存中实际上是加载了子类特有的属性和方法,但是由于变量声明为父类类型,导致编译时,只能调用父类声明的属性和方法。子类特有的属性和方法不能调用。
2,如何才能调用子类特有的属性和方法
对对象进行强转
(3)instanceof关键字的使用
a instanceop A:判断对象a是否是A的示例,如果是,返回true,如果不是返回false
使用情境。为了避免在向下转型时出现ClasscastException的异常,我们在向下转型之前,先进行instanceof的判断,一旦返回true,就进行向下转型。如果返回false,不进行向下转型。
如果a instanceofA返回true,则 a instanceofB也返回true.其中,类B是类A的父类。
(4)练习
package com.atguigu.exer;
/*
* 练习:
* 1.若子类重写了父类方法,就意味着子类里定义的方法彻底覆盖了父类里的同名方法,
* 系统将不可能把父类里的方法转移到子类中:编译看左边,运行看右边
*
* 2.对于实例变量则不存在这样的现象,即使子类里定义了与父类完全相同的实例变量,
* 这个实例变量依然不可能覆盖父类中定义的实例变量:编译运行都看左边
*
*
*
*
*/
class Base {
int count = 10;
public void display() {
System.out.println(this.count);
}
}
class Sub extends Base {
int count = 20;
public void display() {
System.out.println(this.count);
}
}
public class FieldMethodTest {
public static void main(String[] args) {
Sub s = new Sub();
System.out.println(s.count);//20
s.display();//20
Base b = s;//多态性
//==:对于引用数据类型来讲,比较的是两个引用数据类型变量的地址值是否相同
System.out.println(b == s);//true
System.out.println(b.count);//10
b.display();//20,对象的多态性:只适用于方法,不适用于属性(编译和运行都看左边)
}
}
二,Object类中toString()使用
1,概念
当我们输出一个对象引用时,实际上就是调用当前对对象的toString()方法
2,Object类中toString()的定义
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
3.默认重写了toString的属性
像String、Date、File、包装类等都重写了Object类中的toString()方法。使得在调用对象的toString()时,返回"实体内容"信息
自定义类也可以重写toString()方法,当调用此方法时,返回对象的"实体内容"