java多态
测试一:成员变量:编译时期向左看,运行时也向左看
测试二:成员方法:编译时期向左看,运行时期向右看
什么是多态呢?
多态可以理解为是同一个方法由于发送对象的不同而执行不同的行为方式。
一个对象的实际类型是确定的,但是引用类型是不确定的。
举个例子:
new Student();//这个对象的实际类型就是学生类
Student s1 = new Student();//学生类型的引用指向了这个学生对象
Person s2 = new Studnet();//人类型的引用指向了,这个学生对象
这也就是我们常说的父类的引用指向了子类的对象(注意:这里一定得是父类的引用才能指向子类的对象,不存在继承关系的类,是不能实现多态的)
多态是方法的多态,不是属性的多态
多态是同一个方法由于发送对象的不同,而执行的行为不同,这就是多态。
多态存在的条件:
从上面的叙述我们不难看出,多态的条件有哪些:
有继承关系
子类重写了父类的引用
分类的应用指向了子类对象
不同的引用实现的,指向的对象是不同的
new Student();//这个对象的实际类型就是学生类
Student s1 = new Student();//学生类型的引用指向了这个学生对象
Person s2 = new Studnet();//人类型的引用指向了,这个学生对象
/*
s1 可以调用person类中的方法(由于s1继承的person类),也可以调用自身的方法,如果s1中重写了person类中的方法,那么执行的时候,s1执行,重写方法的行为。
s2 可以调用peroson类中的方法,但是不能调用student类中的方法。(也就是我们常说的父类不能调用,子类中特有的方法)。如果,子类重写了父类的方法,在执行的时候,会执行重写方法的行为。
可以简单的总结为:编译看左边,运行看右边。
什么样的方法不能被重写:
static修饰的方法(static修饰的方法是静态方法,属于类,不属于实例)
final修饰的方法
private修饰的方法
多态引用在什么地方呢?
1.多态数组的使用,数组定义为父类型,但是,实际为子类型
2.方法定义的形参为父类型,但是实际参数,可以是子类型
多态的好处:
提高了代码的维护性(继承)
提高了代码的拓展性(多态)
提高了代码的安全性(将对象进行了隐藏,不对外暴露)
class Animal{
// 如果父类中没有call方法,那么子类中也不能调用该方法,编译时会出错
public void call(){
System.out.println("动物再叫。。。。。。。。");
}
}
class Dog extends Animal{
public void call() {
System.out.println("狗在叫。。。。。。。");
}
}
/**
* 要实现多态,需要满足以下条件
* 1.要有继承关系
* 2.方法的重写
* 3.要有父类的引用指向子类对象
*/
public class Study_DuoTai {
public static void main(String[] args) {
// 父类引用指向子类对象
Animal a1 = new Dog();
a1.call();
}
}