📄 java04_10.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.10 抽象类与最终类</b></font></p>
<p align="left">一、抽象类</p>
<p align="left">
在类的继承结构中,越往上的类越具有通用性,也就越抽象。当它抽象到一定的程度,就变成了一个概念或框架,不能再产生实例化的对象了。例如“交通工具”,就无法用它来产生一个实例。</p>
<p align="left"> 对应这一现象,Java中提供了抽象类,它只能作为父类,不能实例化。定义抽象类的作用是将一类对象的共同特点抽象出来,成为代表该类共同特性的抽象概念,其后在描述某一具体对象时,只要添加与其它子类对象的不同之处,而不需要重复类的共同特性。这样就使得程序概念层次分明,开发更高效。</p>
<p align="left">
与抽象类紧密相连的是抽象方法——它总是用在抽象类或接口中。</p>
<p align="left">1、抽象方法的定义<br>
定义一个抽象方法很简单:<br>
abstract class classname{<br>
<b> abstract void absfun();<br>
</b> }</p>
<p align="left"> 上面的absfun就是一个抽象方法,和普通方法相比,它有两个特点:一是用abstract修饰,二是只有方法的声明部分(包括方法名、修饰符、返回类型、参数列表),而没有实现部分。</p>
<p align="left"> 注意,使用abstract时有以下几个限制:</p>
<ul>
<li>
<p align="left">构造方法不能定义为abstract</li>
<li>
<p align="left">静态方法不能定义为abstract</li>
<li>
<p align="left">private方法不能定义为abstract</li>
<li>
<p align="left">包含了抽象方法的类必定是抽象类要用abstract修饰</li>
</ul>
<p align="left">
另外,语法规则规定抽象方法可以被其它方法所调用,但我们不赞成这样做。</p>
<p align="left">2、抽象类的定义<br>
要定义一个抽象类,只需要在类头部加上关键字abstract,如下面这个样子:<b><br>
</b> <b>abstract class classname</b>{<b><br>
</b>abstract void absfun();<br>
void instance(){<br>
System.out.println("这是一个实现了的方法");<br>
}<br>
}<br>
在抽象类中,<b>可以有也可以没有抽象方法</b>,也可以有普通的实例方法,也可以有静态方法。
如果类中没有任何形式的抽象方法,那么可以由程序员自主决定是否将类声明成abstract类型,但是只要是下面这些情况之一,则类必定为抽象类,必须加上abstract修饰:</p>
<ul>
<li>
<p align="left">类中明确声明有abstract方法</li>
<li>
<p align="left">类是从抽象类继承下来的,而且没有实现父类中的抽象方法</li>
<li>
<p align="left">类实现了一个接口,但没有将其中所有的抽象方法实现</li>
</ul>
<p align="left"> 我们来看下面这个例子:</p>
<p align="left">abstract class Point {<br>
int x = 1, y = 1;<br>
void move(int dx, int dy) {<br>
x += dx;<br>
y += dy;<br>
alert(); //这里调用了抽象方法<br>
}<br>
abstract void alert();<br>
}<br>
<br>
//下面这个类因为没有实现alert方法,所以必定是抽象类<br>
abstract class ColoredPoint extends Point {<br>
int color;<br>
}<br>
//下面这个类因为实现了alert方法,所以可以实例化了<br>
class SimplePoint extends Point {<br>
void alert() { <br>
System.out.println("这里实现了alert方法");<br>
}<br>
public static void main(String arbv[]){<br>
SimplePoint dot=new SimplePoint();<br>
dot.alert();<br>
dot = new ColorPoint(); //这是错误的<br>
dot = new Point(); //这也是错误的<br>
}<br>
}</p>
<p align="left">二、最终类</p>
<p align="left">
如果一个类不希望被其它类继承,则可以声明成final类,这样就可以防止其它类以它为父类。最终类通常是有某个固定作用的类,系统中也提供了这样的类,如System、String和Socket类等。</p>
<p align="left">
最终类显然不可能是抽象类。由于最终类不能有子类,那么它所拥有的所有方法都不可能被覆盖。</p>
<p align="left">1、最终类的定义</p>
<p align="left"> final class finalclass{<br>
......<br>
}<br>
用最终类的一个好处是编译器可以对它进行优化,另一个好处可以保证程序的安全性。</p>
<p align="left">2、最终方法的定义<br>
最终方法可以防止子类对它的覆盖。最终类中的方法默认都是最终方法。最终方法可以出现在任何类中,但不能和abstract修饰符同时使用。看下面的例子:</p>
<p align="left"> class father{<br>
final void fun(){<br>
System.out.println("这是最终方法");<br>
}<br>
}<br>
class sun extends father{<br>
void fun(){ //这是错误的<br>
}<br>
void fun(int k){ //这是正确的,why?<br>
}<br>
}</p>
<p align="left"><a href="index.htm">回目录</a> <a href="java04_09.htm">上一课</a>
<a href="java04_11.htm">下一课</a></p>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -