方法覆盖-Override
2015-05-19 16:36
155 查看
方法覆盖指的是如果在子类中定义的一个方法,其名称,返回类型及参数签名正好与父类中的某个方法的名称,返回类型及参数签名相匹配,那么就可以说子类的方法覆盖了父类的方法。
方法的覆盖必须满足多种约束,下面将一一进行介绍:
(1)子类方法的名称,返回类型及参数签名必须与父类方法的名称,返回类型及参数签名一致。
例:如下代码将会导致编译错误
例:如下代码将会导致编译错误。
假如没有这个限制,将会与java多态机制发生冲突。如对于以下代码
(3)子类不能抛出比父类更多的异常。 子类抛出的异常必须和父类抛出的异常相同或者子类抛出的异常是父类抛出的异常的子类。
(4)方法覆盖只存在子类和父类(包括直接父类和间接父类)之间。 在同一个类中方法只能被重载不能被覆盖。
(5)父类的静态方法不能被子类覆盖为非静态方法。
例:如下代码将导致编译错误
例:如下代码是合法的:
例:如下代码:
1)子类实现父类的抽象方法
2)子类重新声明父类的抽象方法
例:如下代码合法:
例:如下代码合法:
本文出自 “stormkai” 博客,请务必保留此出处http://stormkai.blog.51cto.com/7934168/1652861
方法的覆盖必须满足多种约束,下面将一一进行介绍:
(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(); }
本文出自 “stormkai” 博客,请务必保留此出处http://stormkai.blog.51cto.com/7934168/1652861
相关文章推荐
- @Override覆盖不了spring-web.jar中的方法
- ”static”关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法?
- Overload 和 Override 的区别?(方法重载) 和 Override(方法覆盖) 的区别?
- virtual,overload,,override,new (虚方法,重载,覆盖,隐藏)以及A a=new B()详解
- [解决]override的方法必须覆盖另一方法
- 方法覆盖(Override)
- Java 子类继承父类方法的重写(或者覆盖,override)
- 对于 子类和基类中 方法的重写 override 和覆盖 new
- C#中判断一个方法是否覆盖(override)了父类的方法
- 方法的重载(overload)和覆盖(override)
- 方法的覆盖(override)或者重写
- 子类中的方法和父类同名,但是参数不同,是重写(overload)不是覆盖(override)
- C#中子类对父类中虚方法的处理有重写(override)和覆盖(new),他们有什么区别?
- JAVA方法的重载(overload)和覆盖(override)
- C#中子类对父类中虚方法的处理有重写(override)和覆盖(new),他们有什么区别?
- C# 虚方法(virtual)覆盖(override) - 隐藏(new) - 重载
- 覆盖父类方法的new和override关键字
- 方法重载(Overload)和方法覆盖(Override)
- java方法的重载(overloading)和覆盖(override)