一.多态
概念:多态是指,针对某个类型的方法调用,其真正执行的方法取决于运行时期实际类型的方法。
1.在继承关系中,子类如果定义了一个与父类方法签名完全相同的方法,被称为覆写(Override)[子类父类 方法名 返回值 参数都相同]
2.Override(覆写)和Overload(重载)不同的是,如果方法签名如果不同,就是Overload,Overload方法是一个新方法;如果方法签名相同,并且返回值也相同,就是Override。
3.方法名相同,方法参数相同,但方法返回值不同,也是不同的方法。在Java程序中,出现这种情况,编译器会报错。
加上@Override可以让编译器帮助检查是否进行了正确的覆写。希望进行覆写,但是不小心写错了方法签名,编译器会报错。
多态的条件:
继承
重写
父类引用指向子类对象
例如:
java">class Person{
public void run(){
System.out.println("父类的run");
}
}
class Student extends Person{
public void run(){
System.out.println("子类的run");
}
}
----------------------------------------
Person p=new Student();
p.run();//发生多态
输出:
子类的run
例子:计算薪资:
java">public class Hello{
public static void main(String[] args){
System.out.println("----Hello----");
Incom[] incom=new Incom[]{new Teacher(10444),new Docx(22222)};
double sum=getincom(incom);
System.out.print(sum);
};
public static double getincom(Incom[] incom) {
double sum=0;
for(int i=0;i<incom.length;i++) {
sum+=incom[i].getIncom();//调动发生多态
}
return sum;
}
}
class Incom {
protected double incom;
public Incom(double _incom){
this.incom=_incom;
}
public double getIncom(){
return incom;
}
}
class Teacher extends Incom {
public Teacher(double _incom){
super(_incom);
}
public double getIncom(){
return incom*0.1;
}
}
class Docx extends Incom {
public Docx(double _incom) {
super(_incom);
}
public double getIncom() {
return incom*0.2;
}
}
二.final
final修饰类,不可以被继承
final修改时变量,不可以被改变
继承可以允许子类覆写父类的方法。如果一个父类不允许子类对它的某个方法进行覆写,可以把该方法标记为final。用final修饰的方法不能被Override:
java">final class Person {
protected String name;
}
// compile error: 不允许继承自Person
Student extends Person {
}
对于一个类的实例字段,同样可以用final修饰。用final修饰的字段在初始化后不能被修改。例如:
java">class Person {
public final String name = "Unamed";
}
可以在构造函数中初始化final
java">class Person {
public final String name;
public Person(String name) {
this.name = name;
}
}
这种方法更为常用,因为可以保证实例一旦创建,其final字段就不可修改。
final修饰符有多种作用:
final修饰的方法可以阻止被覆写;
final修饰的class可以阻止被继承;
final修饰的field必须在创建对象时初始化,随后不可修改。