重载和重写
说到重载,就不得不说起构造器
构造器与类名同名。在构创类的对象的时候,构造器会运行,将实例域初始化为所希望的状态。也可以说,构造器总是伴随着new操作符的执行被调用,对一个已经存在的对象,是不能调用构造器,重置实例域的。
构造器有以下几个特点
①所有的类,都有一个默认的构造函数,只不过当我们写出来构造函数时就已经将其覆盖。
②构造函数要与类名一致。
③一个类中可以有多个构造函数(也就是一会儿要说的重载)。
④一个构造函数可以有0或多个参数。
⑤构造函数没有返回值。
⑥构造函数总是伴随着new函数进行操作。
因为一个构造函数可以有0或多个参数,一个类中又可以有多个函数,所以可以有重载。
那么什么叫重载呢?有些类有多个构造器,比如既可以构造一个入参为空的函数,又可以构造一个传入参数的函数。
StringBuilder messages = new StringBuilder();
StringBuilder todoList = new StringBuilder("To do:\n") ;
也就是说多个方法有相同的名字,不同的参数,就产生了重载。
编译器通过用各个方法给出的参数类型与特定方法调用所使用的值类型进行匹配来挑选出相应的方法,如果没有对应的构造函数,会报错。这个过程叫做重载解析。
重载只是针对的是参数类型,不是返回类型,构造函数没有返回类型。
如果没有编写构造器,系统会提供一个默认的构造器,将实例域的值都设为默认值(0或null、false)
可以使用this()在构造器中调用其他构造器,这样提高了代码编写效率。
public class ConstructorTest{
public static void main(String[] args){
Empolyee[] staff = new Employee[3];
staff[0] = new Employee("Harry",40000);
staff[1] = new Employee(60000);
staff[2] = new Employee();
for(Employee e: staff){
System.out.println("name = "+e.getName()+",salary="+e.salary());
}
}
}
class Employee
{
private String name ="";
private double salary;
public Employee(String n ,double s)
{
name = n;
salary =s;
}
public Employee(double s)
{
this("Employee #"+nextId,s);
}
public Employee()
{
}
public String getName()
{
return name;
}
public double getSalary()
{
return salary;
}
}
重写
重写是在继承是发生的,也可以叫覆盖方法。当父类的方法对于子类不适用时,那么子类去写和这个方法同名的方法,就会将继承的父类的这个方法覆盖掉。
但是请注意,如果一个方法在父类中属于private,那么子类中和父类此方法重名的方法并不是重写,因为子类是不能继承父类的私有方法的,所以,这叫重新定义了一个方法,不叫重写。那如果既想要使用重写的方法,又想要使用父类的方法,怎么办。
可以用关键字super
super.方法名()
这个supe关键字和this并不相同,他并不是一个对象的引用,只是一个提示编译器调用超类方法的特殊关键字。
public double getSalary(){
double baseSalary = super.getSalary();
return baseSalary + bonus;
}