前言
上一篇我们共同学习了类的继承,本文章我们将一起学习类的多态。
一、多态的概念
多态(英语:polymorphism)指为不同数据类型的实体提供统一的接口。
多态类型(英语:polymorphic type)可以将自身所支持的操作套用到其它类型的值上。
简单来说,所谓多态意指相同的消息给予不同的对象会引发不同的动作。
二、代码示例
1.了解方法的重写
代码如下(示例):
1.B类
//重写都是方法的重写跟属性无关。
public class B {
public void test(){
System.out.println("B=>test()");
}
}
2.A类
//继承 B
public class A extends B{
@Override//重写
public void test() {
System.out.println("A=>test()");
}
}
3.Application类
//多态
public class Application {
//静态的方法和非静态方法有很大的区别!
//静态方法:方法的调用只和左边定义的类型有关
//非静态方法:重写
public static void main(String[] args){
//方法的调用只和左边定义的类型有关
A a = new A();
a.test();
//父类的引用指向了子类
B b = new A();//子类重写了父类的方法
b.test();
}
}
运行结果:
2.多态的详解
代码如下(示例):
1.Person类
public class Person {
public void run(){
System.out.println("p_run");
}
}
2.Student类
public class Student extends Person{
@Override
public void run() {
System.out.println("s_run");
}
public void eat() {
System.out.println("eat");
}
}
3.Application类
public class Application {
//多态
public static void main(String[] args){
//一个对象的实际类型是确定的
//可以指向的引用类型是可以不确定的
//子类(Student)能调用的方法是自己的或者是继承来的
Student student = new Student();
Person person1 = new Person();
//父类的引用指向子类
//父类虽然可以指向子类,但是不能调用子类独有的方法
Person person2 = new Student();
student.run();
person1.run();
//子类重写了父类的方法,执行了子类的方法
person2.run();
//对象能执行哪些方法,主要看对象左边的类型
//父类虽然可以指向子类,但是不能调用子类独有的方法
student.eat();//可以执行
//person2.eat();不能执行
}
}
运行结果:
总结
- 重写:需要有继承关系,子类重写父类的方法!alt + insert : override
- 方法名必须相同
- 參数列表必须相同
- 修饰符:范围可以扩大不可以缩小:public>protected>default>private
- 抛出的异常:范围可以被缩小不能被扩大:ClassNotFoundExceptinon–>Exceptinon
- 子类和父类的方法必须要一致,方法体不同
- 为什么需要重写?
- 父类的功能子类不一定须要,或不一定满足!
- 多态:
- 多态是方法的多态,属性没有多态
- 父类和子类有联系,类型转换异常!ClassCastException
- 存在条件:有继承关系,且方法需要重写(父类引用指向子类对象 Father f = new Son)
- static方法,属于类,不属于实例
- final 常量
- private方法