📄 java04_08.htm
字号:
<html>
<head>
<meta http-equiv="Content-Language" content="zh-cn">
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title>Java程序设计</title>
</head>
<body background="Bg.gif">
<p align="center"><font size="5"><b>§4.8重载</b></font></p>
<p align="left">一、普通方法的重载</p>
<p align="left"> 普通方法的重载是Java实现多态技术的重要手段,为编程带来了很多便利。例如我们常使用的输出方法System.out.println(),就是通过重载来实现对不同的输出参数的处理。</p>
<p align="left">
方法的重载是对同一类中的同名的方法重新进行定义。</p>
<p align="left">
当方法同名时,为了让编译器区别它们,至少需要下面之一不同:</p>
<ol>
<li>
<p align="left">参数个数不同</li>
<li>
<p align="left">参数类型不同</li>
</ol>
<p align="left"><b>
注意:不允许参数完全相同而只是返回值不同的情况出现。</b></p>
<p align="left">例1、方法的重载(参数个数不同)<br>
class testoverload{<br>
public void fun()<br>
{<br>
System.out.println("This method have no parameter.");<br>
}<br>
public void fun(int k) //这就是对方法fun的重载<br>
{ <br>
System.out.println("This method have parameter k, k="+k);<br>
}<br>
public static void main(String argv[]) <br>
{ testoverload a=new testoverload();<br>
a.fun();<br>
a.fun(10); <br>
}<br>
}</p>
<p align="left">在上面的例子中,编译器会根据参数的不同个数来选择具体调用哪个fun方法。</p>
<p align="left">例2、方法的重载(参数类型不同)<br>
class testoverload{<br>
public void fun(double k)<br>
{<br>
System.out.println("This method have double parameter k,
k="+k);<br>
}<br>
public void fun(int k) //这就是对方法fun的重载<br>
{ <br>
System.out.println("This method have integer parameter k,
k="+k);<br>
}<br>
public static void main(String argv[]) <br>
{ testoverload a=new testoverload();<br>
a.fun(13.5);<br>
a.fun(10); <br>
}<br>
}</p>
<p align="left">在上面的例子中,编译器会根据参数的不同类型来选择具体调用哪个fun方法。</p>
<p>例3、方法的重载(不完全匹配)<br>
有时候,虽然方法已经重载,但调用者的参数无法和其中任何一个方法的参数类型完全匹配,这时系统会进行自动类型转换,看是否有匹配的,如果有则调用相应的方法;否则编译出错。<br>
class testoverload{<br>
public void fun(double k)<br>
{<br>
System.out.println("This method have double parameter k,
k="+k);<br>
}<br>
public void fun(int k) //这就是对方法fun的重载<br>
{ <br>
System.out.println("This method have integer parameter k,
k="+k);<br>
}<br>
public static void main(String argv[]) <br>
{ testoverload a=new testoverload();<br>
short i=5;<br>
a.fun(i); //这里会自动将i转换成为int类型<br>
float k=5.5f;<br>
a.fun(k); //这里会自动将k转换成为double类型<br>
}<br>
}</p>
<p>二、构造方法的重载<br>
构造方法和普通方法一样,也可以重载,而且基本要求也一样,调用原则也一样,来看下面的例子。</p>
<p>class testoverload{<br>
public testoverload(double k)<br>
{<br>
System.out.println("This constructor method have double
parameter k, k="+k);<br>
}<br>
public testoverload(int k) <br>
{ <br>
System.out.println("This constructor method have integer
parameter k, k="+k);<br>
}<br>
public testoverload() <br>
{ <br>
System.out.println("This constructor method have no
parameter.");<br>
}<br>
public static void main(String argv[]) <br>
{ testoverload a=new testoverload();<br>
a=new testoverload(5);<br>
a=new testoverload(1.5);<br>
}<br>
}</p>
<p>三、重载与覆盖<br>
重载与覆盖有很多相似之处,但区别也很大。</p>
<ol>
<li>覆盖是指子类的方法与父类的方法不仅同名,而且参数也完全一样。</li>
<li>重载时,只是方法名相同,而参数必须不同。</li>
<li>覆盖不可用于同一个类中,重载既可用于同一个类中,也可以是子类对父类的重载,如下例:<br>
class father{<br>
public void fun()<br>
{ System.out.println("This is father function");<br>
}<br>
}<br>
class sun extends father{<br>
public void fun(int k) //这是对父类fun方法的重载<br>
{ System.out.println("This is sun function");<br>
}<br>
}</li>
<li>重载时,编译器在编译的时候就已经确定调用哪个具体的方法,是静态(前期)联编,而覆盖则不同,它在某些情况下需要在运行中才决定调用哪个具体的方法,是动态(后期)联编。</li>
</ol>
<p><a href="index.htm">回目录</a> <a href="java04_07.htm">上一课</a> <a href="java04_09.htm">下一课</a></p>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -