第 3章 面向对象的程序设计
3.1 简 介
3.2 类
3.3 对 象
3.4 实 例 研 究(无)
3.5 类的继承和类的多态性
3.6 接 口 与 包
3.1 简 介
Java是面向对象的程序设计语言,从面向对象这个角度看,体现了如下 3个特点 。
1,封装性
2,继承性
3,通信相关性
3.2 类
1,类的说明
( 1) 指出特性
( 2) 指出父类 ( extends部分 )
( 3) 指出接口 ( implements部分 )
2,类体
3.2.1 类的成员变量
1,变量的访问权限
( 1) 公用 ( public) 变量
( 2) 专用 ( private) 变量
( 3) 保护型 ( protected) 变量
( 4) 专用保护型 ( private protected)
变量
( 5) 默认型变量
2,是否为静态变量
3,是否为常量
3.2.2 类的方法其格式如下所示:
methodDeclaration{
methodBody
}
3.2.3 this和 super
this和 super是 Java的两个关键字,它们用在方法体中作为两个特殊的变量前缀和方法前缀 。 this用来指明当前对象的成员变量或方法,以区分于同名的局部变量和其它同名的方法,而 super则用于指出父类的变量和方法 。
1,this的使用场合一个对象中的方法一般可以直接访问同一对象的成员变量 。 但是,有时候方法体内部定义的变量和成员变量名字相同,
还有时方法的入口参数和对象的成员变量名字相同,那么就需要将三者区别清楚 。
因此,专门用 this 来指明当前对象的成员变量或当前对象的方法 。
2,super的使用场合在 Java中,由父类派生子类,这样,
子类的成员变量可能和父类的成员变量名字相同,子类的方法也可能和父类的方法一样 。 当需要调用父类的同名方法或使用父类的同名变量时,在子类中可用关键字
super作前缀来指明父类的成员变量和方法 。
3.2.4 构造函数
3.2.5 main方法
3.3 对 象
3.3.1 对象的创建一个对象往往经历创建,运行和释放
3个阶段,这称为对象的典型生命周期 。
创建对象包括定义对象,建立对象和初始化对象 3步 。
3.3.2 对象的使用对象使用就是指通过某种手段使一个对象产生它的效能 。 有两种途径来使用对象:一种是通过对象变量的引用来使用对象,另一种是通过调用对象的方法来使用对象 。 下面我们结合具体例子来说明 。
1.通过对象变量的引用来使用对象实际上,对象变量的引用就是用语句访问对象的变量,通过这种引用可以检测和修改变量。引用对象变量须按如下格式:
ObjectReference.variable ;
其中,ObjectReference是对象名,
variable是所引用的变量。
比如,已经由 Rectangle建立了名为
myRectangle的对象,它有 4个可以访问的变量 x,y,width和 height,那么:
myRectangle.x=2;
myRectangle.y=4;
这两个语句将矩形 myRectangle的原点定位于 X轴方向为 2,Y轴方向为 4的位置上,而语句:
rnyRectangle.width =20;
myRectangle.height=40;
则将矩形的宽定为 20,长定为 40。
对象变量的引用不仅能够检测和修改变量,也可以通过表达式来对几个变量进行合成,得到新的复合型变量。比如,用如下表达式引用对象变量:
areaMyRectangle=myRectangle.width
* myRectangle.height ;
就获得了矩形的面积,它用变量
areaMyRectangle表示。
要提到的是,对象变量的引用有时会使某个变量改得不符合要求,从而使一个对象处于不规范状态。因为这一点,在类的设计中,有些变量被设置为禁止被操作状态,从而使这些变量不允许其他对象访问。这时,对象变量引用就不可行了。
2.通过调用对象的方法来使用对象每个对象在创建的时候,一方面用变量确定了它的状态,由创建过程为它分配内存空间,另一方面也创建了与它有关的方法,每个方法都是和行为有关的。所以通过调用对象的某个方法来使用对象,从而产生某种行为,这是最符合逻辑思维习惯的。实际上,这也是更为 安全可靠地使用对象的一种手段,因为这避免了对变量的直接操作。
调用一个对象中的某个方法要遵照如下格式:
ObjectReference.methodName(paramlist);
或者:
ObjectReference.methodName();
比如,从 Rectangle 类中创建的对象
myRectangle含有一个方法叫 move(),下面的语句就是用方法 move()将对象
myRectangle移动到一个新的位置:
myRectangle.move (5,10);
这个语句产生的效果等同于下面两个语句:
myRectangle.x=5;
myRectangle.y=10;
3.3.3 对象的释放所谓释放对象,实质上就是释放掉分配给此对象的内存空间 。 Java中,对象的释放是自动完成的,不需要程序员在编程时关注这一点 。 Java 运行系统具有所谓的
,垃圾收集,机制,这种机制会周期性地检测对象是否还在使用,如发现有长期不用的对象,则给予释放,回收分配给这些对象的内存,这就是垃圾收集 。
具体运行中,垃圾收集是由一个称为
Java 垃圾收集器的程序实现的。当一个对象在使用时,Java运行系统会将其对应的内存空间设置标记;而当一个对象结束使用时,会自动清除标记。有了这种标记设置和清除的规则,Java垃圾收集器就可以通过周期性地扫描所有 Java 对象有关的内存区域标记,将没有标记的内存区列入可供分配的范畴,从而起到垃圾收集作用。
3.5 类的继承和类的多态性
3.5.1 类的继承类的继承是面向对象的程序设计语言所具有的重要技术 。 有了继承技术,程序设计时,就可以先定义一个包含公用变量和公用方法的类作为父类,再在此基础上创建具有专用变量和专用方法的子类 。 子类一方面可以增加父类中没有的变量和方法,另一方面还可以在继承基础上再定义父类中已有的变量和方法 。
Java系统要求应用程序中每个类都有父类,如果一个类的定义中没有用关键字
extends明确指出父类名,则 Java系统默认这个类的父类为系统软件包 java.1ang中的
Object类。父类中凡是公用型的、保护型的或者专用保护型的变量和方法均可由子类直接调用,只有父类的专用型变量和专用型方法不能被子类调用。
例 3-3:
// Point.java
public class Point
{
protected int x,y;
public Point() { setPoint( 0,0 ); }
public Point( int a,int b ) { setPoint( a,
b ); }
public void setPoint( int a,int b )
{
x = a;
y = b;
}
public int getX() { return x; }
public int getY() { return y; }
public String toString() { return "[" + x
+ "," + y + "]"; }
}
//Circle.java
public class Circle extends Point
{
protected double radius;
public Circle() { setRadius( 0 );}
public Circle( double r,int a,int b )
{
super( a,b );
setRadius( r );
}
public void setRadius( double r ) { radius = ( r >=
0.0? r,0.0 ); }
public double getRadius() { return radius; }
public double area() { return Math.PI * radius
* radius; }
public String toString()
{
return "Center = " + super.toString() + ";
Radius = " + radius;
}
}
// Cylinder.java
public class Cylinder extends Circle
{
protected double height;
public Cylinder() { setHeight( 0 ); }
public Cylinder( double h,double r,int a,
int b )
{
super( r,a,b );
setHeight( h );
}
public void setHeight( double h ){ height =
( h >= 0? h,0 ); }
public double getHeight() { return height; }
public double area()
{
return 2 * super.area() + 2 * Math.PI *
radius * height;
}
public double volume() { return
super.area() * height; }
public String toString()
{
return super.toString() + "; Height = "
+ height;
}
}
//Test.java
import javax.swing.JOptionPane;
import java.text.DecimalFormat;
public class Test {
public static void main( String args[] )
{
Cylinder c = new Cylinder( 5.7,2.5,12,
23 );
DecimalFormat precision2 = new
DecimalFormat( "0.00" );
String output;
output = "X coordinate is " + c.getX()
+
"\nY coordinate is " + c.getY() +
"\nRadius is " + c.getRadius() +
"\nHeight is " + c.getHeight();
c.setHeight( 10 );
c.setRadius( 4.25 );
c.setPoint( 2,2 );
output +="\n\nThe new location,radius
" +
"and height of c are\n" + c +
"\nArea is " +
precision2.format( c.area() ) +
"\nVolume is " +
precision2.format( c.volume() );
JOptionPane.showMessageDialog( null,
output,
"Demonstrating Class
Cylinder",
JOptionPane.INFORMATION_MESSAG
E );
System.exit( 0 );
}
}
运行结果见图 3-3。
图
3-
3
程序分析,Circle类继承了 Point类 。
这意 味着 Circle 的 public 接口 除了包括
Circle 类的 setRadius,getRadius,area、
toString方法和 Circle的构造函数外,还包括 Point的方法 。 应用程序 Test用来测试
Cylinder类 。
注意 Cylinder类继承了 Circle类,即
Cylinder的 public接口除了包括 Cylinder构造函数,Cylinder 的方法 setHeight、
getHeight,area( 覆盖 Circle的 area方法 ),
volume和 toSting外,还包括 Circle的方法 。
Test应用程序的 main方法首先实例化了
Cylinder类的一个对象,然后用,获取,
方法获取关于 Cylinder对象的信息 。 同样,
这里的 main方法也不能直接引用 Cylinder
类的 protected数据 。
3.5.2 类的多态性如果你想要使用多态性,则所需的条件概括如下 。
( 1) 对派生类对象方法的调用必须通过基类的变量 。
( 2) 被调用的方法必须也是基类的一个成员 。
( 3)在基类与派生类中这个方法的方法名必须相同。
( 4)在基类与派生类中这个方法的返回类型必须相同。
( 5)在派生类中这个方法的访问修饰符限制不能超过基类中的限制。
3.6 接 口 与 包
3.6.1 接口接口是和类很相似而又有区别的一种结构,接口的设计和调用也是 Java程序设计的重要技术 。 从结构上,接口有如下特点 。
( 1) 接口用关键字 interface来定义,
而不是用 class。
( 2) 接口中定义的变量全是最终的静态变量。
( 3)接口中没有自身的构造方法,而且定义的其他方法全是抽象方法,即只提供方法的定义,而没有提供方法的实现语句。
( 4)接口采用多重继承机制,而不是采用类的单一继承机制。
3.6.2 包
1,声明自己的程序包
2,程序包的引用
3,Java的系统程序包
3.1 简 介
3.2 类
3.3 对 象
3.4 实 例 研 究(无)
3.5 类的继承和类的多态性
3.6 接 口 与 包
3.1 简 介
Java是面向对象的程序设计语言,从面向对象这个角度看,体现了如下 3个特点 。
1,封装性
2,继承性
3,通信相关性
3.2 类
1,类的说明
( 1) 指出特性
( 2) 指出父类 ( extends部分 )
( 3) 指出接口 ( implements部分 )
2,类体
3.2.1 类的成员变量
1,变量的访问权限
( 1) 公用 ( public) 变量
( 2) 专用 ( private) 变量
( 3) 保护型 ( protected) 变量
( 4) 专用保护型 ( private protected)
变量
( 5) 默认型变量
2,是否为静态变量
3,是否为常量
3.2.2 类的方法其格式如下所示:
methodDeclaration{
methodBody
}
3.2.3 this和 super
this和 super是 Java的两个关键字,它们用在方法体中作为两个特殊的变量前缀和方法前缀 。 this用来指明当前对象的成员变量或方法,以区分于同名的局部变量和其它同名的方法,而 super则用于指出父类的变量和方法 。
1,this的使用场合一个对象中的方法一般可以直接访问同一对象的成员变量 。 但是,有时候方法体内部定义的变量和成员变量名字相同,
还有时方法的入口参数和对象的成员变量名字相同,那么就需要将三者区别清楚 。
因此,专门用 this 来指明当前对象的成员变量或当前对象的方法 。
2,super的使用场合在 Java中,由父类派生子类,这样,
子类的成员变量可能和父类的成员变量名字相同,子类的方法也可能和父类的方法一样 。 当需要调用父类的同名方法或使用父类的同名变量时,在子类中可用关键字
super作前缀来指明父类的成员变量和方法 。
3.2.4 构造函数
3.2.5 main方法
3.3 对 象
3.3.1 对象的创建一个对象往往经历创建,运行和释放
3个阶段,这称为对象的典型生命周期 。
创建对象包括定义对象,建立对象和初始化对象 3步 。
3.3.2 对象的使用对象使用就是指通过某种手段使一个对象产生它的效能 。 有两种途径来使用对象:一种是通过对象变量的引用来使用对象,另一种是通过调用对象的方法来使用对象 。 下面我们结合具体例子来说明 。
1.通过对象变量的引用来使用对象实际上,对象变量的引用就是用语句访问对象的变量,通过这种引用可以检测和修改变量。引用对象变量须按如下格式:
ObjectReference.variable ;
其中,ObjectReference是对象名,
variable是所引用的变量。
比如,已经由 Rectangle建立了名为
myRectangle的对象,它有 4个可以访问的变量 x,y,width和 height,那么:
myRectangle.x=2;
myRectangle.y=4;
这两个语句将矩形 myRectangle的原点定位于 X轴方向为 2,Y轴方向为 4的位置上,而语句:
rnyRectangle.width =20;
myRectangle.height=40;
则将矩形的宽定为 20,长定为 40。
对象变量的引用不仅能够检测和修改变量,也可以通过表达式来对几个变量进行合成,得到新的复合型变量。比如,用如下表达式引用对象变量:
areaMyRectangle=myRectangle.width
* myRectangle.height ;
就获得了矩形的面积,它用变量
areaMyRectangle表示。
要提到的是,对象变量的引用有时会使某个变量改得不符合要求,从而使一个对象处于不规范状态。因为这一点,在类的设计中,有些变量被设置为禁止被操作状态,从而使这些变量不允许其他对象访问。这时,对象变量引用就不可行了。
2.通过调用对象的方法来使用对象每个对象在创建的时候,一方面用变量确定了它的状态,由创建过程为它分配内存空间,另一方面也创建了与它有关的方法,每个方法都是和行为有关的。所以通过调用对象的某个方法来使用对象,从而产生某种行为,这是最符合逻辑思维习惯的。实际上,这也是更为 安全可靠地使用对象的一种手段,因为这避免了对变量的直接操作。
调用一个对象中的某个方法要遵照如下格式:
ObjectReference.methodName(paramlist);
或者:
ObjectReference.methodName();
比如,从 Rectangle 类中创建的对象
myRectangle含有一个方法叫 move(),下面的语句就是用方法 move()将对象
myRectangle移动到一个新的位置:
myRectangle.move (5,10);
这个语句产生的效果等同于下面两个语句:
myRectangle.x=5;
myRectangle.y=10;
3.3.3 对象的释放所谓释放对象,实质上就是释放掉分配给此对象的内存空间 。 Java中,对象的释放是自动完成的,不需要程序员在编程时关注这一点 。 Java 运行系统具有所谓的
,垃圾收集,机制,这种机制会周期性地检测对象是否还在使用,如发现有长期不用的对象,则给予释放,回收分配给这些对象的内存,这就是垃圾收集 。
具体运行中,垃圾收集是由一个称为
Java 垃圾收集器的程序实现的。当一个对象在使用时,Java运行系统会将其对应的内存空间设置标记;而当一个对象结束使用时,会自动清除标记。有了这种标记设置和清除的规则,Java垃圾收集器就可以通过周期性地扫描所有 Java 对象有关的内存区域标记,将没有标记的内存区列入可供分配的范畴,从而起到垃圾收集作用。
3.5 类的继承和类的多态性
3.5.1 类的继承类的继承是面向对象的程序设计语言所具有的重要技术 。 有了继承技术,程序设计时,就可以先定义一个包含公用变量和公用方法的类作为父类,再在此基础上创建具有专用变量和专用方法的子类 。 子类一方面可以增加父类中没有的变量和方法,另一方面还可以在继承基础上再定义父类中已有的变量和方法 。
Java系统要求应用程序中每个类都有父类,如果一个类的定义中没有用关键字
extends明确指出父类名,则 Java系统默认这个类的父类为系统软件包 java.1ang中的
Object类。父类中凡是公用型的、保护型的或者专用保护型的变量和方法均可由子类直接调用,只有父类的专用型变量和专用型方法不能被子类调用。
例 3-3:
// Point.java
public class Point
{
protected int x,y;
public Point() { setPoint( 0,0 ); }
public Point( int a,int b ) { setPoint( a,
b ); }
public void setPoint( int a,int b )
{
x = a;
y = b;
}
public int getX() { return x; }
public int getY() { return y; }
public String toString() { return "[" + x
+ "," + y + "]"; }
}
//Circle.java
public class Circle extends Point
{
protected double radius;
public Circle() { setRadius( 0 );}
public Circle( double r,int a,int b )
{
super( a,b );
setRadius( r );
}
public void setRadius( double r ) { radius = ( r >=
0.0? r,0.0 ); }
public double getRadius() { return radius; }
public double area() { return Math.PI * radius
* radius; }
public String toString()
{
return "Center = " + super.toString() + ";
Radius = " + radius;
}
}
// Cylinder.java
public class Cylinder extends Circle
{
protected double height;
public Cylinder() { setHeight( 0 ); }
public Cylinder( double h,double r,int a,
int b )
{
super( r,a,b );
setHeight( h );
}
public void setHeight( double h ){ height =
( h >= 0? h,0 ); }
public double getHeight() { return height; }
public double area()
{
return 2 * super.area() + 2 * Math.PI *
radius * height;
}
public double volume() { return
super.area() * height; }
public String toString()
{
return super.toString() + "; Height = "
+ height;
}
}
//Test.java
import javax.swing.JOptionPane;
import java.text.DecimalFormat;
public class Test {
public static void main( String args[] )
{
Cylinder c = new Cylinder( 5.7,2.5,12,
23 );
DecimalFormat precision2 = new
DecimalFormat( "0.00" );
String output;
output = "X coordinate is " + c.getX()
+
"\nY coordinate is " + c.getY() +
"\nRadius is " + c.getRadius() +
"\nHeight is " + c.getHeight();
c.setHeight( 10 );
c.setRadius( 4.25 );
c.setPoint( 2,2 );
output +="\n\nThe new location,radius
" +
"and height of c are\n" + c +
"\nArea is " +
precision2.format( c.area() ) +
"\nVolume is " +
precision2.format( c.volume() );
JOptionPane.showMessageDialog( null,
output,
"Demonstrating Class
Cylinder",
JOptionPane.INFORMATION_MESSAG
E );
System.exit( 0 );
}
}
运行结果见图 3-3。
图
3-
3
程序分析,Circle类继承了 Point类 。
这意 味着 Circle 的 public 接口 除了包括
Circle 类的 setRadius,getRadius,area、
toString方法和 Circle的构造函数外,还包括 Point的方法 。 应用程序 Test用来测试
Cylinder类 。
注意 Cylinder类继承了 Circle类,即
Cylinder的 public接口除了包括 Cylinder构造函数,Cylinder 的方法 setHeight、
getHeight,area( 覆盖 Circle的 area方法 ),
volume和 toSting外,还包括 Circle的方法 。
Test应用程序的 main方法首先实例化了
Cylinder类的一个对象,然后用,获取,
方法获取关于 Cylinder对象的信息 。 同样,
这里的 main方法也不能直接引用 Cylinder
类的 protected数据 。
3.5.2 类的多态性如果你想要使用多态性,则所需的条件概括如下 。
( 1) 对派生类对象方法的调用必须通过基类的变量 。
( 2) 被调用的方法必须也是基类的一个成员 。
( 3)在基类与派生类中这个方法的方法名必须相同。
( 4)在基类与派生类中这个方法的返回类型必须相同。
( 5)在派生类中这个方法的访问修饰符限制不能超过基类中的限制。
3.6 接 口 与 包
3.6.1 接口接口是和类很相似而又有区别的一种结构,接口的设计和调用也是 Java程序设计的重要技术 。 从结构上,接口有如下特点 。
( 1) 接口用关键字 interface来定义,
而不是用 class。
( 2) 接口中定义的变量全是最终的静态变量。
( 3)接口中没有自身的构造方法,而且定义的其他方法全是抽象方法,即只提供方法的定义,而没有提供方法的实现语句。
( 4)接口采用多重继承机制,而不是采用类的单一继承机制。
3.6.2 包
1,声明自己的程序包
2,程序包的引用
3,Java的系统程序包