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对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树
- [原创]java局域网聊天系统