多态是同一个行为具有多个不同的表现形态或者形态的能力。
多态就是同一个接口,使用不同的实例而执行不同操作。
多态的优点:
1.消除类型之间的耦合关系
2.可替换性
3.可扩充性
4.接口性
5.灵活性
6.简化性
多态存在的三个必要条件
继承、重写、父类引用指向子类对象:
多态有向上转型和向下转型两种用法
比如:Animal a = new Cat();是new 一个子类对象,把它赋给父类的一个实例。
向上转型都是安全的,但是子类向上转型之后就成了父类,无法再使用子类的一些方法。
向下转型不一定是安全的,通常需要进行类型判断。
if (a instanceof Cat) { // 猫做的事情 Cat c = (Cat)a;
c.work();
} else if (a instanceof Dog) { // 狗做的事情 Dog c = (Dog)a;
c.work();
}
多态的实现方式
方法一:重写
方法二:接口
方法三:抽象类和抽象方法
重写
方法的重写规则
1.参数列表与被重写方法的参数列表必须完全相同。
2.返回类型与被重写方法的返回类型可以不相同,但是必须是父类返回值的派生类
3.访问权限不能比父类中被重写的方法的访问权限更低
4.父类的成员方法只能被它的子类重写
5.声明为final的方法不能被重写
6.声明为static的方法不能被重写,但是能够被再次声明。
7.子类和父类不在同一个包中,那么子类只能重写父类的声明为public和protected的非final方法。
8.重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比重写方法声明的更广泛的强制性异常,反之则可以。
9.构造方法不能被重写
10.如果不能继承一个类,则不能重写该类的方法。
差不多就是子类可以重写父类中已经有的方法,如果没有则Java虚拟机(JVM)无法进行编译。
如果需要在子类中调用父类的重写方法时,要使用super关键字。
例如super.move();
补充一下:
重载
重载是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。
每个重载的方法(或者构造函数)都必须有一个独一无两的参数类型列表。最常见的就是构造器的重载。
被重载的方法必须改变参数列表(参数个数或者类型不一样);
被重载的方法可以改变访问修饰符;
被重载的方法可以声明新的或更广的检查异常;
方法能够在同一个类中或者在一个子类中被重载。
无法以返回值类型作为重载函数的区分标准。
构造器最大的用处就是在创建对象时执行初始化,当创建一个对象时,系统会为这个对象的实例进行默认的初始值。如果想改变这种默认的初始化,就可以通过自定义构造器来实现。
首先,构造器为了创建一个类的实例
Test t=new Test();
构造器不能有以下非访问性质的修饰:abstract,final,native
构造器没有返回值,也不需要void
构造器是不能被继承的
构造方法:构造方法是一种特殊的方法,它是一个与类同名且返回值类型为同名类类型的方法。对象的创建就是通过构造方法来完成,其功能主要是完成对象的初始化。当类实例化一个对象时会自动调用构造方法。构造函数和其他方法一样也可以重载。
比如
class Person{
public Person(String n,int a){//构造方法
name=n;
age=a;
}
private String name;
private int age;
}
static void main(String[] args){
Person p=new Person("张三",14);//构造函数
}
}
注:构造体和构造函数是同一个概念。