您的位置:首页 > 编程语言 > Java开发

Java中方法的重载与重写

2015-10-17 23:47 253 查看

一、方法重载

方法重载针对的是一个类。

只用当参数序列不同,即参数的个数、类型或顺序不同时,才叫做方法重载。与方法的返回类型、修饰符(public、protected、private等)、是否抛出异常无关。

例如:下面的四个方法是同一个方法,不是方法重载

<span style="font-size:14px;">	public void save(int a) throws IOException{

}

private void save(int a) throws IOException{

}

public void save(int a){

}

public int save(int a) throws IOException{

}</span>


二、方法重写

方法重写针对的是父类和子类。

当子类的方法名及参数序列和父类完全相同时,叫做方法重载,与方法是否抛出异常无关。

注意:

如果父类的方法定义为private,它在子类中是不可见的,故子类中的同名方法不再是覆盖,相当于一个新的方法名

如果父类的方法定义为protected,子类不能将需要重写的方法定义为private
如果父类的方法定义为public,子类不能将需要重写的方法定义为private、protected
注:如果一个方法没加修饰符,默认为friendly,只允许同一个包中的其他类访问。

三、final修饰的方法不能被重写,但是能被重载

1、如果父类的方法用final修饰,那么在子类中无法重写。

下面的例子是错误的:

<span style="font-size:14px;">package com.ghs.test;

public class Base {
public final void show(){
System.out.println("Base");
}
}

class Sub extends Base{
public void show() {
System.out.println("Sub");
}
}</span>2、如果父类的final方法用private修饰,它在子类中是不可见的,故子类中的同名方法不再是覆盖,相当于一个新的方法名。
下面的例子是正确的:

package com.ghs.test;

public class Base {
private final void show(){
System.out.println("Base");
}
}

class Sub extends Base{
public void show() {
System.out.println("Sub");
}
}3、final修饰的方法是可以被重载的。
下面的例子是正确的:

<span style="font-size:14px;">package com.ghs.test;

public class Base {
public final void show(){
System.out.println("Base1");
}

public final void show(int a){
System.out.println("Base2");
}
}</span>总结:final修饰方法跟final修饰类是同一个原理,final修饰类,则类不能被继承,final修饰方法,则方法不能被重载,都是子类跟父类之间的关系。

补充说明:final修饰变量,则为常量,值不可变final修饰对象,值可变,引用不变。

下面两个例子,分别是final修饰变量和final修饰对象的,都是错误的:

<span style="font-size:14px;">package com.ghs.test;

public class Test {
private static final int a=2;
public static void main(String[] args) {
a=3;
}
}
//a是常量,所以a的值不能改变,错误
</span>
<span style="font-size:14px;">package com.ghs.test;

public class Test {
private static final Person person=new Person();
public static void main(String[] args) {
person = new Person();//错误,引用不能变(值就是对象的地址)
person.setName("张三");//正确,值可变(值就是具体的对象)
}
}</span>

四、static修饰的方法对子类不可见,可以被重载

1、static修饰的方法叫做类方法,类方法是属于某个类的,所以对子类是不可见的,故子类中的同名方法不再是覆盖,相当于一个新的方法名。

下面的例子是正确的:

package com.ghs.test;

public class Base {
public static void show(){
System.out.println("Base");
}
}

class Sub extends Base{
//这不是从父类继承的方法,是子类自己定义的方法,父类的静态方法对子类是不可见的
public static void show() {
System.out.println("Sub");
}
}2、static修饰的方法可以被重载
下面的例子是正确的:

package com.ghs.test;

public class Base {
public static void show(){
System.out.println("Base1");
}

public static void show(int a){
System.out.println("Base2");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  重载 重写 Java