一、子类可以继承父类的所有成员方法(静态方法,实例方法),和成员变量(静态变量,实例变量)
class Base{
static int ix = 0;
static void test(){
System.out.println("static method,ix = "+ix);
}
}
class Sub extends Base{
}
class App{
public static void main(String[] args){
Sub b = new Sub();
b.test(); //output static method,ix = 0
b.ix = 5; //output static method,ix = 5
b.test();
}
}
二、如果子类要覆盖父类的方法,子类方法的名称、参数签名和返回类型必须与父类方法的名称、参数签名和返回类型一致。例如以下代码将导致编译错误:
class Base{
public void show(){
System.out.println("Base");
}
}
class Sub extends Base{
public void show(){ //编译器不会报错,编译器会认定你想覆盖Base同名方法 System.out.println("Sub");
}
public int show(){ //编译器会报错,编译器会认定你想覆盖Base同名方法
return 0;
}
public int show(int ix){ //编译器不会报错,编译器会认定一想重载Base同名方法
return ix;
}
}
class App{
public static void main(String[] args){
Base b = new Sub();
b.show(5); //编译会报错,编译器会按照b声明的类型来处理,
//Base类型没有show(5)方法
(Sub(b)).show(5) //可以通过向下类型强制转换来实现
}
}
总结:Java 编译器首先判断Sub 类的show()方法与Base类的show()方法的参数签名,由
于两者一致,因此Java 编译器认为Sub类的show()方法试图覆盖父类的方法,既然如此,
Sub类的show()方法就必须和被覆盖的方法具有相同的返回类
语句
Base b = new Sub();
实际上由三部分组成:
1。.声明一个Base类型,定义一个引用变量 b
2。new运算符构造一个Sub对象,并返回一个指向Sub对象的引用
3。返回的Sub类型的对象引用被强制转化并赋值为Base类型引用变量b
三、子类方法不能缩小父类方法的访问权限。例如以下代码中子类的method()方法是
私有的,父类的method()方法是公共的,子类缩小了父类方法的访问权限,这是无效的方法
覆盖,将导致编译错误:
public class Base {
public void method() {…}
}
public class Sub extends Base {
private void method() {…} //编译错误,子类方法缩小了父类方法的访问权限
}
四、子类方法不能抛出比父类方法更多的异常,子类方法抛出的异常必须和父类方法抛出的异常相同,或者子类方法抛出的异常类是父类方法抛出的异常类的子类。
五、方法覆盖只存在于子类和父类(包括直接父类和间接父类)之间。在同一个类中
方法只能被重载,不能被覆盖。
六、父类的静态方法不能被子类覆盖为非静态方法。例如以下的代码将导致编译错误:
class Base{
static void test(){
System.out.println("static method");
}
}
class Sub extends Base{
void test(){
System.out.println(" no static method");
}
}
为什么编译器会报错呢?因为如果成立会与JAVA多态机制冲突:
Base b = new new Sub();
b.test()
根据JAVA多态机制 b会引用 sub类的test 方法,但是 Base 类的test方法和Sub类的test方法不在同一个生命周期,Base类的test方法是类方法,具有类的生命周期,而Sub类的test方法是实例方法,具有对象的生命周期。这一点就和多态机制相违背了!
六、在子类中定义和父类同名的静态方法实际上并非覆盖而是隐藏了父类的静态方法
class Base{
static void test(){
System.out.println("Base static method");
}
void show(){
System.out.println("Base no static method");
}
}
class Sub extends Base{
static void test(){
System.out.println("Sub static method");
}
void show(){
System.out.println("Sub no static method");
}
}
class App{
public static void main(String[] args){
Base b = new Sub();
b.test(); // output Base static method 静态方法属于Base类
b.show(); // output Sub no static method 实例方法属于Sub对象
}
}
七、父类的私有方法不能被子类覆盖,子类方法覆盖父类方法的前提是,子类必须能继承父类的特定方法,由于Base 类的private 类型的showMe()方法不能被Sub 类继承,因此Base 类的showMe()方法和Sub 类的showMe()方法之间并没有覆盖关系。
class Base{
private void showme(){ //private | public
System.out.println("Base");
}
void print(){
showme();
}
}
class Sub extends Base{
public void showme(){
System.out.println("Sub");
}
}
class App{
public static void main(String[] args){
Base b = new Sub();
b.print(); //output Base |output Sub
}
}