面向对象编程练习

实验 3 面向对象编程练习
一、实验目的
通过编程和上机实验理解 java 语言是如何体现面向对象编程基本思想,了解类的封装方法,以及 如何创建类和对象,了解成员变量和成员方法的特性,掌握 oop 方式进行程序设计的方法,了解类的继承性和多态性的作用。
二、实验要求
1.编写一个体现面向对象思想的程序。
2.编写一个创建对象和使用对象的方法的程序。
3.编写一个显示当前日期和时间的程序。
4.编写不同成员变量修饰方法的程序。
5.编写不同成员方法修饰方法的程序。
6.编写体现类的继承性(成员变量、成员方法、成员变量隐藏)的程序。
7.编写体现类的多态性(成员方法重载、构造方法重载)的程序。
三、实验内容
(一)创建 applet 应用小程序
1.创建一个 applet 应用程序 ky3_1.java 文件。
(1)程序功能:建立一个 applet 小程序,使其可以进行简单的加法运算。该程序要包含类、接口、属性、方法、事件等面向对象的基本元素。
(2)程序源代码如下。
import java.awt.*;
import java.awt.event.*;
import java.applet.applet;
public class ky3_1 extends applet implements actionlistener {
label label1=new label(+);
label label2=new label(=);
textfield field1=new textfield(6);
textfield field2=new textfield(6);
textfield field3=new textfield(6);
button button1=new button(相加);
public void init() { // 初始化
add(field1);
add(label1);
add(field2);
add(label2);
add(field3);
add(button1);
button1.addactionlistener(this);
}
public void actionperformed(actionevent e) { // 处理按钮事件
int x=integer.parseint(field1.gettext())+integer.parseint(field2.gettext());
field3.settext(integer.tostring(x)); // 数值转换为字符串
}
}
2. 编写一个浏览 applet 应用程序的页面文件 ky3_1.html,源代码如。
3. 将 ky3_1.java 源程序编译为 ky3_1.class 文件
4. 使用浏览器或使用小程序查看器浏览 ky3_1.html 文件(即在命令提示符窗口输入:
appletviewer ky3_1.html),运行。
(二)创建对象并使用对象
1.编写 applet 程序
¨程序功能:这个 applet 程序要在页面上输出两个矩形,并伴有文字输出。
¨ky3_2.java 程序的源代码如下。
import java.awt.*;
import java.applet.applet;
public class ky3_2 extends applet {
mybox b1=new mybox();//创建对象 b1
mybox b2=new mybox(170,20,60,60); //创建对象 b2
public void paint(graphics g) {
b1.setposition(20,20);
b1.setsize(60,60);
b1.draw(g);
g.drawstring(矩形 1 的 x 位置: +b1.getx(), 20, 100);
g.drawstring(矩形 1 的 y 位置: +b1.gety(), 20, 120);
b2.draw(g);
g.drawstring(矩形 2 的 x 位置: +b2.getx(), b2.getx(), b2.gety()+80);
g.drawstring(矩形 2 的 y 位置: +b2.gety(), b2.getx(), b2.gety()+100);
}
}
class mybox {
private int x, y, width, height;
mybox() {
x=0;
y=0;
width=0;
height=0;
}
mybox(int xpos, int ypos, int w, int h) {
x=xpos;
y=ypos;
width=w;
height=h;
}
public void setposition (int xpos, int ypos) {
x=xpos;
y=ypos;
}
public void setsize (int w, int h) {
width=w;
height=h;
}
public int getx() {
return x;
}
public int gety() {
return y;
}
public void draw(graphics g) {
g.drawrect(x, y, width, height);
}
}
2.编写一个浏览 applet 应用程序的页面文件 ky3_2.html
3. 将 ky3_2.java 源程序编译为 ky3_2.class 文件
4. 使用浏览器或使用小程序查看器浏览ky3_2.html文件(即在命令提示符下输入:appletviewer
ky3_2.html),运行.
思考:程序的结构。类与对象的关系。对象创建、使用、销毁的过程。
(三)编写显示当前日期和时间的程序
1.编写applet 类文件ky3_3.java
¨程序功能:该程序通过使用一个自定义类time,实现显示当前日期和时间的功能
¨ky3_3.java 程序源代码如下。
import java.awt.graphics;
import java.applet.applet;
import java.util.calendar;
class time {
private calendar t;
private int y, m, d, hh, mm, ss;
time (){
t=calendar.getinstance();
y=t.get(t.year);
m=t.get(t.month)+1;
d=t.get(t.date);
hh=t.get(t.hour_of_day);
mm=t.get(t.minute);
ss=t.get(t.second);
}
public string getdate() {
return y+ 年+m+月+d+日;
}
public string gettime() {
string s=hh+ 时+mm+分+ss+秒;
return s;
}
}
public class ky3_3 extends applet {
time t=new time();
public void paint(graphics g) {
g.drawstring(当前日期:+t.getdate(),50,40);
g.drawstring(当前时间:+t.gettime(),50,80);
}
}
2.编写浏览ky3_3 类的页面文件ky3_3.html
3.在浏览器中浏览程序运行结果。
(四)使用修饰符
有时需要公开一些变量和方法,有时需要禁止其他对象使用变量和方法,这时可以使用修饰符来实现这个目的。常用的修饰符如下。public,private,protected,package,static,final,transient,volatile
1.程序功能:通过两个类staticdemo、ky3_4 说明静态变量/方法与实例变量/方法的区别。
2.编写类文件ky3_4.java,程序源代码如下。
class staticdemo {
static int x;
int y;
public static int getx() {
return x;
}
public static void setx(int newx) {
x = newx;
}
public int gety() {
return y;
}
public void sety(int newy) {
y = newy;
}
}
public class ky3_4 {
public static void main(string[] args) {
system.out.println(静态变量x=+staticdemo.getx());
system.out.println(实例变量y=+staticdemo.gety()); // 非法,编译时将出错
staticdemo a= new staticdemo();
staticdemo b= new staticdemo();
a.setx(1);
a.sety(2);
b.setx(3);
b.sety(4);
system.out.println(静态变量a.x=+a.getx());
system.out.println(实例变量a.y=+a.gety());
system.out.println(静态变量b.x=+b.getx());
system.out.println(实例变量b.y=+b.gety());
}
}
3.对上面的源程序进行编译,排错并运行
(五)方法中参数传递的练习
1.编写一个传值调用的程序文件ky3_5.java。
¨程序功能:程序首先给整型变量x 和y 赋一个初值10,然后使用传值调用方式调用方法ff1对x 和y 做乘方及输出x 和y 的乘方值,最后再输出x 和y 的乘方值。
¨程序源代码如下。
class ky3_5 {
public static void main(string[] args) {
int x=10, y=10;
ff1(x, y);
system.out.println(x=+x+, y=+y);
}
static void ff1(int passx, int passy) {
passx=passx*passx;
passy=passy*passy;
system.out.println(passx=+passx+, passy=+passy);
}
}
¨编译ky3_5.java
¨分析其运行结果
2.编写一个调用对象方法的程序文件ky3_6.java。
¨程序功能:通过调用对象的方法在方法调用后修改了成员变量的值。
¨ky3_6.java 程序源代码如下。
class ky3_6 {
public static void main(string[] args) {
power p=new power();
p.ff2(10,10);
system.out.println(方法调用后 x=+p.x+, y=+p.y);
}
}
class power{
int x=10, y=10;
void ff2(int passx, int passy) {
system.out.println(初始时 x=+x+, y=+y);
x=passx*passx;
y=passy*passy;
system.out.println(方法调用中 x=+x+, y=+y);
}
}
¨编译ky3_6.java
¨
以上两个实验例子仅仅是为了说明java 编程中参数传递时要注意的问题,在实际编程中是不可取的,因为完全可以采用其它更好的方法来实现参数的传递。例如,前面还使用过传递对象的方式。
思考:方法的参数传递有哪些方式?区别时什么?
(六)类的继承性练习
1. 进一步理解继承的含义
新类可从现有的类中产生,并保留现有类的成员变量和方法并可根据需要对它们加以修改。新类 还可添加新的变量和方法。这种现象就称为类的继承。
当建立一个新类时,不必写出全部成员变量和成员方法。只要简单地声明这个类是从一个已定义的类继承下来的,就可以引用被继承类的全部成员。被继承的类称为父类或超类(superclass),这个新类称为子类。
java 提供了一个庞大的类库让开发人员继承和使用。设计这些类是出于公用的目的,因此,很少有某个类恰恰满足你的需要。你必须设计自己的能处理实际问题的类,如果你设计的这个类仅仅实现了继承,则和父类毫无两样。所以,通常要对子类进行扩展,即添加新的属性和方法。这使得子类要比父类大,但更具特殊性,代表着一组更具体的对象。继承的意义就在于此。
2. 创建公共类 ky3_7_p
(1)编写程序文件 ky3_7_p.java,源代码如下。
public class ky3_7_p
{
protected string xm; //具有保护修饰符的成员变量
protected int xh;
void setdata(string m,int h) //设置数据的方法
{
xm =m;
xh = h;
}
public void print() //输出数据的方法
{
system.out.println(xm+, +xh);
}
}
(2)编译 ky3_7_p.java,产生类文件 ky3_7_p.class。
3.创建继承的类
(1)程序功能:通过 ky3_7_p 类产生子类 ky3_8,其不仅具有父类的成员变量 xm(姓名)、xh(学号),还定义了新成员变量 xy(学院)、xi(系)。在程序中调用了父类的 print 方法,同时可以看出子类也具有该方法。
(2)编写 ky3_8.java 程序,源代码如下。
class ky3_8 extends ky3_7_p
{
protected string xy;
protected string xi;
public static void main(string args[])
{
ky3_7_p p1 = new ky3_7_p();
p1.setdata(帅零,12321) ;
p1.print();
ky3_8 s1 = new ky3_8() ;
s1.setdata(郭丽娜,12345); //调用父类的成员方法
s1.xy=经济管理学院; //访问本类的成员变量
s1.xi=信息管理系; //访问本类的成员变量
s1.print();
system.out.print(s1.xm+, +s1.xy+, +s1.xi);
}
}
(3)编译并运行程序
注意:公共类 ky3_7_p 与 ky3_8 类要在同一文件夹(路径)内。
(七)类的多态性练习
1.理解类的多态性
类的继承发生在多个类之间,而类的多态只发生在同一个类上。在一个类中,可以定义多个同名的方法,只要确定它们的参数个数和类型不同。这种现象称为类的多态。
多态使程序简洁,为程序员带来很大便利。在oop 中,当程序要实现多个相近的功能时,就给相应的方法起一个共同的名字,用不同的参数代表不同的功能。这样,在使用方法时不论传递什么参数,只要能被程序识别就可以得到确定的结果。
类的多态性体现在方法的重载(overload)上,包括成员方法和构造方法的重载。
2.方法的重载
方法的重载是指对同名方法的不同使用方式。
¨程序功能:对不同的数进行排序输出。在intsort 类中定义3 个同名的方法sort,在
¨编写ky3_9.java 文件,源代码如下。
import java.awt.graphics;
import java.applet.applet;
class intsort {
public string sort(int a, int b) {
if (a>b)
return a+ +b;
else
return b+ +a;
}
public string sort(int a, int b, int c) {
int swap;
if (aswap=a;
a=b;
b=swap;
}
if (aswap=a;
a=c;
c=swap;
}
54
if (bswap=b;
b=c;
c=swap;
}
return a+ +b+ +c;
}
public string sort(int arr[]) {
string s= ;
int swap;
for (int i=0; ifor (int j=0; jarr[j+1]) {
swap=arr[j];
arr[j]=arr[j+1];
arr[j+1]=swap;
}
for (int i=0; is=s+arr[i]+ ;
return s;
}
}
public class ky3_11 extends applet {
intsort s=new intsort();
public void paint(graphics g) {
int a=30, b=12, c=40;
int arr[]={34,8,12,67,44,98,52,23,16,16};
g.drawstring(两个数的排序结果:+s.sort(a,b),30,30);
g.drawstring(三个数的排序结果:+s.sort(a,b,c),30,60);
g.drawstring(数组的排序结果:+s.sort(arr),30,90);
}
}
¨编译并运行程序
¨三个同名方法
public string sort (int a, int b)
public string sort (int a, int b, int c)
public string sort (int arr[])
¨编写ky3_10 类文件的页面文件ky3_11.html
¨
3.构造方法的重载
构造方法的名称和类同名,没有返回类型。尽管构造方法看起来和一般的成员方法没有差别,但它不是方法,也不是类的成员。因此,构造方法不能直接调用,只能由new 操作符调用。
构造方法对于类是十分重要的,对象的初始化任务要靠构造方法来完成。重载构造方法的目的是提供多种初始化对象的能力,使程序员可以根据实际需要选用合适的构造方法来初始化对象。
¨编写构造方法rundemo 的重载程序文件ky3_11,源代码如下。
class rundemo {
private string username, password;
56
rundemo() {
system.out.println(全部为空!);
}
rundemo(string name) {
username=name;
}
rundemo(string name, string pwd) {
this(name);
password=pwd;
check();
}
void check() {
string s=null;
if (username!=null)
s=用户名:+username;
else
s=用户名不能为空!;
if (password!=12345678)
s=s+ 口令无效!;
else
s=s+ 口令:********;
system.out.println(s);
}
}
public class ky3_12 {
public static void main(string[] args) {
new rundemo();
new rundemo(刘新宇);
new rundemo(null,邵丽萍);
new rundemo(张驰,12345678);
}
}
¨编译并运行程序
¨三个构造方法,其中第一个无参构造方法rundemo() 的实际作用是对成员变量赋缺省初值,由于username和password都是string 类,所以它们的缺省初值为null。第二个构造方法rundemo(string) 只有一个参数,用来对成员变量username 赋初值。第三个构造方法rundemo(string, string) 有两个参数,并有更多的内容,首先调用this(name),其实际作用就是调用当前类的构造方法rundemo(string name);然后对成员变量password 赋值;最后调用check 方法来检查username 和password,类似于一般程序的口令验证。重载构造方法的执行由对象根据实际参数的个数、类型和顺序确定。
四、思考题
1.说明使用变量之前是不是都要先声明变量。说明使用变量之前是不是都要先赋值,为什么?
2.说明什么是构造方法。
3.说明程序中有多个类时如何确定源程序文件的名称。
4.说明类的继承和多态有什么作用,在使用上应该注意什么问题。

一文读懂二极管的直流电阻和动态电阻
Grabity正在鼓励应用程序制造商将他们的应用移植到区块链上
Linux搭建Web服务
供应链上的物联网有怎样的挑战
开关电源软启动电路设计
面向对象编程练习
金士顿演示新款NVMe SSD产品线等
三星在马德里安装了首块Onyx LED 4K电影屏幕
电驱系统热管理现状
【晚间3分钟】阿里收购先声互联;世界首台光量子计算机诞生;英特尔处理器出现8个新漏洞
一加5什么时候上市?一加5最新消息:想买小米6的不妨等等,一加5或许更惊艳
区块链EOS的名词术语解释
需求逐渐上涨 中小尺寸LCD电视面板价格或将反弹
上电时序系统可加快设计和调试速度
5G尚在铺路阶段,4G时代虽已进入后期,但是潜力挖一挖还会有的
分析服务型机器人存在的安全隐患
PhonewindowManager使用详解
共模噪声的来源及影响
外媒:华为削减富士康订单!
恩智浦推出业界首款具备双通道调制解调器的AISG收发器