多态
何为多态?
通俗的讲是引用的多种形态,往往是由引用实际指向的对象决定。方法有多态,属性没有多态。
静态(编译期间)多态 :方法的重载,严格来说不算是多态的体现,只是增加了程序的灵活性。
动态(运行期间)多态 :重写和向上转型
多态的三要素?
- 存在某种联系(继承类或者实现接口)
- 方法的重写
- 父引用指向子类对象
多态的体现?
向上转型
子类重写父类方法,父类引用执行子类重写的方法;
父类独有的方法,父类引用执行父类独有方法;
子类独有方法,则不允许执行,否则需要强行向下转型,调用子类独有方法。
package hchang.demo.java.base.varscope;
/**
* 父类
*/
public class Parent {
public void eat(){
System.out.println("parent eat");
}
protected void cost(){
System.out.println("parent cost moneny");
}
}
package hchang.demo.java.base.varscope;
/**
* java 多态
* 1、重写与重载
* 2、向上转型 父类的引用执行子类的对象
*/
public class Son extends Parent{
@Override
public void eat() {
System.out.println("son eat");
}
public void paly() {
System.out.println("son paly");
}
public static void main(String[] args) {
//向上转型 父类引用执行子类重写的方法,子类没有重写父类则不允许执行
Parent parent = new Son();
parent.eat();
parent.cost();
//向下转型
((Son) parent).paly();
}
}
运行结果
son eat
parent cost moneny
son paly
方法重载和方法重载区别:
区别 | 重写 | 重载 |
---|---|---|
方法列表 | 必须一样 | 必须不一样 |
返回类型 | 必须一样 | 可以不一样 |
访问修饰符 | 一定不能做更严格的限制(可以降低限制) | 可以不一样 |
方法重写
被重写的方法必须有@Overvide注解修饰,父类的final、static、private 修饰的方法不允许被重写,返回值类型(JDK7以后,被重写的方法返回值类型可以不同,但是必须是具有父子关系的)和形参都不能改变。即外壳不变,核心重写。
方法重载
/**
* 1、重载的方法参数列表必须不一样
* 2、返回值类型可以一样可以不一样
* 3、修饰符可以不一样
*/
public class OverloadDemo {
public void eat(String name,String age,String sex){
}
private String eat(String name,String age,Integer s){
return null;
}
}