多态
基本介绍
多态的前提是:两个对象(类)存在继承关系
方法或对象具有多种形态,是面向对象的第三大特征,多态是建立在封装和继承基础上的
静态多态(方法的重载)
这就是简单的多态
public int add(int a,int b){return a + b; }
public int add(int a,int b,int c){ return a+b+c}
public double add(double a, int b){ return a+b}
对象的多态
- 一个对象的编译类型和运行类型可以不一致
- 编译类型在定义对象时,就确定了 不可以改变
- 运行类型可以变化的
- 编译类型看定义时 = 号的左边,运行类型看 =号的右边
Animal animal = new Dog();
animal的编译类型是Animal,运行类型是Dog对象
细节
向上转型
向上转型调用方法的规则:
- 可以调用父类中的所有成员(需要遵循访问权限)
- 不能调用子类特有的成员方法(就是父类没有的,而子类却有的方法是不能通过父类的引用指向去调用那个方法)
- 在编译阶段,能调用哪些成员,是由编译类型来决定的
- 最终运行效果还是要看子类的具体实现,就是调用方法,按照从子类开始查找,然后调用,规则与继承方法的规则一致
本质:父类的引用指向了子类的对象
语法:父类类型 引用名 = new 子类类型();
特点:编译看类型的左边,运行看类型右边
public class Person {//父类或基类
public int add(int a, int b){
return a + b;
}
public double add(double a , int b) {
return a + b;
}
public double add(int a, double b) {
return a + b;
}
public void run(){
System.out.println("Person 的run");
}
public void play(){
System.out.println("Person 的play");
}
}
子类
package com.fgw.Test;
public class Son extends Person{
public void run(){
System.out.println("我是子类的run方法");
}
public void eat(){
System.out.println("我是子类特有的eat方法");
}
}
测试方法
package com.fgw.Test;
public class Main {
public static void main(String[] args) {
/**
* 向上转型
* 就是父类的引用指向子类的对象
* 在编译时看左边的引用,实际执行而是看右边的对象
* 通过父类的引用时只能执行父类中或者子类重写了的方法不能调用子类特有的方法
* */
Son son = new Son();
Person s = new Son();
son.eat();
//s.eat();
s.run();s.play();
}
}
多态与对象转型详解
3997

被折叠的 条评论
为什么被折叠?



