面向对象特征之三:多态性
1、理解多态性:一个事物的多种形态
2、什么是多态性?
对象的多态性:父类的引用指向子类的对象(或子类的对象赋给父类的引用)
3、多态的使用:虚拟方法使用
有了对象的多态性以后,我们在编译期,只能调用父类中声明的方法,但在运行期,我们实际执行的是子类重写父类的方法。总结:编译看左边,运行看右边
4、多态的使用前提:①类的继承关系 ②方法的重写 ③父类引用指向子类对象
5、对象的多态性,只适用于方法,不适用于属性(编译和运行都看左边)
例子
package com.bytecode;
public class MyTest4 {
public void func(Animal animal){
animal.eat();
animal.shout();
}
public static void main(String[] args) {
MyTest4 test = new MyTest4();
test.func(new Dog());
}
}
class Animal{
int id = 1;
public void eat(){
System.out.println("动物:进食");
}
public void shout(){
System.out.println("动物:叫");
}
}
class Dog extends Animal{
int id = 2;
public void eat(){
System.out.println("狗:进食");
}
public void shout(){
System.out.println("狗:叫");
}
}
class Cat extends Animal{
int id = 3;
public void eat(){
System.out.println("猫:进食");
}
public void shout(){
System.out.println("猫:叫");
}
}
如果不能使用,则func方法就需要写成如下代码,非常不方便
public void func(Dog dog){
dog.eat();
dog.shout();
}
public void func(Cat cat){
cat.eat();
cat.shout();
}
静态解析:有些符号引用是在类加载阶段或是第一次使用时就会转换成直接引用,这种转换叫做静态解析;
动态链接:另外一些符号引用则是在每次运行期转换为直接引用,这种转换叫做动态链接
面试题:
多态是编译时行为还是运行时行为?如何证明?
运行时行为
package com.bytecode;
import java.util.Random;
public class MyTest4 {
public static Animal getInstance(int key){
switch (key){
case 0 :
return new Cat();
default:
return new Dog();
}
}
public static void main(String[] args) {
int key = new Random().nextInt(2);
Animal animal = getInstance(key);
animal.eat();
}
}
class Animal{
int id = 1;
public void eat(){
System.out.println("动物:进食");
}
public void shout(){
System.out.println("动物:叫");
}
}
class Dog extends Animal{
int id = 2;
public void eat(){
System.out.println("狗:进食");
}
public void shout(){
System.out.println("狗:叫");
}
}
class Cat extends Animal{
int id = 3;
public void eat(){
System.out.println("猫:进食");
}
public void shout(){
System.out.println("猫:叫");
}
}
重载与重写的区别?
1、二者的定义
2、从编译和运行的角度看
重载,是指允许存在多个同名方法,而这些方法的参数不同。编译器根据方法不同的参数表,对同名方法的名称做修饰,这些同名方法是不同的方法,因此是调用地址是直接使用,因此是静态解析
而重写在多态调用重写的方法时,只有等到方法调用的那一刻,才会确定所要调用的具体方法(直接引用),因此是动态链接
网友评论