您的位置:首页 > 其它

重写Override和重载Overload的区别 以及注意项目

2013-11-20 11:00 218 查看
最近看了Java面试宝典,看见一个问题“重写Override和重载Overload的区别”觉得很不错,

--------------------------------------------------此为复制的内容----------------------------------------------

Overload是重载的意思,Override是覆盖的意思,也就是重写。

重载Overload表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同)。

重写Override表示子类中的方法可以与父类中的某个方法的名称和参数完全相同,通过子类创建的实例对象调用这个方法时,将调用子类中的定义方法,这相当于把父类中定义的那个完全相同的方法给覆盖了,这也是面向对象编程的多态性的一种表现。子类覆盖父类的方法时,只能比父类抛出更少的异常,或者是抛出父类抛出的异常的子异常,因为子类可以解决父类的一些问题,不能比父类有更多的问题。子类方法的访问权限只能比父类的更大,不能更小。如果父类的方法是private类型,那么,子类则不存在覆盖的限制,相当于子类中增加了一个全新的方法。

至于Overloaded的方法是否可以改变返回值的类型这个问题,要看你倒底想问什么呢?这个题目很模糊。如果几个Overloaded的方法的参数列表不一样,它们的返回者类型当然也可以不一样。但我估计你想问的问题是:如果两个方法的参数列表完全一样,是否可以让它们的返回值不同来实现重载Overload。这是不行的,我们可以用反证法来说明这个问题,因为我们有时候调用一个方法时也可以不定义返回结果变量,即不要关心其返回结果,例如,我们调用map.remove(key)方法时,虽然remove方法有返回值,但是我们通常都不会定义接收返回结果的变量,这时候假设该类中有两个名称和参数列表完全相同的方法,仅仅是返回类型不同,java就无法确定编程者倒底是想调用哪个方法了,因为它无法通过返回结果类型来判断。

override可以翻译为覆盖,从字面就可以知道,它是覆盖了一个方法并且对其重写,以求达到不同的作用。对我们来说最熟悉的覆盖就是对接口方法的实现,在接口中一般只是对方法进行了声明,而我们在实现时,就需要实现接口声明的所有方法。除了这个典型的用法以外,我们在继承中也可能会在子类覆盖父类中的方法。在覆盖要注意以下的几点:

1、覆盖的方法的标志必须要和被覆盖的方法的标志完全匹配,才能达到覆盖的效果;

2、覆盖的方法的返回值必须和被覆盖的方法的返回一致;

3、覆盖的方法所抛出的异常必须和被覆盖方法的所抛出的异常一致,或者是其子类;

4、被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。

overload对我们来说可能比较熟悉,可以翻译为重载,它是指我们可以定义一些名称相同的方法,通过定义不同的输入参数来区分这些方法,然后再调用时,JVM就会根据不同的参数样式,来选择合适的方法执行。在使用重载要注意以下的几点:

1、在使用重载时只能通过不同的参数样式。例如,不同的参数类型,不同的参数个数,不同的参数顺序(当然,同一方法内的几个参数类型必须不一样,例如可以是fun(int,float),但是不能为fun(int,int));

2、不能通过访问权限、返回类型、抛出的异常进行重载;

3、方法的异常类型和数目不会对重载造成影响;

4、对于继承来说,如果某一方法在父类中是访问权限是priavte,那么就不能在子类对其进行重载,如果定义的话,也只是定义了一个新方法,而不会达到重载的效果。

------------------------------------------------------------------------------复制内容结束-----------------------------------------

根据描述我进行了一些测试,发现如下两个问题(当然如private的方法不能够重写这样的上述已经描述清楚了):

1.main方法能否进行继承?

2.static方法能否进行重写?

针对于第一个问题:

main方法能否进行继承,java对继承的描述是这个样子的:

Sun的Java Tutorial中是这么说的:

A subclass inherits all the member variables and methods from its superclass. However, the subclass might not have access to an inherited member variable or method. For example, a subclass cannot access a private member
inherited from its superclass. One might think, then, that the item was not inherited at all. But the item is inherited. This becomes important when using an inner class, which does have access to its enclosing class's private members.
Note that constructors are not members and so are not inherited by subclasses.

如上所述,java中的继承是子类继承父类的所有的成员变量和方法,同时最后注明 构造方法不是成员所以不能够进行继承,但是main方法没有提到,那么main方法应该就是成员,所以他应该是可以被继承的

如果一个子类没有写main方法,而他的父类写了的话,那么在执行期,他会调用父类的main方法

针对于第二个问题:

static方法能否进行重写,我看过一个讨论的帖子非常好(http://bbs.csdn.net/topics/50433622

看完之后,我觉得static方法是不能进行重写的,虽然子类可以写一个与父类方法名返回值访问类型参数列表都一样的方法,但是这不是重写了父类的方法,在调用时,父类的static方法没有被子类覆盖,

原因:类的static方法只要程序开始运行,便在内存中分配一块指向固定地址的函数指针。对该类的任何处理,比如继承或是实例化都不会影响这个固定的指针(即所谓静态)。

其实static方法和private方法的结果是一样的 虽然都有一个一模一样的方法,但是那不是重写覆盖,只是子类中有一个方法与父类名称一致罢了,但是他们俩个的原理是不同的,private方法默认是final的即不可继承的,但是static方法是可以被继承的,但是由于内存分配的问题所以不能够进行重写
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: