Java学习—day08_多态和抽象类
多态
主观意识上的类别, 与客观存在的事物, 存在 is a
的关系的时候, 即形成了多态。
在程序中, 一个类的引用指向另外一个类的对象, 从而产生多种形态。 当二者存在直接或者
间接的继承关系时, 父类引用指向子类的对象, 即形成多态。
继承是多态的前提,如果类与类之间没有继承关系,也不会存在多态.
多态实现原理
- 多态:在代码中的描述是用父类的引用指向子类的对象
父子关系:Student extends Person Person extends Object
//直接父类的引用指向子类对象---多态
Person person = new Student();
//Object不是Student的直接父类,但是是间接父类,这里也是多态
Object o = new Student()
java
程序运行分成两个阶段:编译,运行
编译阶段:从打开程序到执行运行之前—只能识别=前面的引用类型,不会识别=后面的对象
运行阶段:从运行开始—识别=后面对象,对象开始干活儿
例如:Person person = new Student();
编译阶段识别: person 是Person类的引用
运行阶段识别:new出来的Student对象
- 动态机制:(了解)
类型:动态类型,动态绑定,动态加载
动态加载:我们在编译阶段不能确定具体的对象类型,只有到了运行阶段才能确定真正的干活儿
的对象.
多态就是典型的动态加载
- 在多态下只能直接调用父类有的方法,不能直接调用子类特有的方法?-----√
例如:下面代码中person不能直接调用run方法
工作机制:1.首先通过Person保存的地址找到Student对象 2.Student
对象再去调用run方法.
原因:在编译的时候识别的是引用类型,不识别对象.所以只能识别出Person里面的方法,而不能
直接调用子类特有的方法.
public class Demo4 {
public static void main(String[] args) {
//继承--使用的一定是子类
Student student = new Student();
student.show();
//多态:在代码中的描述就是用父类的引用指向子类的对象
Person person = new Student();
//可以调用,在show方法在父类Person里面
person.show();
//这里运行会报错,原因:在Person类里面找不到run方法
//person.run();
}
}
class Person{
String name;
public void show(){
System.out.println("show");
}
}
class Student extends Person{
int age;
public void run(){
System.out.println("run");
}
}
多态的优点【会】
可以提高代码的扩展性,使用之前定义好的功能,后面直接拿来使用,不用再创建新的方法.
public class Demo5 {
public static void main(String[] args) {
//创建狗,猫,动物对象
Dog dog = new Dog();
Cat cat = new Cat();
Animal animal = new Animal();
feedAnimal(animal);
// feedDog(dog);
// feedCat(cat);
feedAnimal(dog);
feedAnimal(cat);
}
//喂狗,喂猫,喂动物
public static void feedAnimal(Animal animal) {
//animal = dog = new Dog() 多态
animal.eat();
}
// public static void feedDog(Do