Polymorphic Java Override and Overloading, 多态,对象的重载与覆盖
2012-11-27 22:29
323 查看
Override(覆盖/复写)是面向对象多态的实现,是JVM运行期的特性,
Overloading(重载)是编译期的特性.
首先我们来看看Override JVM中对overloading的描述是具有相同的方法签名,那么什么是相同的方法签名呢?
首先方法名称必须相同,然后方法的返回类型必须相同(1.对象类型的话,2.子类所返回的参数的类型也必须是父类返回的参数的相同类型或其子类,3.参数类型和顺序必须匹配4,子类要么不抛出异常,要么抛出相同异常或其父类方法抛出的异常的子类), 详细的描述及其代码如下:
接下来我们在看一下方法可见性及其其它方法关键字的影响.首先既然是override, 那么一个static 的方法是不允许覆盖的,接下来一个final 的方法也是不可以被覆盖的. 在然后,我们谈protected 关键字, 他表示对其子类可见. 无关键字(default)当前类所在包(package)可见, public任意包可见,private该类即将内部类可访问.
假如我们有class C extends class B, class B extends class A 且存在相同package中, class A,B,C都有相同方法签名method, 那么
如果class A 中public method(), 那么class B 和class C中的method 也必须都是public.
如果class A 中method(). 那么class B中method() 可以是default,或protected或public, class C中的method()依照class B中的顺序因该是default, 或 protected/public, 或public
如果class A 中protected method(), 那么class B 中必须是protected 或 public, 对应的class C 中应该是protected/public 或 public
所以static/final 不可以有override, 子类的可见性必须大于或等于父类的可见性,如果父类使用private,意味着这个方法被隐藏了,子类是无法访问和覆盖的
public
class ParentClass {
void method1() {
try {
method2();
} catch (IOException e) {
e.printStackTrace();
}
}
protected
void method2() throws IOException {
System.out.println("ParentClass - method2");
}
}
public
class ChildClass extends ParentClass {
public
void method2() {
System.out.println("ChildClass - method2");
}
}
public
static void main(String[] args) {
ParentClass p = new ChildChildClass();
//ChildChildClass p = new ChildChildClass();
p.method1(); // 结果输出 => ParentClass - method2
}
1. 方法名相同..
2. 方法返回参数匹配->子类的返回类型必须是父类参数类型或其子类(这里是子类,不可运用原始类型,如父类是long,子类也必须返回long,不可以是int..)
public interface IParent {
ParentParam method4();
}
public class MyParentImplimplements IParent{
@Override
public ParentParam
method4() {
return null;
}
}
public class MyParentImplimplements IParent{
@Override
public ChildParam
method4() {
returnnull;
}
}
public interface IParent {
ChildParam method5();
}
public class MyParentImplimplementsIParent{
@Override
publicChildParam method5() {
return null;
}
}
下面的代码将会编译错误
public class MyParentImplimplements
IParent{
@Override
publicParentParam method5() {
returnnull;
}
}
3. 参数类型的匹配->子类的参数类型必须也是父类参数类型,完全匹配
public interface IParent {
void method1(ParentParam parm);
}
下面代码编译错误
public class MyParentImplimplements
IParent{
@Override
publicvoid
method1(ChildParam parm) {
}
}
public interface IParent {
void method11(ChildParam parm);
}
下面代码编译错误
public class MyParentImplimplements
IParent{
@Override
publicvoid
method11(ParentParam parm) {
}
}
4. 异常类型的匹配-> ->子类的异常类型必须是父类参数类型或其子类
或者不抛出异常
public interface IParent {
void method2()throws IOException;
}
public class MyParentImplimplements
IParent{
@Override
publicvoid
method2(){
}
}
public class MyParentImplimplements
IParent{
@Override
publicvoid
method2()throws
FileNotFoundException{
}
}
下面代码编译错误
public class MyParentImplimplements
IParent{
@Override
publicvoid
method2()throws Exception {
}
}
接着我们来看看Overloading,是指在一个类中可以允许有多个相同方法签名相同但参数类型不同的方法,即使顺序不一样。
如果我们有了intmethod(),就不可以有intmethod()throws
Exception或longmethod()
如果我们有了int method(int i,double
b),还可以有int method(double b,int
i)
Overloading(重载)是编译期的特性.
首先我们来看看Override JVM中对overloading的描述是具有相同的方法签名,那么什么是相同的方法签名呢?
首先方法名称必须相同,然后方法的返回类型必须相同(1.对象类型的话,2.子类所返回的参数的类型也必须是父类返回的参数的相同类型或其子类,3.参数类型和顺序必须匹配4,子类要么不抛出异常,要么抛出相同异常或其父类方法抛出的异常的子类), 详细的描述及其代码如下:
接下来我们在看一下方法可见性及其其它方法关键字的影响.首先既然是override, 那么一个static 的方法是不允许覆盖的,接下来一个final 的方法也是不可以被覆盖的. 在然后,我们谈protected 关键字, 他表示对其子类可见. 无关键字(default)当前类所在包(package)可见, public任意包可见,private该类即将内部类可访问.
假如我们有class C extends class B, class B extends class A 且存在相同package中, class A,B,C都有相同方法签名method, 那么
如果class A 中public method(), 那么class B 和class C中的method 也必须都是public.
如果class A 中method(). 那么class B中method() 可以是default,或protected或public, class C中的method()依照class B中的顺序因该是default, 或 protected/public, 或public
如果class A 中protected method(), 那么class B 中必须是protected 或 public, 对应的class C 中应该是protected/public 或 public
所以static/final 不可以有override, 子类的可见性必须大于或等于父类的可见性,如果父类使用private,意味着这个方法被隐藏了,子类是无法访问和覆盖的
public
class ParentClass {
void method1() {
try {
method2();
} catch (IOException e) {
e.printStackTrace();
}
}
protected
void method2() throws IOException {
System.out.println("ParentClass - method2");
}
}
public
class ChildClass extends ParentClass {
public
void method2() {
System.out.println("ChildClass - method2");
}
}
public
static void main(String[] args) {
ParentClass p = new ChildChildClass();
//ChildChildClass p = new ChildChildClass();
p.method1(); // 结果输出 => ParentClass - method2
}
1. 方法名相同..
2. 方法返回参数匹配->子类的返回类型必须是父类参数类型或其子类(这里是子类,不可运用原始类型,如父类是long,子类也必须返回long,不可以是int..)
public interface IParent {
ParentParam method4();
}
public class MyParentImplimplements IParent{
@Override
public ParentParam
method4() {
return null;
}
}
public class MyParentImplimplements IParent{
@Override
public ChildParam
method4() {
returnnull;
}
}
public interface IParent {
ChildParam method5();
}
public class MyParentImplimplementsIParent{
@Override
publicChildParam method5() {
return null;
}
}
下面的代码将会编译错误
public class MyParentImplimplements
IParent{
@Override
publicParentParam method5() {
returnnull;
}
}
3. 参数类型的匹配->子类的参数类型必须也是父类参数类型,完全匹配
public interface IParent {
void method1(ParentParam parm);
}
下面代码编译错误
public class MyParentImplimplements
IParent{
@Override
publicvoid
method1(ChildParam parm) {
}
}
public interface IParent {
void method11(ChildParam parm);
}
下面代码编译错误
public class MyParentImplimplements
IParent{
@Override
publicvoid
method11(ParentParam parm) {
}
}
4. 异常类型的匹配-> ->子类的异常类型必须是父类参数类型或其子类
或者不抛出异常
public interface IParent {
void method2()throws IOException;
}
public class MyParentImplimplements
IParent{
@Override
publicvoid
method2(){
}
}
public class MyParentImplimplements
IParent{
@Override
publicvoid
method2()throws
FileNotFoundException{
}
}
下面代码编译错误
public class MyParentImplimplements
IParent{
@Override
publicvoid
method2()throws Exception {
}
}
接着我们来看看Overloading,是指在一个类中可以允许有多个相同方法签名相同但参数类型不同的方法,即使顺序不一样。
如果我们有了intmethod(),就不可以有intmethod()throws
Exception或longmethod()
如果我们有了int method(int i,double
b),还可以有int method(double b,int
i)
相关文章推荐
- Java 重写(即覆盖Override)与重载(Overload)与多态几个概念的区别分析
- java 继承 多态(override->重写(=覆盖)、overload->重载、polymorphism -> 多态)
- java方法的重载(overloading)和覆盖(override)
- C++中的重载隐藏覆盖&&JAVA中的重载覆盖&&多态
- JAVA方法的重载(overload)和覆盖(override)
- Java继承和多态===Java继承中方法的覆盖和重载
- Java中覆盖、继承、重载和多态的详细解说与this和super的用法
- 黑马程序员Java基础之多态与继承、覆盖与重载
- JAVA重载(overload)和覆盖(override)中你所不知道的陷阱
- JAVA是否允许返回值类型不同的重载overload或覆盖override
- JavaSE入门学习16:Java面向对象之重写(Override)和重载(Overload)
- 多态(polymorphism),覆盖(Override),重载(overload)
- Java重载(overload)和覆盖(override)中的陷阱
- 重写(覆盖)与重载 Override and Overload
- c++(一) 类 对象 重载 继承 多态 构造函数 虚函数 覆盖 纯虚函数等
- java方法的重载、覆盖和隐藏,以及多态的区别
- [Java复习]重载、覆盖、继承、多态
- 多态(polymorphism),覆盖(Override),重载(overload)
- JAVA重载(overload)和覆盖(override)中你所不知道的陷阱
- java 多态、继承、覆盖、重载示例