Java面向对象特点之多态
多态的定义
定义: 即同一方法可以根据发送对象的不同而采用多做不同的行为方式。值得强调的是,一个对象的实际类型是确定的,但可以指向对象的引用的类型很多(父类,有关系的类)。
代码展示:
在Person父类中写入run();和eat();两个方法。
在Student类中继承Person类并重写父类的方法并且重写父类的方法。
在Test类运行
运行结果
看运行结果可知在经过子类对父类方法的重写之后,并没有运行父类的方法,而是运行子类的方法,在上一章总结过了,对于方法的重写子类和父类的方法名必须相同。
有此可总结:
①Student 能够调用的方法都是自己或者继承父类的!
②Person 父类型,可以指向子类,但不可以调用子类独有的方法
③对象可以执行的方法看指向的类型,主要看对象左边的类型,和右边的关系不大!
多态存在的条件
封装、继承、多态是一次相互递进关系的,而多态是最后学的,所以多态是在封装和继承之后的知识。而多态存在的条件:
①类与类之间有继承关系
②子类重写父类方法
③父类引用指向子类对象
注意:多态是方法的多态,属性没有多态
instanceOf关键字
Java的一个关键字,右边是类,左边是对象,返回值类型是boolean类型。
object instanceof Student使用instanceof 关键字如果返回值是true,说明object 对象为 instanceof Student的实例对象;反之则不是。
代码展示
public static void main(String[] args) {
// Object >String
// Object >Person>Student
Object object = new Student();
System.out.println(object instanceof Student);
System.out.println(object instanceof Person);
System.out.println(object instanceof Object);
System.out.println(object instanceof String);
}
当两个对象有关系的时候返回值就为true,将子类向父类转化。
这里总结一个公式 X instanceof Y ;如果编译为true着X,Y有父子类关系,反之没有。
在类之间进行转换,在有继承关系存在 子类直接转换为父类,不存在父类直接转换为子类,但是进行强转。在数据基础类型转换的时候我们学过double型转换为int型: double b = 46.5; int c = (int)b;
这里我们知道在类与类之间也可以转换。
但在Student里面写了一个go();方法,在使用Person的对象时候无法调用子类的方法。只能进行强转:
Student student = new Student();
student.go();
Person person = new Person();
((Student)person).go();
强转格式类似于基本数据类型转换:
((子类名)父类对象). 子类方法();
在基本数据类型转换的时候存在数据的丢失,同样在子类转换为父类可能会丢失子类本来的一些方法。
总结
1、多态总结
多态注意:
1、多态是方法的多态,属性没有多态。
2、父类和子类,有联系 类型转换异常! ClassCastException
3、存在条件:继承关系,方法需要重写,父类引用指向子类对象!
Father f1 = newSon();
对于一些不可以进行方法重写的是不存在多态。
1、static 方法,属于类,静态的,不属于实例。
2、final 常量:位于常量池里面。
3、private关键字修饰的方法。
2、instanceof总结
1、f父类引用子类的对象
2、把子类转换为父类,向上转型;
3、把父类转换为子类向下转型:强制转换
4、 好处:方便方法的调用,减少重复的代码;坏处:在强制转换过程会丢失一些子类的方法。