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

📄 java04_03.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.3属性的隐藏和方法的覆盖</b></font></p>

<p align="left">&nbsp;&nbsp;&nbsp;   
由于子类会自动继承父类的成员,如果该成员不符合子类的要求该怎么办呢?一种简单的方法是不使用它,另外取名,定义新的变量和方法,但有时取名是一个麻烦事。另一种方法是取同样的名字,将父类的变量和方法覆盖掉。</p>  
  
<p align="left">&nbsp;&nbsp;&nbsp;   
当子类的成员变量和父类的同名时,称为父类的成员变量(属性)被隐藏;如果是成员方法同名,称为父类的成员方法被覆盖。</p>  
  
<p align="left">一、属性的隐藏</p>  
<p align="left">class myfather{<br>   
&nbsp; int value=5;<br>  
&nbsp; void fathershow()<br>  
&nbsp; { System.out.println(&quot;这是父类的缺省修饰变量value=&quot;+value);<br>  
&nbsp; }<br>  
}<br>  
<br>  
public class testvar extends myfather{<br>   
&nbsp;int value=10;<br>  
&nbsp;void sunshow()&nbsp;<br>  
&nbsp;{<br>  
&nbsp; System.out.println(&quot;这是子类中的变量value=&quot;+value);<br>  
&nbsp; //在子类的方法中访问的value都是本类中的value<br>  
&nbsp;}&nbsp;<br>  
  public static void main(String argv[])<br>   
&nbsp;  { testvar va=new testvar();<br>   
&nbsp;&nbsp;    va.sunshow();&nbsp;<br>  
&nbsp;&nbsp; va.fathershow();<br>  
&nbsp;&nbsp; System.out.println(&quot;这是子类中的变量value=&quot;+va.value);<br>  
&nbsp;}<br>  
}</p>  
  
<p align="left">注意:在testvar这个子类中,只是暂时将父类的value变量隐藏起来,它实际上还是存在的,后面我们将通过其它的方法来访问这一变量。</p> 
 
<p align="left">二、方法的覆盖</p> 
 
<p align="left">&nbsp;&nbsp;&nbsp;  
如果子类中定义了和父类中相同的成员方法,就可以实现对父类方法的覆盖。这里的“相同”是指方法的名字、返回值、参数个数、类型、顺序要完全一样。否则就是“重载”而非“覆盖”。看下面的例子:</p> 
 
<p align="left">class myfather{<br>  
&nbsp; void commshow()<br>  
&nbsp; { System.out.println(&quot;这是父类的显示函数");<br> 
&nbsp; }<br> 
}<br> 
<br> 
class mysun extends myfather{<br>  
&nbsp; void commshow()&nbsp; //此方法覆盖了和父类中同样的方法<br> 
&nbsp; {System.out.println("这是子类的显示函数");&nbsp;<br> 
&nbsp; }&nbsp;&nbsp;<br> 
}<br> 
<br> 
public class testvar {<br>  
&nbsp;public static void main(String argv[])<br>  
&nbsp;{ mysun  va=new mysun();<br>  
&nbsp;&nbsp; va.commshow();<br> 
&nbsp; }<br> 
}</p> 
<p align="left">上面的例子中,commshow除了方法体内的语句不同,声明部分完全相同。如果将mysun中的方法声明成这个样子:</p> 
<p align="center">void commshow(int i)</p> 
<p align="left">那就不是覆盖了,显示的结果会不同。</p> 
<p align="left">覆盖时还有一个原则,就是关于访问权限的修饰符。Java遵循“公开的不再是秘密”的原则,规定子类覆盖父类的方法的访问控制权限不允许比原方法更严格,只能更宽松。例如,父类声明成:<br> 
&nbsp; protected void commshow()<br> 
则子类可以是:<br> 
&nbsp;&nbsp;&nbsp; public void commshow()<br> 
&nbsp;&nbsp;&nbsp; protected void commshow()<br> 
&nbsp;但不能是:&nbsp;<br> 
&nbsp;&nbsp;&nbsp; private void commshow()&nbsp;<br>
&nbsp;&nbsp;&nbsp; void commshow()</p> 
<p align="left"><a href="index.htm">回目录</a>   <a href="java04_02.htm">上一课</a>  
 <a href="java04_04.htm">下一课</a></p>

</body>

</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -