一,重载
- 重载含义
- 对一个方法多次定义,即方法名相同,输入参数不同;
- 输入参数不同:参数数量不同/参数类型不同/参数次序不同(次序不同前提是有不同的数据类型,不然次序无意义);
- 重载对所有的成员方法都适用(包括构造方法,但不包括finalize方法);
- 重载使用技巧
- 当重载一个构造方法时,首先要提供一个尽可能普通的版本(输入参数最全面的版本),其他版本可使用this(参数)方式调用该版本的构造方法,取代默认的参数;
- 如果在其他构造方法中调用普通版的构造方法,这个调用语句必须作为这个方法的第一条语句;
- 例如:
public Student(String _name, double _GPA){ //最普通版本构造方法--有name,有GPA
name=_name;
GPA=_GPA;
}
public Student(){ //this(参数)调用版--无name,无GPA
this("nobody", -1.0);
}
public Student(String _name){ //this(参数)调用版--有name,无GPA
this(_name,-1.0);
}
public Student(double _GPA){ //this(参数)调用版--无name,有GPA
this("nobody",_GPA);
}
二,继承
- 继承说明
- 在子类的构造方法的第一行,可以使用super(参数)来引用父类的构造函数;
- 当一个类被实例化时,它的构造方法自动被调用,当一个子类被实例化的时候,虽然没有加入任何调用构造函数的语句,但子类的构造方法和超类的构造方法都被自动的调用;
- 当子类被调用的时候,要隐含地调用超类的构造方法,这种情况下,没有为构造方法输入任何参数;如果超类没有无参数的构造方法,子类又不明确的调用超类的构造方法,则编译器将无法编译子类;
- 除了隐含调用父类构造函数,也可以在子类的第一行明确的调用超类的构造方法;
- 假如某个类含有finalize方法,而另一个自带finalize方法的类扩展了它,当子类的finalize方法结束后,将自动地调用超类的finalize方法;
- 继承使用技巧
- 由于子类在不明确指明的情况下,会隐含调用父类的构造方法,而且该调用不带输入参数,所以当父类中并没有无输入参数的构造方法时,则子类的隐含调用就会出现编译错误;对此,常有如下两种使用继承的技巧:
- 第一种(不使用隐含调用,直接第一句明确调用):每个子类都应当明确地调用超类的一个构造方法,而且必须在第一行调用,当然前提是该调用必须保证超类中有对应的构造方法;
- 第二种(使用隐含调用,但父类要提供无参构造方法):为每个可能成为超类的类提供一个无参构造方法,如果还有其他需要,则重载构造方法;
三,覆盖
- 覆盖含义
- 子类对父类成员方法或成员变量重新定义,覆盖原来的定义;
- 如果重定义的方法的参数列表与超类中该方法的参数列表不一致,叫做重载,而不叫覆盖;即参数列表必须与超类的一致;
- 覆盖成员方法和成员变量都可以在子类中通过super和圆点操作符来实现;
- 覆盖基本规则
- 覆盖方法的返回类型必须同它所覆盖的方法相同;
- 覆盖方法不能比它覆盖的方法的访问性差;
- 覆盖方法不能比它所覆盖的方法抛出更多的异常;