Java多态(重写与绑定)

重写:

如果子类的方法覆盖了父类的方法,我们也说父类的那个方法在子类有了新的版本或者新的实现。覆盖的新版本具有与老版本相同的方法签名:相同的方法名称和参数表。因此,对于外界来说,子类并没有增加新的方法,仍然是在父类中定义过的那个方法。不同的是,这是一个新版本,所以通过子类的对象调用这个方法,执行的是子类自己的方法。

覆盖关系并不说明父类中的方法已经不存在了,而是当通过一个子类的对象调用这个方法时,子类中的方法取代了父类的方法,父类的这个方法被“覆盖”起来而看不见了。而当通过父类的对象调用这个方法时,实际上执行的仍然是父类中的这个方法。

注意我们这里说的是对象而不是变量,因为一个类型为父类的变量有可能实际指向的是一个子类的对象。
对于Java来说 子类对父类的方法进行覆盖(方法重写)时,要遵循里氏替换原则;
1.重写方法的方法名和参数类型个数必须与被重写方法的方法名和参数类型个数相同
2.重写的方法的访问权限不得严格于被重写方法
3.重写方法不得抛出被重写方法异常的父类
4.子类与父类中出现相同静态方法不能被叫做重写
5.构造方法、私有方法和final 修饰的方法不能被重写
6.子类必须覆盖父类中声明为abstract的方法,或者子类也必须声明为abstract

绑定:

当调用一个方法时,究竟应该调用哪个方法,这件事情叫做绑定。

绑定表明了调用一个方法的时候,我们使用的是哪个方法。绑定有两种:一种是早绑定,又称静态绑定,这种绑定在编译的时候就确定了;另一种是晚绑定,即动态绑定。动态绑定在运行的时候根据变量当时实际所指的对象的类型动态决定调用的方法。Java缺省使用动态绑定。

以下哪些赋值是合规则的?

/*假设现有4个类:Person、Teacher、Student和PhDStudent。
Teacher 和Student都是Person的子类,PhDStudent是Student的子类。以下的赋值语句哪些是合法的,为什么?:*/

Person p1 = new Student(); 
Person p2 = new PhDStudent();
PhDStudent phd1 = new Student();
Teacher t1 = new Person();
Student s1 = new PhDStudent();
s1 = p1;
s1 = p2;
P1 = s1;
t1 = s1;
s1 = phd1;
Phd1 = s1;
posted @ 2020-12-16 15:14  margusd  阅读(137)  评论(0)    收藏  举报