-
理解多态性:可以理解为一个事物的多种形态;
-
何为多态性:对象的多态性,父类的引用指向子类的对象(或子类的对象赋给父类的引用);
-
多态的使用:有了对象的多态性以后,我们在编辑期,只能调用父类中声明的方法,但在运行期,我们实际执行的是子类重写父类的方法。总结:编译看左,运行看右;
-
多态性的使用前提:(1)类的继承关系;
(2)方法的重写;
- 对象的多态性,只适用于方法,不适应于属性(编译和运行都看左边);
虚拟方法调用(Virtual Method Invocation)
- 正常的方法调用
Person e = new Person();
e.getInfo();
Student e = new Student();
e.getInfo();
- 虚拟方法调用(多态情况下):子类中定义了与父类同名同参数的方法,在多态情况下,将此时父类的方法称为虚拟方法,父类根据赋给它的不同子类对象,动态调用属于子类的方法。这样的方法调用在编辑期是无法确定的;
Person e = new Student();
e.getInfo(); //调用Student类的getInfo()方法
- 编译时类型和运行时类型:编译时e为Person类。而方法的调用是在运行时确定的,所以调用的是Student类的getInfo()方法;--------动态绑定
- instanceof操作符
- x instanceof A :检验x是否为A类的对象,返回值为double型;
- 要求x所属的类与类A必须是子类和父类的关系,否则编译错误;
- 如果x属于类A的子类B,x instanceof A值也为true;
public class Person extends Object(...)
public class Student extends Person(...)
public class Graduate extends Person(...)
//********************************
public void method1(Person e){
if(e instanceof Person)
//处理Person类及其子类对象
if(e instanceof Student)
//处理Student类及其子类对象
if(e instanceof Graduate)
//处理Graduate类及其子类对象
}
- 子类继承父类
- 若子类重写了父类的方法,就意味着子类里定义的方法彻底覆盖了父类里的同名方法,系统将不可能把父类里的方法转移到子类中;
- 对于实例变量则不存在这样的现象,即使子类里定义了与父类完全相同的实例变量,这个实例变量依然不可能覆盖父类中定义的实例变量;
- java.lang.Object类
- Object类是所有Java类的根父类;
- 如果在类的声明中未使用extends关键字指明其父类,则默认父类为Java.lang.Object类;
- Object类中的功能(属性、方法)就具有通用属性;
- Object类只声明了一个空参构造器;
- toString( )方法
- toString()方法在Object类中定义,其返回值是String类型,返回类名和它的引用地址;
- 在进行String与其它类数据的连接操作时,自动调用toString()方法;
Date now = new Date();
System.out.println("now="+now);//相当于System.out.println("now="+now.toString());
- 可以根据需求在用户自定义类型中重写toString()方法;如String类重写了toString()方法,返回字符串的值;
- 基本类型数据转换为String类型时,调用了对应包装类的toString()方法