方法覆盖-Override

方法覆盖指的是如果在子类中定义的一个方法,其名称,返回类型及参数签名正好与父类中的某个方法的名称,返回类型及参数签名相匹配,那么就可以说子类的方法覆盖了父类的方法。

方法的覆盖必须满足多种约束,下面将一一进行介绍:

(1)子类方法的名称,返回类型及参数签名必须与父类方法的名称,返回类型及参数签名一致。

例:如下代码将会导致编译错误

public class Base {
    public void method(){
        
    }
}

public class Sub extends Base {
    public int method(){//编译错误,返回类型不一致
        return 0;
    }
}

若在子类中先将父类的method()方法覆盖,再重载,那么将是合法的。

public class Base {
    public void method(){
        
    }
}

public class Sub extends Base {
    
    public void method(){
        
    }
    public int method(int a){
        return 0;
    }

}

(2)子类方法不能缩小父类方法的访问权限。

例:如下代码将会导致编译错误。

public class Base {
    public void method(){
        
    }
}
public class Sub extends Base {
    
    private void method(){//编译错误,子类方法缩小了父类方法的访问权限
        
    }

}

错误原因分析:

假如没有这个限制,将会与java多态机制发生冲突。如对于以下代码

Base base = new Sub();
base.method();

Java编译器认为以上是合法代码,在运行时候根据动态绑定规则,Java虚拟机会调用base变量所引用的Sub实例的method()方法,如果这个方法是private类型的,Java虚拟机就无法访问它。

(3)子类不能抛出比父类更多的异常。 子类抛出的异常必须和父类抛出的异常相同或者子类抛出的异常是父类抛出的异常的子类。

(4)方法覆盖只存在子类和父类(包括直接父类和间接父类)之间。 在同一个类中方法只能被重载不能被覆盖。

(5)父类的静态方法不能被子类覆盖为非静态方法。

例:如下代码将导致编译错误

public class Base {
    public static void method(){
        
    }
}

public class Sub extends Base {
    
    public void method(){ //编译出错
        
    }

}

(6)子类可以定义与父类的静态方法同名的静态方法。但须满足方法覆盖约束条件即方法的参数签名一致,返回类型一致,不能缩小父类方法的访问权限,不能抛出比父类方法更多的异常。

例:如下代码是合法的:

public class Base {
    static int method(int a) throws Exception{
        return 0;
    }

}

import java.io.IOException;

public class Sub extends Base {
    
    public static int method(int a) throws IOException{
        return 0;
    }

}

(7)父类的非静态方法不能被子类覆盖为静态方法。

public class Base {
    public void method(){
        
    }
}

public class Sub extends Base {
    
    public static void method(){ //编译出错
        
    }

}

(8)父类的私有方法不能被子类覆盖。

例:如下代码:

public class Base {
    private void say(){
        System.out.println("I am Base Class");
    }
    
    public void speak(){
        say();
    }
}
public class Sub extends Base {
    public void say(){
        System.out.println("I am Sub Class");
    }
    
    public static void main(String[] args) {
        Sub sub = new Sub();
        sub.speak();
    }

}

运行结果是:

I am Base Class

如果把Base类的say()方法改成public型的,即:

private void say(){
        System.out.println("I am Base Class");
    }

那么,运行结果为:

I am Sub Class

(9)父类的抽象方法可以被子类通过两种方式覆盖。

1)子类实现父类的抽象方法

2)子类重新声明父类的抽象方法

例:如下代码合法:

public abstract class Base {
    public abstract void method1();
    public abstract void method2();

}
public abstract class Sub extends Base {
    public void method1(){
        
    }
    
    public abstract void method2();

}

(10)父类的非抽象方法可以被覆盖为抽象方法

例:如下代码合法:

public class Base {
    void method(){
        
    }

}
public abstract class Sub extends Base {
    public abstract void method();

}
时间: 2024-10-28 22:06:41

方法覆盖-Override的相关文章

java面向对象编程(六)--四大特征之继承、方法重载和方法覆盖

一.继承 1.继承的概念 继承可以解决代码复用,让我们的编程更加靠近人类思维.当多个类存在相同的属性(变量)和方法时,可以从这些类中抽象出父类,在父类中定义这些相同的属性和方法,所有的子类不需要重新定义这些属性和方法,只需要通过extends语句来声明继承父类.语法如下: class 子类 extends 父类 这样,子类就会自动拥有父类定义的某些属性和方法.另外,并不是父类的所有属性.方法都可以被子类继承.父类的public修饰符的属性和方法,protected修饰符的属性和方法,默认修饰符属

C#基础-方法的重写(new)和覆盖(override)

最近又再看基础知识了. 看到方法的重写(new)和覆盖(override)的时候有点不太懂. 于是百度之. 那答案啊..... 要么就是把覆盖(override)和重载(overlord)混淆了. 要么就是把重写(new)和覆盖(override)说反了. 最后不得已谷歌之. 在stackoverflow里看到一个比较好的答案: ------------------------------------------------------------------------------------

方法覆盖(override)”的要点

方法覆盖要求子类与父类的方法一模一样,否则就是方法重载(overload)!请自行编写代码测试以下特性:在子类中,若要调用父类中被覆盖的方法,可以使用super关键字. 结论:          在“+”运算中,当任何一个对象与一个String对象,连接时,会隐式地调用其toString()方法,默认情况下,此方法返回“类名 @ + hashCode”.为了返回有意义的信息,子类可以重写toString()方法.

方法重载(overroad)和方法覆盖(override)------java基础知识总结

a.什么是方法重载?(同一个类中)方法重载是指在同一个类中,出现方法名相同,参数列表不同的情况. b.什么是方法覆盖?(子父类中)方法覆盖是指在子类中,出现和父类一模一样的方法声明的时候,会运行子类的函数,这种现象称为覆盖操作. 方法覆盖会发生在有继承关系的父类和子类之间,而且是在子类类型中,子类继承到父类的方法之后,觉得方法实现已经不足以满足新一代的要求了,于是就给出了新的方法实现. 覆盖注意事项: 子类方法覆盖父类方法时,子类权限必须大于等于父类中的权限. 静态只能覆盖静态或者被静态覆盖.

c# 中面相对性的三个特点:封装,继承,多态, 以及c#中隐藏(new)和方法重写(override)和重载(overload)的区别

封装 1)封装原则:将不需要对外提供的内容都隐藏起来,把属性都隐藏,提供公共方法对其访问,通常有两种访问方式:set 设置,get 获取. 2)封装结果:存在但是不可见. 3) 访问修饰符 声明的可访问性                                 含义 public                                    访问不受限制. protected                              访问仅限于本类或者其子类(可以跨程序集). p

java多态的2种表现形式 方法重载和方法覆盖

方法重载:同一个类中,方法名相同,参数列表不同的2个或多个方法构成方法的重载. 方法覆盖:子类重新实现了父类中的方法. 1.方法的重载实例(Overload) 指我们可以定义一些名称相同的方法,通过定义不同的输入参数来区分这些方法, 然后再调用时,VM就会根据不同的参数样式,来选择合适的方法执行 /** * 方法重载满足的条件 * 1.同一个类中,方法名相同,参数列表不同的2个或多个方法构成方法的重载 * 2.参数列表不同指参数的类型,参数的个数,参数的顺序至少一项不同 * 3.方法的返回值类型

Java协变式覆盖(Override)和泛型重载(Overload)

Java 协变式覆盖(Override)和泛型重载(Overload) 1.协变式覆盖(Override) 在Java1.4及以前,子类方法如果要覆盖超类的某个方法,必须具有完全相同的方法签名,包括返回值也必须完全一样. Java5.0放宽了这一限制,只要子类方法与超类方法具有相同的方法签名,或者子类方法的返回值是超类方法的子类型,就可以覆盖.这样有什么好处呢?以Object类的clone方法为例: class Object {  ...  public Object clone() { ...

接口与继承:方法覆盖(super)

源代码 //父类Parent class Parent{ int x; int y; Parent() { x = 0; y = 0; } public void Set(int a,int b) { x = a; y = b; } } //子类Child继承了Parent class Child extends Parent{ int z; Child() { super();//使用父类的构造方法初始化 z = 0; } public void Set(int a,int b)//与父类相同

java子接口方法覆盖父接口方法的思考

接口List中继承接口Collection,接口Collection中存在size()方法,在接口List中又覆盖size()方法,意义何在?(覆盖了很多方法,见下图) public interface List<E> extends Collection<E> 1.父接口和子接口都是抽象方法(未实现),子类没有改变父类的该方法,在功能层面的确是没有意义的. 2. 子类方法不能缩小所覆盖方法的访问权限和,但是接口里面的方法只能是public,所以子接口方法覆盖父接口方法不能改变方法