⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 java04_08.htm

📁 JAVA的课件
💻 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">&nbsp;&nbsp;&nbsp; 普通方法的重载是Java实现多态技术的重要手段,为编程带来了很多便利。例如我们常使用的输出方法System.out.println(),就是通过重载来实现对不同的输出参数的处理。</p> 
<p align="left">&nbsp;&nbsp;&nbsp;  
方法的重载是对同一类中的同名的方法重新进行定义。</p> 
<p align="left">&nbsp;&nbsp;&nbsp;  
当方法同名时,为了让编译器区别它们,至少需要下面之一不同:</p> 
<ol> 
  <li> 
    <p align="left">参数个数不同</li> 
  <li> 
    <p align="left">参数类型不同</li> 
</ol> 
<p align="left"><b>&nbsp;&nbsp;&nbsp;  
注意:不允许参数完全相同而只是返回值不同的情况出现。</b></p> 
<p align="left">例1、方法的重载(参数个数不同)<br>
class testoverload{<br>
&nbsp; public void fun()<br>
&nbsp; {<br>
&nbsp;&nbsp; System.out.println(&quot;This method have no parameter.&quot;);<br>
&nbsp; }<br>
&nbsp; public void fun(int k)&nbsp; //这就是对方法fun的重载<br>
&nbsp; {&nbsp;<br>
&nbsp;&nbsp; System.out.println(&quot;This method have parameter k, k=&quot;+k);<br>
&nbsp; }<br>
&nbsp;public static void main(String argv[])&nbsp;<br>
&nbsp;{ testoverload a=new testoverload();<br>
&nbsp;&nbsp; a.fun();<br>
&nbsp;&nbsp; a.fun(10);&nbsp;&nbsp;&nbsp;<br>
&nbsp;}<br>
}</p>
<p align="left">在上面的例子中,编译器会根据参数的不同个数来选择具体调用哪个fun方法。</p>
<p align="left">例2、方法的重载(参数类型不同)<br>
class testoverload{<br>
&nbsp; public void fun(double k)<br>
&nbsp; {<br>
&nbsp;&nbsp; System.out.println(&quot;This method have double parameter k, 
k=&quot;+k);<br>
&nbsp; }<br>
&nbsp; public void fun(int k)&nbsp; //这就是对方法fun的重载<br>
&nbsp; {&nbsp;<br>
&nbsp;&nbsp; System.out.println(&quot;This method have integer parameter k, 
k=&quot;+k);<br>
&nbsp; }<br>
&nbsp;public static void main(String argv[])&nbsp;<br>
&nbsp;{ testoverload a=new testoverload();<br>
&nbsp;&nbsp; a.fun(13.5);<br>
&nbsp;&nbsp; a.fun(10);&nbsp;&nbsp;&nbsp;<br>
&nbsp;}<br>
}</p>
<p align="left">在上面的例子中,编译器会根据参数的不同类型来选择具体调用哪个fun方法。</p>
<p>例3、方法的重载(不完全匹配)<br>
&nbsp;&nbsp;&nbsp;&nbsp; 
有时候,虽然方法已经重载,但调用者的参数无法和其中任何一个方法的参数类型完全匹配,这时系统会进行自动类型转换,看是否有匹配的,如果有则调用相应的方法;否则编译出错。<br>
class testoverload{<br>
&nbsp; public void fun(double k)<br>
&nbsp; {<br>
&nbsp;&nbsp; System.out.println(&quot;This method have double parameter k, 
k=&quot;+k);<br>
&nbsp; }<br>
&nbsp; public void fun(int k)&nbsp; //这就是对方法fun的重载<br>
&nbsp; {&nbsp;<br>
&nbsp;&nbsp; System.out.println(&quot;This method have integer parameter k, 
k=&quot;+k);<br>
&nbsp; }<br>
&nbsp;public static void main(String argv[])&nbsp;<br>
&nbsp;{ testoverload a=new testoverload();<br>
&nbsp;&nbsp; short i=5;<br>
&nbsp;&nbsp; a.fun(i);&nbsp; //这里会自动将i转换成为int类型<br>
&nbsp;&nbsp; float k=5.5f;<br>
&nbsp;&nbsp; a.fun(k);&nbsp; //这里会自动将k转换成为double类型<br>
&nbsp;}<br>
}</p>
<p>二、构造方法的重载<br>
&nbsp;&nbsp;&nbsp; 
构造方法和普通方法一样,也可以重载,而且基本要求也一样,调用原则也一样,来看下面的例子。</p>
<p>class testoverload{<br>
&nbsp; public testoverload(double k)<br>
&nbsp; {<br>
&nbsp;&nbsp; System.out.println(&quot;This constructor method have double 
parameter k, k=&quot;+k);<br>
&nbsp; }<br>
&nbsp; public testoverload(int k)&nbsp;<br>
&nbsp; {&nbsp;<br>
&nbsp;&nbsp; System.out.println(&quot;This constructor method have integer 
parameter k, k=&quot;+k);<br>
&nbsp; }<br>
&nbsp; public&nbsp; testoverload()&nbsp;<br>
&nbsp; {&nbsp;<br>
&nbsp;&nbsp; System.out.println(&quot;This constructor method have no 
parameter.&quot;);<br>
&nbsp; }<br>
&nbsp; public static void main(String argv[])&nbsp;<br>
&nbsp; { testoverload a=new testoverload();<br>
&nbsp;&nbsp;&nbsp; a=new testoverload(5);<br>
&nbsp;&nbsp;&nbsp; a=new testoverload(1.5);<br>
&nbsp; }<br>
}</p>
<p>三、重载与覆盖<br>
&nbsp;&nbsp;&nbsp; 重载与覆盖有很多相似之处,但区别也很大。</p>
<ol>
  <li>覆盖是指子类的方法与父类的方法不仅同名,而且参数也完全一样。</li>
  <li>重载时,只是方法名相同,而参数必须不同。</li>
  <li>覆盖不可用于同一个类中,重载既可用于同一个类中,也可以是子类对父类的重载,如下例:<br>
    class father{<br>
    &nbsp;public&nbsp; void fun()<br>
    &nbsp; { System.out.println(&quot;This is father function&quot;);<br>
    &nbsp; }<br>
    }<br>
    class sun extends father{<br>
    &nbsp;public void fun(int k) //这是对父类fun方法的重载<br>
    &nbsp;{ System.out.println(&quot;This is sun function&quot;);<br>
    &nbsp; }<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 + -