System.out.print(i[x] + “、”);
} } } 对照范例写出如下题目:
(1).创建GrandFather类,其中包括
a)属性:姓名(name),年龄(age)
b)方法getGrandFather():显示爷爷的信息
c)构造方法:给爷爷的姓名,年龄赋值(2).创建Father类,继承Grandfather类 a)属性:除了继承爷爷的属性以外,还要增加自己的属性:“职业”(occupation)b)构造方法:显式调用父类的构造方法,为Father类的姓名和年龄赋初始值。再为职业输入初始值。
c)方法getFather(): 显示父亲的相关信息
(3).创建ClassMain()类,定义main()方法,构造GrandFather类的对象和Father类的对象,并分别显示详细信息。
3、面向对象多态性
范例:计算柱体的体积。柱体体积计算公式是:底部面积乘以高度 柱体底部分为 圆形和矩形 要求:通过抽象类和多态实现 package cn.jit.demo;abstract class Bottom { //父类抽象类 底部
public abstract double calculatorArea();} class CircleBottom extends Bottom{ //圆形底
/** * 半径
*/ private double radius;
@Override public double calculatorArea(){
return Math.PI * radius * radius;} public double getRadius(){
金陵科技学院实验报告
return radius;} public void setRadius(double radius){
this.radius = radius;} public CircleBottom(double radius){
super();
this.radius = radius;} } class SquareBottom extends Bottom{ //矩形底
private double sideA;
private double sideB;public double getSideA(){
return sideA;} public void setSideA(double sideA){
this.sideA = sideA;} public double getSideB(){
return sideB;} public void setSideB(double sideB){
this.sideB = sideB;} @Override public double calculatorArea(){
return sideA * sideB;} public SquareBottom(double sideA, double sideB){
super();
this.sideA = sideA;
this.sideB = sideB;} } class ZhuTi { //柱体类,完成形状的拼装
/** * 底
*/ private Bottom bottom;/** * 高
*/
金陵科技学院实验报告
private double height;/** * 计算体积
* @return */ public double calculatorVolumn(){
return bottom.calculatorArea()* height;} public ZhuTi(Bottom bottom, double height){
super();
this.bottom = bottom;
this.height = height;} public Bottom getBottom(){
return bottom;} public void setBottom(Bottom bottom){
this.bottom = bottom;} public double getHeight(){
return height;} public void setHeight(double height){
this.height = height;} public void changeBottom(Bottom bottom){
this.bottom = bottom;} } public class VolumnTest { //测试类
public static void main(String[] args){
Bottom bottom = new CircleBottom(1.0);
double height = 1.0;
ZhuTi zhuTi = new ZhuTi(bottom,height);
double result = zhuTi.calculatorVolumn();
System.out.println(“圆柱体的体积是:” + result);
bottom = new SquareBottom(1.0,1.0);
zhuTi.changeBottom(bottom);
result = zhuTi.calculatorVolumn();
System.out.println(“立方体的体积是:” + result);} } 范例:接口和多态的应用,例如:电脑上实现了USB接口,U盘,打印机等等也都实现了此标准。
金陵科技学院实验报告
interface USB{ public void start();// 开始工作
public void stop();// 结束工作 } class Computer{ public static void plugin(USB usb){
usb.start();
usb.stop();} };class Flash implements USB{ public void start(){
System.out.println(“U盘开始工作。”);} public void stop(){
System.out.println(“U盘停止工作。”);} };class Print implements USB{ public void start(){
System.out.println(“打印机开始工作。”);} public void stop(){
System.out.println(“打印机停止工作。”);} };public class InterPolDemo02{ public static void main(String args[]){
Computer.plugin(new Flash());
Computer.plugin(new Print());} };对照范例,写出以下程序:(1)乐器(Instrument)的标准为弹奏(play),而乐器类型分为:钢琴(Piano)和小提琴(Violin),各种乐器的弹奏方法各不同。编写代码实现不同乐器的弹奏。(2)计算机模拟
四、实验结果与分析(程序运行结果及其分析)
五、实验体会
金陵科技学院实验报告
实验项目名称: 类集
实验学时: 4 同组学生姓名: 实验地点: 实验日期: 实验成绩: 批改教师: 批改时间:
金陵科技学院实验报告
实验2 类集
一、实验目的和要求(1)理解类集概念
(2)熟悉Collection接口、List接口、Set接口和Map接口(3)掌握ArrayList类、HashSet类和TreeSet类(4)理解TreeMap、HashMap
二、实验仪器和设备
奔腾以上个人计算机,windows操作系统。
配置好JDK环境,安装集成开发环境(Eclipse)
三、实验内容与过程
1、类集应用
范例:实现一个超市管理系统,要求可以添加货物,删除货物和查询货物:
。代码如下:
public interface Goods { public String getName();// 得到商品名称
public int getCount();// 得到商品数量
public float getPrice();// 得到商品价格 }
public class Book implements Goods {
private String name;private int count;private float price;
public Book(){ }
public Book(String name, int count, float price){
this.name = name;
this.count = count;
this.price = price;}
public String getName(){
return name;}
public void setName(String name){
this.name = name;
金陵科技学院实验报告
}
public int getCount(){
return count;}
public void setCount(int count){
this.count = count;}
public float getPrice(){
return price;}
public void setPrice(float price){
this.price = price;}
public boolean equals(Object obj){
if(this == obj){
return true;
}
if(!(obj instanceof Book)){
return false;
}
Book b =(Book)obj;
if(b.name.equals(this.name)&& b.count == this.count
&& b.price == this.price){
return true;
} else {
return false;
} }
public int hashCode(){
return this.name.hashCode()+ new Integer(this.count).hashCode()
+ new Float(this.price).hashCode();}
public String toString(){
return “书名:” + this.name + “;书的价格:” + this.price + “;书的数量:”
+ this.count;}
金陵科技学院实验报告
}
import java.util.ArrayList;import java.util.Iterator;import java.util.List;
public class SuperMarket { private List allGoods;
public SuperMarket(){
this.allGoods = new ArrayList();}
public void add(Goods goods){
this.allGoods.add(goods);}
public void remove(Goods goods){
this.allGoods.remove(goods);}
public List search(String keyWord){
List temp = new ArrayList();
Iterator iter = this.allGoods.iterator();
while(iter.hasNext()){
Goods g = iter.next();
if(g.getName().indexOf(keyWord)!=-1){
temp.add(g);
}
}
return temp;}
public List getAllGoods(){
return this.allGoods;} }
import java.util.Iterator;import java.util.List;
public class Test {
金陵科技学院实验报告
public static void main(String[] args){
SuperMarket mak = new SuperMarket();
mak.add(new Book(“Java”, 2, 30.9f));
mak.add(new Book(“C++”, 3, 10.9f));
mak.add(new Book(“JSP”, 5, 80.9f));
print(mak.search(“J”));
mak.remove(new Book(“Java”, 2, 30.9f));
print(mak.search(“J”));}
public static void print(List all){
Iterator iter = all.iterator();
while(iter.hasNext()){
System.out.println(iter.next());
} } } 对照范例写出如下题目:
(1)宠物商店,要求可以添加、删除和查找宠物(2)实现以下两个关系
A、一个学校可以有多个学生,所有学生属于一个学校
B、一门课程可以有多个学生选,一个学生可以选多门课程
四、实验结果与分析(程序运行结果及其分析)
五、实验体会
金陵科技学院实验报告
实验项目名称: Java IO操作
实验学时: 6 同组学生姓名: 实验地点: 实验日期: 实验成绩: 批改教师: 批改时间:
金陵科技学院实验报告
实验3 Java IO操作
一、实验目的和要求
(1)理解输入输出流概念(2)掌握文件输入输出流
(3)掌握键盘的输入、显示器的输出(4)理解其他输入输出流
二、实验仪器和设备
奔腾以上个人计算机,windows操作系统。
配置好JDK环境,安装集成开发环境(Eclipse)
三、实验内容与过程
1、编写类模拟命令Copy
范例:实现文件的复制代码。参考代码如下:
File file1 = new File(“d:”+File.seperator +”demo.txt”);
// 找到第一个文件的File对象
File file2 = new File(“d:”+File.seperator +”cemo.txt”);// 找到目标文件路径 InputStream input = new FileInputStream(file1);// 输入流 OutputStream output = new FileOutputStream(file2);// 输出流 int temp = 0;// 定义一个整数表示接收的内容
while((temp = input.read())!=-1){ // 表示还有内容可以继续读
output.write(temp);// 写入数据 } input.close();// 关闭 output.close();// 关闭
2、通过键盘的输入,实现简单的选项操作。
*********XXXX管理系统***********
[1]添加
[2]删除
[3]修改
[4]查询
[5]退出
3、编写一个简单管理系统,实现真实的操作。
四、实验结果与分析(程序运行结果及其分析)
五、实验体会
金陵科技学院实验报告
实验项目名称: JDBC
实验学时: 6 同组学生姓名: 实验地点: 实验日期: 实验成绩: 批改教师: 批改时间:
金陵科技学院实验报告
实验4 JDBC
一、实验目的和要求(1)理解JDBC分类
(2)掌握JDBC数据库连接步骤
(3)掌握JDBC连接MySQL数据库代码(4)理解JDBC连接其他数据库方式
二、实验仪器和设备
奔腾以上个人计算机,windows操作系统。
配置好JDK环境,安装集成开发环境(Eclipse)
三、实验内容与过程
1、安装MySQL数据库,配置好数据库
创建一个数据库表,按要求给出详细的字段设计
pid name age birthday salary
主要操作:
2、创建Eclipse项目,配置驱动包
每个数据库厂商都会提供对Java开发技术的支持,即都会提供对应的Java驱动,也就是一个jar包
主要操作:
3、项目中建立一个详细例子,按照要求连接、操作、关闭数据库
按照标准的步骤完成对MySQL数据库的操作
主要代码:(添加、修改、删除和查询)
金陵科技学院实验报告
4、试着连接其他类型数据库。
四、实验结果与分析(程序运行结果及其分析)
五、实验体会
实验项目七
1、实验项目名称: 监听和过滤
2、实验项目性质:验证性
3、实验要求:必修
4、计划学时数:2学时
5、实验内容:
(1).实现网上书店项目后台管理用户的过滤功能。具体要求如下:
禁止用户非法访问,只有登录成功才能访问后台页面。
没有登录,直接访问后台其他页面,将跳转到登录页面。
(2).在网上书店项目中增加监听功能,当用户登录成功时自动更新数据库中该用户的登录次数。
(3).实现网上书店项目后台图书管理中的修改图书信息功能模块。具体要求如下: 在图书管理页面bookManager.jsp中,单击“修改图书信息”按钮,对选定的图书进行修改。
一次只能修改一本图书信息。
修改页面中显示图书的原有数据。
图书ISBN不可修改。
(4).实现网上书店项目后台用户管理中的修改用户信息功能模块。具体要求如下: 在用户管理页面userManager.jsp页面中,单击“修改用户信息”按钮,对选定的用户信息进行修改。
一次只能修改一个用户信息。
修改页面中显示该用户原有信息。
用户名不可修改。
根据第七章所学内容以及上机实践情况,在实验报告中完成以下问题。
(1).编写一个过滤器,名称为ForceNoCacheFilter,通过使用此过滤器使浏览器不缓存任何页面。在实验报告中给出其中的关键代码。
(2).画图说明Servlet上下文监听器的工作流程。
6、项目需用仪器设备名称: 计算机
7、所需主要元器件及耗材:无
8、实验项目目的和任务:
(1).了解监听器原理及生命周期中的方法。
(2).掌握Servlet上下文监听。掌握HTTP会话监听。了解请求监听。
(3).理解过滤器原理及生命周期。掌握实现一个过滤器的步骤。了解过滤器链。
Java程序设计课程实验
上机实践1 初识JAVA.................................................................................................................3 实验
1一个简单的应用程序....................................................................................................3 实验
2一个简单的JAVA APPLET程序......................................................................................3 实验
3联合编译........................................................................................................................4 上机实践2 基本数据类型与控制语句........................................................................................5 实验1
输出希腊字母表............................................................................................................5 实验2
回文数............................................................................................................................6 实验3
猜数字游戏....................................................................................................................8 上机实践3 类与对象....................................................................................................................9 实验1
三角形、梯形和圆形的类封装.....................................................................................9 实验
2实例成员与类成员......................................................................................................12 实验
3使用PACKAGE语句与IMPORT语句............................................................................14 上机实践4 继承与接口..............................................................................................................16 实验
1继承..............................................................................................................................16 实验2
上转型对象..................................................................................................................19 实验3 接口回调.....................................................................................................................21 上机实践5 字符串、时间与数字..............................................................................................23 实验
1STRING类的常用方法..................................................................................................23 实验
2比较日期的大小..........................................................................................................24 实验
3处理大整数..................................................................................................................25 上机实践6 组件及事件处理......................................................................................................26 实验1
算术测试......................................................................................................................26 实验2
信号灯..........................................................................................................................29 实验3
布局与日历..................................................................................................................31 上机实践7 组件及事件处理2...................................................................................................35 实验1
方程求根......................................................................................................................35 实验2
字体对话框..................................................................................................................38 实验3
英语单词拼写训练......................................................................................................41 上机实践8 多线程.....................................................................................................................45 实验1
汉字打字练习..............................................................................................................45 实验2
旋转的行星..................................................................................................................47 实验3
双线程接力..................................................................................................................51 上机实践9 输入输出流..............................................................................................................54 实验1
学读汉字......................................................................................................................54 实验2
统计英文单词字..........................................................................................................57 实验2
读取ZIP文件...............................................................................................................61 上机实践10 JAVA 中的网络编程............................................................................................62 实验1
读取服务器端文件......................................................................................................62 实验2
使用套接字读取服务器端对象...................................................................................64 实验3
基于UDP的图像传输................................................................................................67 上机实践11 数据结构................................................................................................................71 实验1
扫雷小游戏..................................................................................................................71 实验2
排序与查找..................................................................................................................76 实验3
使用TREESET排序......................................................................................................77 上机实践12 JAVA SWING.......................................................................................................79 实验1
JLAYEREDPANE分层窗格............................................................................................79 实验2
使用表格显示日历......................................................................................................80 实验3
多文档界面(MDI)...................................................................................................83 2
上机实践1 初识Java 实验1 一个简单的应用程序
1.答案:
【代码1】:
System.out.println(“你好,很高兴学习Java”);【代码2】:
System.out.println(“We are students”);2.模板代码
Hello.java public class Hello {
public static void main(String args[ ])
{
【代码1】
//命令行窗口输出“你好,很高兴学习Java”
A a=new A();
a.fA();
} } class A {
void fA()
{
【代码2】
//命令行窗口输出“We are students”
} } 实验2 一个简单的Java Applet程序
1.答案:
【代码1】:
g.drawString(“这是一个Java Applet 程序”,10,30);【代码2】:
g.drawString(“我改变了字体”,20,50);2.模板代码
FirstApplet.java import java.applet.*;3 import java.awt.*;public class FirstApplet extends Applet { public void paint(Graphics g){ g.setColor(Color.blue);【代码1】//在Java Applet中绘制一行文字:“这是一个Java Applet 程序” g.setColor(Color.red);g.setFont(new Font(“宋体”,Font.BOLD,36));【代码2】//在Java Applet中绘制一行文字:“我改变了字体” } } 实验3 联合编译
1.答案:
【代码1】:
System.out.println(“你好,只需编译我”);【代码2】:
System.out.println(“I am A”);【代码3】:
System.out.println(“I am B”);【代码4】:
System.out.println(“I am C”);2.模板代码
模板1:Hello.java public class MainClass { public static void main(String args[ ]){ 【代码1】 //命令行窗口输出“你好,只需编译我” A a=new A();a.fA();B b=new B();b.fB();} }
模板2 :A.java
public class A { void fA(){ 【代码2】 //命令行窗口输出“I am A” } } 模板3 :B.java
public class B { void fB(){ 【代码3】 //命令行窗口输出“I am B” } } 模板4 :C.java
public class C { void fC(){ 【代码4】 //命令行窗口输出“I am C” } }
上机实践2 基本数据类型与控制语句实验1 输出希腊字母表
1.答案:
【代码1】: startPosition=(int)cStart;
【代码2】: endPosition=(int)cEnd;
【代码3】: c=(char)i;
2.模板代码
GreekAlphabet.java
public class GreekAlphabet {
public static void main(String args[ ])
{
int startPosition=0,endPosition=0;
char cStart='α',cEnd='ω';
【代码1】
//cStart做int型转换据运算,并将结果赋值给startPosition
【代码2】
//cEnd做int型转换运算,并将结果赋值给endPosition
System.out.println(“希腊字母'α'在unicode表中的顺序位置:”+(int)c);
System.out.println(“希腊字母表:”);
for(int i=startPosition;i<=endPosition;i++)
{
char c=' ';
【代码3】
//i做char型转换运算,并将结果赋值给c
System.out.print(“ ”+c);if((i-startPosition+1)%10==0)
System.out.println(“");
}
} } 实验2 回文数
1.答案:
【代码1】: number<=99999&&number>=1 【代码2】: d5=number/10000;【代码3】: d4=number%10000/1000;【代码4】: d3=number%1000/100;【代码5】: d5!=0 【代码6】: d1==d5&&d2==d4 【代码7】: d4!=0
【代码8】: d1==d4&&d2==d3 【代码9】: d3!=0 【代码10】:d1==d3 2.模板代码
Number.java import javax.swing.JOptionPane;public class Number {
public static void main(String args[])
{
int number=0,d5,d4,d3,d2,d1;
String str=JOptionPane.showInputDialog(”输入一个1至99999之间的数“);
number=Integer.parseInt(str);
if(【代码1】)//判断number在1至99999之间的条件
{
【代码2】
//计算number的最高位(万位)d5
【代码3】
//计算number的千位d4
【代码4】
//计算number的百位d3
d2=number%100/10;
d1=number%10;
if(【代码5】)//判断number是5位数的条件
{
System.out.println(number+”是5位数“);
if(【代码6】)//判断number是回文数的条件
{
System.out.println(number+”是回文数“);
}
else
{
System.out.println(number+”不是回文数“);
}
}
else if(【代码7】)//判断number是4位数的条件
{
System.out.println(number+”是4位数“);
if(【代码8】)//判断number是回文数的条件码
{
System.out.println(number+”是回文数“);
}
else
{
System.out.println(number+”不是回文数“);
}
}
else if(【代码9】)//判断number是3位数的条件
{
System.out.println(number+”是3位数“);
if(【代码10】)//判断number是回文数的条件
{
System.out.println(number+”是回文数“);
}
else
{
System.out.println(number+”不是回文数“);
}
}
else if(d2!=0)
{
System.out.println(number+”是2位数“);
if(d1==d2)
{
System.out.println(number+”是回文数“);
}
else
{
System.out.println(number+”不是回文数“);
}
}
else if(d1!=0)
{
System.out.println(number+”是1位数“);
System.out.println(number+”是回文数“);
}
}
else
{
System.out.printf(”n%d不在1至99999之间“,number);
}
} } 实验3 猜数字游戏
1.答案:
【代码1】: yourGuess!=realNumber 【代码2】: yourGuess>realNumber
【代码3】: yourGuess2.模板代码
GuessNumber.java import javax.swing.JOptionPane;public class GuessNumber {
public static void main(String args[ ])
{
System.out.println(”给你一个1至100之间的整数,请猜测这个数“);
int realNumber=(int)(Math.random()*100)+1;
int yourGuess=0;
String str=JOptionPane.showInputDialog(”输入您的猜测:“);
yourGuess=Integer.parseInt(str);
while(【代码1】)//循环条件
{
if(【代码2】)//条件代码
{
str=JOptionPane.showInputDialog(”猜大了,再输入你的猜测:“);
yourGuess=Integer.parseInt(str);
}
else if(【代码3】)//条件代码
{
str=JOptionPane.showInputDialog(”猜小了,再输入你的猜测:“);
yourGuess=Integer.parseInt(str);
}
}
System.out.println(”猜对了!“);
} }
上机实践3 类与对象
实验1 三角形、梯形和圆形的类封装
1.答案:
【代码1】:
sideA=a;sideB=b;sideC=c;
【代码2】:
a+b>c&&a+c>b&&c+b>a
【代码3】:
boo=true;
【代码4】:
boo=false;
【代码5】:
if(boo)
{
length=sideA+sideB+sideC;
return length;
}
else
{
System.out.println(”不是一个三角形,不能计算周长“);
return 0;
}
【代码6】:
sideA=a;sideB=b;sideC=c;【代码7】: a+b>c&&a+c>b&&c+b>a 【代码8】: boo=true;【代码9】: boo=false;【代码10】:
above=a;
bottom=b;
height=h;
【代码11】:
area=(above+bottom)/2*height;
return area;【代码12】: radius=r;9 【代码13】: return 3.14*radius*radius;【代码14】: return 3.14*2*radius;【代码15】: circle=new Circle(10);【代码16】: trangle=new Trangle(3,4,5);【代码17】: lader=new Lader(3,4,10);【代码18】: length=circle.getLength();【代码19】: area=circle.getArea();【代码20】: length=trangle.getLength();【代码21】: area=trangle.getArea();【代码22】: area=lader.getArea();【代码23】: trangle.setABC(12,34,1);【代码24】: area=trangle.getArea();【代码25】: length=trangle.getLength();
2.模板代码
AreaAndLength.java
class Trangle
{
double sideA,sideB,sideC,area,length;
boolean boo;
public Trangle(double a,double b,double c)
{
【代码1】 //参数a,b,c分别赋值给sideA,sideB,sideC
if(【代码2】)//a,b,c构成三角形的条件表达式
{
【代码3】 //给boo赋值。
}
else
{
【代码4】 //给boo赋值。
}
}
double getLength()
{
【代码5】 //方法体,要求计算出length的值并返回
}
public double getArea()
{
if(boo)
{
double p=(sideA+sideB+sideC)/2.0;
area=Math.sqrt(p*(p-sideA)*(p-sideB)*(p-sideC));
return area;
}
else
{
System.out.println(”不是一个三角形,不能计算面积“);
return 0;
}
}
public void setABC(double a,double b,double c)
{
【代码6】 //参数a,b,c分别赋值给sideA,sideB,sideC
if(【代码7】)//a,b,c构成三角形的条件表达式
{
【代码8】 //给boo赋值。
}
else
{
【代码9】 //给boo赋值。
}
} } class Lader {
double above,bottom,height,area;
Lader(double a,double b,double h)
{
【代码10】 //方法体,将参数a,b,c分别赋值给above,bottom,height
}
double getArea()
{
【代码11】 //方法体,,要求计算出area返回
} }
class Circle {
double radius,area;
Circle(double r)
{
【代码12】 //方法体
}
double getArea()
{
【代码13】 //方法体,要求计算出area返回
}
double getLength()
{
【代码14】 //getArea方法体的代码,要求计算出length返回
}
void setRadius(double newRadius)
{
radius=newRadius;
}
double getRadius()
{
return radius;
} } public class AreaAndLength {
public static void main(String args[])
{
double length,area;
Circle circle=null;
Trangle trangle;
Lader lader;
【代码15】 //创建对象circle
【代码16】 //创建对象trangle。
【代码17】 //创建对象lader
【代码18】 // circle调用方法返回周长并赋值给length
System.out.println(”圆的周长:“+length);
【代码19】 // circle调用方法返回面积并赋值给area
System.out.println(”圆的面积:“+area);
【代码20】 // trangle调用方法返回周长并赋值给length
System.out.println(”三角形的周长:“+length);
【代码21】 // trangle调用方法返回面积并赋值给area
System.out.println(”三角形的面积:“+area);
【代码22】 // lader调用方法返回面积并赋值给area
System.out.println(”梯形的面积:“+area);
【代码23】 // trangle调用方法设置三个边,要求将三个边修改为12,34,1。
【代码24】 // trangle调用方法返回面积并赋值给area
System.out.println(”三角形的面积:“+area);
【代码25】 // trangle调用方法返回周长并赋值给length
System.out.println(”三角形的周长:“+length);
} } 实验2 实例成员与类成员
1.答案:
【代码1】: float a;
【代码2】: static float b;
【代码3】: this.a=a;
【代码4】: this.b=b;【代码5】: A.b=100;
【代码6】: A.inputB();
【代码7】: cat.setA(200);【代码8】: cat.setB(400);【代码9】: dog.setA(150);【代码10】:dog.setB(300);【代码11】:cat.inputA();【代码12】:cat.inputB();【代码13】:dog.inputA();【代码14】:dog.inputB();2.模板代码
Example.java class A {
【代码1】
//声明一个float型实例变量a
【代码2】
//声明一个float型类变量b,即static变量b
void setA(float a)
{
【代码3】
//将参数a的值赋值给成员变量a
}
void setB(float b)
{
【代码4】
//将参数b的值赋值给成员变量b
}
float getA()
{
return a;
}
float getB()
{
return b;
}
void inputA()
{
System.out.println(a);
}
static void inputB()
{
System.out.println(b);
} } public class Example {
public static void main(String args[])
{
【代码5】
//通过类名操作类变量b,并赋值100
【代码6】
//通过类名调用方法inputB()
A cat=new A();
A dog=new A();
【代码7】
//cat象调用方法setA(int a)将cat的成员a的值设置为200
【代码8】
//cat调用方法setB(int b)将cat的成员b的值设置为400
【代码9】
//dog象调用方法setA(int a)将dog的成员a的值设置为150
【代码10】
//dog调用方法setB(int b)将dog的成员b的值设置为300
【代码11】
//cat调用inputA()。
【代码12】
//cat调用inputB()。
【代码13】
//dog调用inputA()。
【代码14】
//dog调用inputB()。
} } 实验3 使用package语句与import语句
1.答案:无 2.模板代码
SquareEquation.java package tom.jiafei;public class SquareEquation {
double a,b,c;
double root1,root2;
boolean boo;
public SquareEquation(double a,double b,double c)
{
this.a=a;
this.b=b;
this.c=c;
if(a!=0)
{
boo=true;
}
else
{
boo=false;
}
}
public void getRoots()
{
if(boo)
{
System.out.println(”是一元2次方程“);
double disk=b*b-4*a*c;
if(disk>=0)
{
root1=(-b+Math.sqrt(disk))/(2*a);
root2=(-b-Math.sqrt(disk))/(2*a);
System.out.printf(”方程的根:%f,%fn“,root1,root2);
}
else
{
System.out.printf(”方程没有实根n“);
}
}
else
{
System.out.println(”不是一元2次方程“);
}
}
public void setCoefficient(double a,double b,double c)
{
this.a=a;
this.b=b;
this.c=c;
if(a!=0)
{
boo=true;
}
else
{
boo=false;
}
} } SunRise.java import tom.jiafei.*;class SunRise {
public static void main(String args[ ])
{
SquareEquation equation=new SquareEquation(4,5,1);
equation.getRoots();
equation.setCoefficient(-3,4,5);
equation.getRoots();
} }
上机实践4 继承与接口
实验1 继承
1.答案:
【代码1】:
public void speakHello()
{
System.out.println(”你好,吃饭了吗?“);
}
【代码2】:
public void averageHeight()
{
height=173;
System.out.println(”中国人的平均身高:“+height+”厘米“);
}
【代码3】:
public void averageWeight()
{
weight=67.34;
System.out.println(”中国人的平均体重:“+weight+”公斤“);
}
【代码4】: System.out.println(”坐如钟,站如松,睡如弓“);
【代码5】:
public void speakHello()
{
System.out.println(”How do You do“);
}
【代码6】:
public void averageHeight()
{
height=188;
System.out.println(”Amerian Average height:“+height+” cm“);
}
【代码7】:
public void averageWeight()
{
weight=80.23;
System.out.println(”Amerian Average weight:“+weight+” kg“);
}
【代码8】: System.out.println(”直拳、钩拳“);
【代码9】:
public void speakHello()
{
System.out.println(”您好“);
}
【代码10】:
public void averageHeight()
{
height=16;
System.out.println(”北京人的平均身高:“+height+”厘米“);
}
【代码11】:
public void averageWeight()
{
weight=6;
System.out.println(”北京人的平均体重:“+weight+”公斤“);
}
【代码12】: System.out.println(”京剧术语“);2.模板代码
Example.java class People { protected double weight,height;public void speakHello(){ System.out.println(”yayawawa“);} public void averageHeight(){ height=173;System.out.println(”average height:“+height);} public void averageWeight(){ weight=70;System.out.println(”average weight:“+weight);} } class ChinaPeople extends People { 【代码1】 //重写public void speakHello()方法,要求输出类似“你好,吃了吗”这样的 //汉语信息
【代码2】 //重写public void averageHeight()方法,要求输出类似 //“中国人的平均身高:168.78厘米”这样的汉语信息 【代码3】 //重写public void averageWeight()方法,//要求输出类似“中国人的平均体重:65公斤”这样的汉语信息 public void chinaGongfu(){ 【代码4】//输出中国武术的信息,例如:”坐如钟,站如松,睡如弓“等 } } class AmericanPeople extends People { 【代码5】 //重写public void speakHello()方法,要求输出类似 //“How do you do”这样的英语信息。【代码6】 //重写public void averageHeight()方法 【代码7】 //重写public void averageWeight()方法 public void americanBoxing(){ 【代码8】//输出拳击的信息,例如,“直拳”、“钩拳”等 } } class BeijingPeople extends ChinaPeople { 【代码9】 //重写public void speakHello()方法,要求输出类似“您好”这样的汉语信息
【代码10】 //重写public void averageHeight()方法
【代码11】 //重写public void averageWeight()方法 public void beijingOpera(){ 【代码12】//输出京剧的信息 } } public class Example { public static void main(String args[]){ ChinaPeople chinaPeople=new ChinaPeople();18 AmericanPeople americanPeople=new AmericanPeople();BeijingPeople beijingPeople=new BeijingPeople();chinaPeople.speakHello();americanPeople.speakHello();beijingPeople.speakHello();chinaPeople.averageHeight();americanPeople.averageHeight();beijingPeople.averageHeight();chinaPeople.averageWeight();americanPeople.averageWeight();beijingPeople.averageWeight();chinaPeople.chinaGongfu();americanPeople.americanBoxing();beijingPeople.beijingOpera();beijingPeople.chinaGongfu();} } 实验2 上转型对象
1.答案:
【代码1】:
public double earnings()
{
return 50000.456;
} 【代码2】:
public double earnings()
{
return 12*2300;
}
【代码3】:
public double earnings()
{
return 52*500;
} 【代码4】:
for(int i=0;i{
salaries=salaries+employee[i].earnings();
} 2.模板代码
HardWork.java abstract class Employee {
public abstract double earnings();} class YearWorker extends Employee {
【代码1】 //重写earnings()方法 } class MonthWorker extends Employee {
【代码2】 //重写earnings()方法。} class WeekWorker extends Employee {
【代码3】 //重写earnings()方法。} class Company {
Employee[] employee;
double salaries=0;
Company(Employee[] employee)
{
this.employee=employee;
}
public double salariesPay()
{
salaries=0;
【代码4】 //计算salaries。
return salaries;
}
} public class HardWork {
public static void main(String args[])
{
Employee[] employee=new Employee[20];
for(int i=0;i{
if(i%3==0)
employee[i]=new WeekWorker();
else if(i%3==1)
employee[i]=new MonthWorker();
else if(i%3==2)
employee[i]=new YearWorker();
}
Company company=new Company(employee);
System.out.println(”公司年工资总额:“+company.salariesPay());
} }
实验3 接口回调
1.答案:
【代码1】:
public double computeWeight()
{ return 45.5;
} 【代码2】:
public double computeWeight()
{ return 65.5;
}
【代码3】:
public double computeWeight()
{
return 145;
}
【代码4】:
for(int k=0;k{
totalWeights=totalWeights+goods[k].computeWeight();
}
2.模板代码
Road.java
interface ComputerWeight {
public double computeWeight();} class Television implements ComputerWeight {
【代码1】 //实现computeWeight()方法。} class Computer implements ComputerWeight {
【代码2】 //实现computeWeight()方法。}
class WashMachine implements ComputerWeight { 【代码3】 //实现computeWeight()方法。} class Car { ComputerWeight[] goods;
double totalWeights=0;
Car(ComputerWeight[] goods)
{
this.goods=goods;
}
public double getTotalWeights()
{
totalWeights=0;
【代码4】 //计算totalWeights
return totalWeights;
}
} public class Road {
public static void main(String args[])
{ ComputerWeight[] goodsOne=new ComputerWeight[50],goodsTwo=new ComputerWeight[22];
for(int i=0;i{
if(i%3==0)
goodsOne[i]=new Television();
else if(i%3==1)
goodsOne[i]=new Computer();
else if(i%3==2)
goodsOne[i]=new WashMachine();
}
for(int i=0;i{
if(i%3==0)
goodsTwo[i]=new Television();
else if(i%3==1)
goodsTwo[i]=new Computer();
else if(i%3==2)
goodsTwo[i]=new WashMachine();
}
Car 大货车=new Car(goodsOne);
System.out.println(”大货车装载的货物重量:“+大货车.getTotalWeights());
Car 小货车=new Car(goodsTwo);
System.out.println(”小货车装载的货物重量:“+小货车.getTotalWeights());
} } 上机实践5 字符串、时间与数字
实验1 String类的常用方法
模板代码
StringExample.java class StringExample {
public static void main(String args[])
{
String s1=new String(”you are a student“),s2=new String(”how are you“);
if(【代码1】)// 使用equals方法判断s1与s2是否相同
{
System.out.println(”s1与s2相同“);
}
else
{
System.out.println(”s1与s2不相同“);
}
String s3=new String(”***24“);
if(【代码2】)
//判断s3的前缀是否是“220302”。
{
System.out.println(”吉林省的身份证“);
}
String s4=new String(”你“),s5=new String(”我“);
if(【代码3】)//按着字典序s4大于s5的表达式。
{
System.out.println(”按字典序s4大于s5“);
}
else
{
System.out.println(”按字典序s4小于s5“);
}
int position=0;
String path=”c:javajspA.java“;
position=【代码5】 //获取path中最后出现目录分隔符号的位置
System.out.println(”c:javajspA.java中最后出现的位置:“+position);
String fileName=【代码6】//获取path中“A.java”子字符串。
System.out.println(”c:javajspA.java中含有的文件名:“+fileName);
String s6=new String(”100“),s7=new String(”123.678“);
int n1=【代码7】
//将s6转化成int型数据。
double n2=【代码8】
//将s7转化成double型数据。
double m=n1+n2;
System.out.println(m);
String s8=【代码9】 //String调用valuOf(int n)方法将m转化为字符串对象
position=s8.indexOf(”.“);
String temp=s8.substring(position+1);
System.out.println(”数字“+m+”有“+temp.length()+”位小数“);
String s9=new String(”ABCDEF“);
char a[]=【代码10】
//将s8存放到数组a中。
for(int i=a.length-1;i>=0;i--)
{
System.out.print(” “+a[i]);
}
} } 实验2 比较日期的大小
模板代码 DateExample import java.util.*;import javax.swing.JOptionPane;public class DateExample {
public static void main(String args[ ])
{
String str=JOptionPane.showInputDialog(”输入第一个日期的年份:“);
int yearOne=Integer.parseInt(str);
str=JOptionPane.showInputDialog(”输入该年的月份:“);
int monthOne=Integer.parseInt(str);
str=JOptionPane.showInputDialog(”输入该月份的日期:“);
int dayOne=Integer.parseInt(str);
str=JOptionPane.showInputDialog(”输入第二个日期的年份:“);
int yearTwo=Integer.parseInt(str);
str=JOptionPane.showInputDialog(”输入该年的月份:“);
int monthTwo=Integer.parseInt(str);
str=JOptionPane.showInputDialog(”输入该月份的日期:“);
int dayTwo=Integer.parseInt(str);
Calendar calendar=【代码1】
//初始化日历对象
【代码2】
//将calendar的时间设置为yearOne年monthOne月dayOne日
long timeOne=【代码3】
//calendar表示的时间转换成毫秒
【代码4】
//将calendar的时间设置为yearTwo年monthTwo月dayTwo日
long timeTwo=【代码5】
//calendar表示的时间转换成毫秒。
Date date1=【代码6】
// 用timeOne做参数构造date1
Date date2=【代码7】
// 用timeTwo做参数构造date2
if(date2.equals(date1))
{
System.out.println(”两个日期的年、月、日完全相同“);
}
else if(date2.after(date1))
{
System.out.println(”您输入的第二个日期大于第一个日期“);
}
else if(date2.before(date1))
{
System.out.println(”您输入的第二个日期小于第一个日期“);
}
long days=【代码8】//计算两个日期相隔天数
System.out.println(yearOne+”年“+monthOne+”月“+dayOne+”日和“
+yearTwo+”年“+monthTwo+”月“+dayTwo+”相隔“+days+”天“);
}
} 实验3 处理大整数
模板代码
BigintegerExample import java.math.*;class BigIntegerExample { public static void main(String args[]){ BigInteger n1=new BigInteger(”***321987654321“), n2=new BigInteger(”***789123456789“), result=null;result=【代码1】//n1和n2做加法运算 System.out.println(”和:“+result.toString());result=【代码2】//n1和n2做减法运算 System.out.println(”差:“+result.toString());result=【代码3】//n1和n2做乘法运算 System.out.println(”积:“+result.toString());result=【代码4】//n1和n2做除法运算 System.out.println(”商:“+result.toString());BigInteger m=new BigInteger(”1968957“), COUNT=new BigInteger(”0“), ONE=new BigInteger(”1“), TWO=new BigInteger(”2“);System.out.println(m.toString()+”的因子有:“);for(BigInteger i=TWO;i.compareTo(m)<0;i=i.add(ONE)){ if((n1.remainder(i).compareTo(BigInteger.ZERO))==0){ COUNT=COUNT.add(ONE);System.out.print(” “+i.toString());} } System.out.println(”“);System.out.println(m.toString()+”一共有“+COUNT.toString()+”个因子“);} } 上机实践6 组件及事件处理
实验1 算术测试
模板代码 Teacher.java public class Teacher { int numberOne,numberTwo;String operator=”“;boolean right;public int giveNumberOne(int n){ numberOne=(int)(Math.random()*n)+1;return numberOne;} public int giveNumberTwo(int n){ numberTwo=(int)(Math.random()*n)+1;return numberTwo;} public String giveOperator(){ double d=Math.random();if(d>=0.5)operator=”+“;else operator=”-“;return operator;} public boolean getRight(int answer){ if(operator.equals(”+“))26 { if(answer==numberOne+numberTwo)right=true;else right=false;} else if(operator.equals(”-“)){ if(answer==numberOne-numberTwo)right=true;else right=false;} return right;} } ComputerFrame.java import java.awt.*;import java.awt.event.*;public class ComputerFrame extends Frame implements ActionListener { TextField textOne,textTwo,textResult;Button getProblem,giveAnwser;Label operatorLabel,message;Teacher teacher;ComputerFrame(String s){ super(s);teacher=new Teacher();setLayout(new FlowLayout());textOne=【代码1】 //创建textOne,其可见字符长是10 textTwo=【代码2】 //创建textTwo,其可见字符长是10 textResult=【代码3】 //创建textResult,其可见字符长是10 operatorLabel=new Label(”+“);message=new Label(”你还没有回答呢“);getProblem=new Button(”获取题目“);giveAnwser=new Button(”确认答案“);add(getProblem);add(textOne);add(operatorLabel);add(textTwo);add(new Label(”=“));add(textResult);add(giveAnwser);add(message);textResult.requestFocus();textOne.setEditable(false);textTwo.setEditable(false);【代码4】//将当前窗口注册为getProblem的ActionEvent事件监视器 【代码5】//将当前窗口注册为giveAnwser的ActionEvent事件监视器
【代码6】//将当前窗口注册为textResult的ActionEvent事件监视器 setBounds(100,100,450,100);setVisible(true);validate();addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0);} });} public void actionPerformed(ActionEvent e){ if(【代码7】)//判断事件源是否是getProblem { int number1=teacher.giveNumberOne(100);int number2=teacher.giveNumberTwo(100);String operator=teacher.givetOperator();textOne.setText(”“+number1);textTwo.setText(”“+number2);operatorLabel.setText(operator);message.setText(”请回答“);textResult.setText(null);} if(【代码8】)//判断事件源是否是giveAnwser { String answer=textResult.getText();try{ int result=Integer.parseInt(answer);if(teacher.getRight(result)==true){ message.setText(”你回答正确“);} else { message.setText(”你回答错误“);} } catch(NumberFormatException ex){ message.setText(”请输入数字字符“);} } textResult.requestFocus();validate();} }
MainClass.java public class MainClass { public static void main(String args[]){ ComputerFrame frame;frame=【代码9】//创建窗口,其标题为:算术测试 } } 实验2 信号灯
2.模板代码
SignalCanvas.java import java.awt.*;public class SignalCanvas extends Canvas { int red,green,yellow,x,y,r;SignalCanvas(){ setBackground(Color.white);} public void setRed(int r){ red=r;} public void setGreen(int g){ green=g;} public void setYellow(int y){ yellow=y;} public void setPosition(int x,int y){ this.x=x;this.y=y;} public void setRadius(int r){ this.r=r;} public void paint(Graphics g){ if(red==1){ g.setColor(Color.red);} else if(green==1){ g.setColor(Color.green);} else if(yellow==1){ g.setColor(Color.yellow);} g.fillOval(x,y,2*r,2*r);} } SignalFrame.java import java.awt.*;import java.applet.*;import java.awt.event.*;public class SignalFrame extends Frame implements ItemListener { Choice choice;SignalCanvas signal=null;String itemRed=”红灯“,itemYellow=”黄灯“,itemGreen=”绿灯“;public SignalFrame(){ choice=【代码1】 //创建choice 【代码2】 //创建choice添加itemRed 【代码3】 //创建choice添加itemYellow 【代码4】 //创建choice添加itemGreen 【代码5】
//将当前窗口注册为choice的ItemEvent事件监视器 add(choice,BorderLayout.NORTH);try{ Class cs=Class.forName(”SignalCanvas“);signal=(SignalCanvas)cs.newInstance();add(signal,BorderLayout.CENTER);} catch(Exception e){ add(new Label(”您还没有编写SignalCanvas类“),BorderLayout.CENTER);} setBounds(100,100,360,300);setVisible(true);validate();addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0);} });} public void itemStateChanged(ItemEvent e){ String item= 【代码6】
// choice返回被选中的条目 int w=signal.getBounds().width;int h=signal.getBounds().height;int m=Math.min(w,h);signal.setRadius(m/6);if(item.equals(itemRed)){ if(signal!=null){ signal.setRed(1);signal.setYellow(0);signal.setGreen(0);signal.setPosition(w/3,0);signal.repaint();} } else if(item.equals(itemYellow)){ if(signal!=null){ signal.setRed(0);signal.setYellow(1);signal.setGreen(0);signal.setPosition(w/3,h/3);signal.repaint();} } else if(item.equals(itemGreen)){ if(signal!=null){ signal.setRed(0);signal.setYellow(0);signal.setGreen(1);signal.setPosition(w/3,2*h/3);signal.repaint();} } } } SignalMainClass.java public class SignalMainClass { public static void main(String args[]){ SignalFrame frame;frame=new SignalFrame();frame.setTitle(”信号灯“);} } 实验3 布局与日历
1.答案:
【代码1】:
pCenter.setLayout(new GridLayout(7,7));【代码2】:
pCenter.add(titleName[i]);
【代码3】:
pCenter.add(labelDay[i]);
【代码4】:
add(scrollPane,BorderLayout.CENTER);31
【代码5】:
add(pNorth,BorderLayout.NORTH);
【代码6】:
add(pSouth,BorderLayout.SOUTH);
2.模板代码
CalendarBean.java import java.util.Calendar;public class CalendarBean
{
String day[];
int year=2005,month=0;
public void setYear(int year)
{
this.year=year;
}
public int getYear()
{
return year;
}
public void setMonth(int month)
{
this.month=month;
}
public int getMonth()
{
return month;
}
public String[] getCalendar()
{
String a[]=new String[42];
Calendar 日历=Calendar.getInstance();
日历.set(year,month-1,1);
int 星期几=日历.get(Calendar.DAY_OF_WEEK)-1;
int day=0;
if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
{ day=31;
}
if(month==4||month==6||month==9||month==11)
{ day=30;
}
if(month==2)
{ if(((year%4==0)&&(year%100!=0))||(year%400==0))
{
day=29;
}
else
{
day=28;
}
}
for(int i=星期几,n=1;i<星期几+day;i++)
{
a[i]=String.valueOf(n);
n++;
}
return a;
} } CalendarFrame.java import java.util.*;import java.awt.*;import java.awt.event.*;import java.applet.*;public class CalendarFrame extends Frame implements ActionListener {
Label labelDay[]=new Label[42];
Button titleName[]=new Button[7];
String name[]={”日“,”一“,”二“,”三“, ”四“,”五“,”六“};
Button nextMonth,previousMonth;
int year=2006,month=10;
CalendarBean calendar;
Label showMessage=new Label(”“,Label.CENTER);
public CalendarFrame()
{ Panel pCenter=new Panel();
【代码1】 //将pCenter的布局设置为7行7列的GridLayout 布局。
for(int i=0;i<7;i++)
{ titleName[i]=new Button(name[i]);
【代码2】//pCenter添加组件titleName[i]。
}
for(int i=0;i<42;i++)
{
labelDay[i]=new Label(”“,Label.CENTER);
【代码3】//pCenter添加组件labelDay[i]。
}
calendar=new CalendarBean();
calendar.setYear(year);
calendar.setMonth(month);
String day[]=calendar.getCalendar();
for(int i=0;i<42;i++)
{ labelDay[i].setText(day[i]);
}
nextMonth=new Button(”下月“);
previousMonth=new Button(”上月“);
nextMonth.addActionListener(this);
previousMonth.addActionListener(this);
Panel pNorth=new Panel(),pSouth=new Panel();33
pNorth.add(previousMonth);
pNorth.add(nextMonth);
pSouth.add(showMessage);
showMessage.setText(”日历:“+calendar.getYear()+”年“+ calendar.getMonth()+”月“);
ScrollPane scrollPane=new ScrollPane();
scrollPane.add(pCenter);
【代码4】// 窗口添加scrollPane在中心区域
【代码5】// 窗口添加pNorth 在北面区域
【代码6】// 窗口添加pSouth 在南区域。
}
public void actionPerformed(ActionEvent e)
{ if(e.getSource()==nextMonth)
{ month=month+1;
if(month>12)
month=1;
calendar.setMonth(month);
String day[]=calendar.getCalendar();
for(int i=0;i<42;i++)
{ labelDay[i].setText(day[i]);
}
}
else if(e.getSource()==previousMonth)
{ month=month-1;
if(month<1)
month=12;
calendar.setMonth(month);
String day[]=calendar.getCalendar();
for(int i=0;i<42;i++)
{ labelDay[i].setText(day[i]);
}
}
showMessage.setText(”日历:“+calendar.getYear()+”年“+calendar.getMonth()+”月“);
} }
CalendarMainClass.java public class CalendarMainClass { public static void main(String args[])
{
CalendarFrame frame=new CalendarFrame();
frame.setBounds(100,100,360,300);
frame.setVisible(true);
frame.validate();
frame.addWindowListener(new java.awt.event.WindowAdapter()34
{ public void windowClosing(java.awt.event.WindowEvent e)
{ System.exit(0);
}
});
} }
上机实践7 组件及事件处理2 实验1 方程求根
1.答案:
【代码1】:
controlButton.addActionListener(this);;【代码2】:
textA.getText()
【代码3】:
textB.getText()
【代码4】:
textC.getText()
2.模板代码
SquareEquation.java public class SquareEquation { double a,b,c;double root1,root2;public void setA(double a){ this.a=a;} public void setB(double b){ this.b=b;} public void setC(double c){ this.c=c;} public double getRootOne()throws NoRealRootException,NoSquareEquationException { if(a!=0){ double disk=b*b-4*a*c;if(disk>=0){ root1=(-b+Math.sqrt(disk))/(2*a);} else { throw new NoRealRootException(”没有实根“);35 } } else { throw new NoRealRootException(”不是二次方程“);} return root1;} public double getRootTwo()throws NoRealRootException,NoSquareEquationException { if(a!=0){ double disk=b*b-4*a*c;if(disk>=0){ root2=(-b-Math.sqrt(disk))/(2*a);} else { throw new NoRealRootException(”没有实根“);} } else { throw new NoRealRootException(”不是二次方程“);} return root2;} } class NoRealRootException extends Exception { String message;NoRealRootException(String s){ message=s;} public String getMessage(){ return message;} } class NoSquareEquationException extends Exception { String message;NoSquareEquationException(String s){ message=s;} public String getMessage(){ return message;} } EquationFrame.java
import java.awt.*;import java.awt.event.*;public class EquationFrame extends Frame implements ActionListener { SquareEquation equation;TextField textA,textB,textC;TextArea showRoots;Button controlButton;public EquationFrame(){ equation=new SquareEquation();textA=new TextField(8);textB=new TextField(8);textC=new TextField(8);showRoots=new TextArea();controlButton=new Button(”确定“);Panel pNorth=new Panel();pNorth.add(new Label(”二次项系数:“));pNorth.add(textA);pNorth.add(new Label(”一次项系数:“));pNorth.add(textB);pNorth.add(new Label(”常数项系数:“));pNorth.add(textC);pNorth.add(controlButton);【代码1】 //当前窗口作为controlButton的ActionEvent事件的监视器 add(pNorth,BorderLayout.NORTH);add(showRoots,BorderLayout.CENTER);setBounds(100,100,630,160);setVisible(true);validate();addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0);} });} public void actionPerformed(ActionEvent e){ try{ double a=Double.parseDouble(【代码2】);//textA调用方法获取其中的文本
double b=Double.parseDouble(【代码3】);//textB调用方法获取其中的文本
double c=Double.parseDouble(【代码4】);// textC调用方法获取其中的文本
equation.setA(a);equation.setB(b);equation.setC(c);textA.setText(”“+a);37 textB.setText(”“+b);textC.setText(”“+c);showRoots.append(”n 根:“+equation.getRootOne());showRoots.append(” 根:“+equation.getRootTwo());} catch(Exception ex){ showRoots.append(”n“+ex+”n“);} } } EquationMainClass.java public class EquationMainClass { public static void main(String args[]){ EquationFrame frame=new EquationFrame();} } 实验2 字体对话框
1.答案:
【代码1】:
setModal(true);
【代码2】:
setVisible(false);
【代码3】:
setVisible(false);
【代码4】:
new FontDialog(this);【代码5】:
setVisible(true);【代码6】:
dialog.setTitle(”字体对话框“);
2.模板代码
FontFamilyNames.java import java.awt.GraphicsEnvironment;public class FontFamilyNames { String fontName[];public String [] getFontName(){ GraphicsEnvironment ge=GraphicsEnvironment.getLocalGraphicsEnvironment();fontName=ge.getAvailableFontFamilyNames();return fontName;} } FontDialog.java import java.awt.event.*;import java.awt.*;import javax.swing.JLabel;
public class FontDialog extends Dialog implements ItemListener,ActionListener { FontFamilyNames fontFamilyNames;int fontSize=38;String fontName;Choice fontNameList;JLabel label;Font font;Button yes,cancel;static int YES=1,NO=0;int state=-1;FontDialog(Frame f){ super(f);fontFamilyNames=new FontFamilyNames();【代码1】 //对话框设置为有模式 yes=new Button(”Yes“);cancel=new Button(”cancel“);yes.addActionListener(this);cancel.addActionListener(this);label=new JLabel(”hello,奥运“,JLabel.CENTER);fontNameList=new Choice();String name[]=fontFamilyNames.getFontName();for(int k=0;k label.setFont(font);label.repaint();validate();} public void actionPerformed(ActionEvent e){ if(e.getSource()==yes){ state=YES;【代码2】 //对话框设置为不可见 } else if(e.getSource()==cancel){ state=NO;【代码3】 //对话框设置为不可见 } } public int getState(){ return state;} public Font getFont(){ return font;} }
FrameHaveDialog.java import java.awt.event.*;import java.awt.*;import javax.swing.JTextArea;public class FrameHaveDialog extends Frame implements ActionListener { JTextArea text;Button buttonFont;FrameHaveDialog(){ buttonFont=new Button(”设置字体“);text=new JTextArea(”Java 2实用教程(第三版)“);buttonFont.addActionListener(this);add(buttonFont,BorderLayout.NORTH);add(text);setBounds(60,60,300,300);setVisible(true);validate();addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0);} });} 40 public void actionPerformed(ActionEvent e){ if(e.getSource()==buttonFont){ FontDialog dialog=【代码4】 //创建对话框
【代码5】 //对话框设置为可见
【代码6】 //对话框设置设置标题为“字体对话框” if(dialog.getState()==FontDialog.YES){ text.setFont(dialog.getFont());text.repaint();} if(dialog.getState()==FontDialog.NO){ text.repaint();} } } } FontDialogMainClass.java public class FontDialogMainClass { public static void main(String args[]){ new FrameHaveDialog();} } 实验3 英语单词拼写训练
1.答案:
【代码1】: addFocusListener(this);
【代码2】:
addMouseListener(this);
【代码3】:
label[k].addKeyListener(this);
【代码4】:
e.getKeyCode()==KeyEvent.VK_LEFT 【代码5】:
e.getKeyCode()==KeyEvent.VK_RIGHT 2.模板代码
RondomString.java public class RondomString { String str=”“;public String getRondomString(String s){ StringBuffer strBuffer=new StringBuffer(s);int m=strBuffer.length();for(int k=0;k strBuffer=strBuffer.deleteCharAt(index);} return str;} } LetterLabel.java
import java.awt.*;import java.awt.event.*;public class LetterLabel extends Button implements FocusListener,MouseListener { LetterLabel(){ 【代码1】 //将当前对象注册为自身的焦点视器 【代码2】 //将当前对象注册为自身的标监视器 setBackground(Color.cyan);setFont(new Font(”“,Font.BOLD,30));} public static LetterLabel[] getLetterLabel(int n){ LetterLabel a[]=new LetterLabel[n];for(int k=0;kimport java.awt.*;import java.awt.event.*;import javax.swing.Box;
public class SpellingWordFrame extends Frame implements KeyListener,ActionListener { TextField inputWord;Button button;LetterLabel label[];Panel northP,centerP;Box wordBox;String hintMessage=”用鼠标单击字母,按左右箭头交换字母,将其排列成所输入的单词“;Label messaageLabel=new Label(hintMessage);String word=”“;SpellingWordFrame(){ inputWord=new TextField(12);button=new Button(”确定“);button.addActionListener(this);inputWord.addActionListener(this);northP=new Panel();northP.add(new Label(”输入一个英文单词:“));northP.add(inputWord);northP.add(button);centerP=new Panel();wordBox=Box.createHorizontalBox();centerP.add(wordBox);add(northP,BorderLayout.NORTH);add(centerP,BorderLayout.CENTER);add(messaageLabel,BorderLayout.SOUTH);setBounds(100,100,350,180);setVisible(true);validate();addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0);} });} public void actionPerformed(ActionEvent e){ word=inputWord.getText();int n=word.length();RondomString rondom=new RondomString();String randomWord=rondom.getRondomString(word);wordBox.removeAll();messaageLabel.setText(hintMessage);if(n>0){ label=LetterLabel.getLetterLabel(n);for(int k=0;k { 【代码3】 //将当前窗口注册为label[k]的键盘监视器 label[k].setText(”“+randomWord.charAt(k));wordBox.add(label[k]);} validate();inputWord.setText(null);label[0].requestFocus();} } public void keyPressed(KeyEvent e){ LetterLabel sourceLabel=(LetterLabel)e.getSource();int index=-1;if(【代码4】)//判断按下的是否是←键){ for(int k=0;k { String success=”“;for(int k=0;kWordMainClass.java public class WordMainClass { public static void main(String args[]){ new SpellingWordFrame();} } 上机实践8 多线程
实验1 汉字打字练习
1.答案:
【代码1】:
sleep(6000);
【代码2】:
WordThread giveWord;
【代码3】:
giveWord=new WordThread(wordLabel);
【代码4】:
giveWord.isAlive()
【代码5】:
giveWord.start();
2.模板代码
WordThread.java
import java.awt.*;public class WordThread extends Thread { char word;int k=19968;45
Label com;WordThread(Label com){ this.com=com;} public void run(){ k=19968;while(true){ word=(char)k;com.setText(”“+word);try{ 【代码1】//调用sleep方法使得线程中断6000豪秒 } catch(InterruptedException e){} k++;if(k>=29968)k=19968;} } } ThreadFrame.java
import java.awt.*;import java.awt.event.*;public class ThreadFrame extends Frame implements ActionListener { Label wordLabel;Button button;TextField inputText,scoreText;【代码2】//用WordThread声明一个giveWord对象 int score=0;ThreadFrame(){ wordLabel=new Label(” “,Label.CENTER);wordLabel.setFont(new Font(”“,Font.BOLD,72));button=new Button(”开始“);inputText=new TextField(3);scoreText=new TextField(5);scoreText.setEditable(false);【代码3】//创建giveWord,将wordLabel传递给WordThread构造方法的参数 button.addActionListener(this);inputText.addActionListener(this);add(button,BorderLayout.NORTH);add(wordLabel,BorderLayout.CENTER);Panel southP=new Panel();southP.add(new Label(”输入标签所显示的汉字后回车:“));southP.add(inputText);southP.add(scoreText);
add(southP,BorderLayout.SOUTH);setBounds(100,100,350,180);setVisible(true);validate();addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0);} });} public void actionPerformed(ActionEvent e){ if(e.getSource()==button){ if(!(【代码4】))//giveWord调用方法isAlive(){ giveWord=new WordThread(wordLabel);} try { 【代码5】//giveWord调用方法start()} catch(Exception exe){} } else if(e.getSource()==inputText){ if(inputText.getText().equals(wordLabel.getText())){ score++;} scoreText.setText(”得分:"+score);inputText.setText(null);} } } WordThread.java
public class ThreadWordMainClass { public static void main(String args[]){ new ThreadFrame();}
实验2 旋转的行星
1.答案:
【代码1】:
Thread moon;
【代码2】:
thread=new Thread(this);
【代码3】:
Thread.sleep(10);
【代码4】:
Thread rotate;【代码5】:
rotate.start();
2.模板代码
Mycanvas.java
import java.awt.*;public class Mycanvas extends Canvas { int r;Color c;public void setColor(Color c){ this.c=c;} public void setR(int r){ this.r=r;} public void paint(Graphics g){ g.setColor(c);g.fillOval(0,0,2*r,2*r);} public int getR(){ return r;} } Planet.java
import java.awt.*;public class Planet extends Panel implements Runnable { 【代码1】 //用Thread类声明一个moon对象 Mycanvas yellowBall;double pointX[]=new double[360], pointY[]=new double[360];//用来表示画布左上角端点坐标的数组 int w=100,h=100;int radius=30;Planet(){ setSize(w,h);setLayout(null);yellowBall=new Mycanvas();yellowBall.setColor(Color.yellow);add(yellowBall);yellowBall.setSize(12,12);yellowBall.setR(12/2);pointX[0]=0;48 pointY[0]=-radius;double angle=1*Math.PI/180;//刻度为1度
for(int i=0;i<359;i++)//计算出数组中各个元素的值
{ pointX[i+1]=pointX[i]*Math.cos(angle)-Math.sin(angle)*pointY[i];pointY[i+1]=pointY[i]*Math.cos(angle)+pointX[i]*Math.sin(angle);
} for(int i=0;i<360;i++){ pointX[i]=pointX[i]+w/2;//坐标平移 pointY[i]=pointY[i]+h/2;} yellowBall.setLocation((int)pointX[0]-yellowBall.getR(),(int)pointY[0]-yellowBall.getR());【代码2】 //创建 moon线程,当前面板做为该线程的目标对象 } public void start(){ try{ moon.start();}
catch(Exception exe){} } public void paint(Graphics g){ g.setColor(Color.blue);g.fillOval(w/2-9,h/2-9,18,18);} public void run(){ int i=0;while(true){ i=(i+1)%360;yellowBall.setLocation((int)pointX[i]-yellowBall.getR(),(int)pointY[i]-yellowBall.getR());try{ 【代码3】 // Thread类调用类方法sleep使得线程中断10豪秒 } catch(InterruptedException e){} } } } HaveThreadFrame.java
import java.awt.*;import java.awt.event.*;public class HaveThreadFrame extends Frame implements Runnable { 【代码4】 //用Thread类声明一个rotate对象 Planet earth;double pointX[]=new double[360], pointY[]=new double[360];int width,height;
int radius=120;HaveThreadFrame(){ rotate=new Thread(this);earth=new Planet();setBounds(0,0,360,400);width=getBounds().width;height=getBounds().height;pointX[0]=0;pointY[0]=-radius;double angle=1*Math.PI/180;for(int i=0;i<359;i++){ pointX[i+1]=pointX[i]*Math.cos(angle)-Math.sin(angle)*pointY[i];pointY[i+1]=pointY[i]*Math.cos(angle)+pointX[i]*Math.sin(angle);} for(int i=0;i<360;i++){ pointX[i]=pointX[i]+width/2;pointY[i]=pointY[i]+height/2;} setLayout(null);setVisible(true);validate();addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0);} });add(earth);earth.setLocation((int)pointX[0]-earth.getSize().width/2,(int)pointY[0]-earth.getSize().height/2);earth.start();【代码5】 //用rotate调用start方法 } public void run(){ int i=0;while(true){ i=(i+1)%360;earth.setLocation((int)pointX[i]-earth.getSize().width/2,(int)pointY[i]-earth.getSize().height/2);try{ Thread.sleep(100);} catch(InterruptedException e){} } }
《Java程序设计》
授 课 人:授课班级:电子商务专业
授
课
教
案
第一章
Java语言简介
教学目的要求
了解Java的基本特点和用途 掌握如何下载Java SDK软件包 了解设置Java程序的开发环境SDK 如何运行Java程序 了解Java的概貌 主要内容
Java语言的发展历程; Java语言的特点; Java语言的开发工具;
Java应用程序和小程序; Java程序的注释方法; 写Java程序的风格规范。
重点内容
Java语言的特点; Java语言的开发工具;
Java应用程序和小程序;
难点内容
无
课时分配
1课时 教学方法
讲授法、演示法、对比法 讲授内容提要
1.1
Java语言的发展简介
1991年Sun Mircosystem 公司成立了一个Green项目开发小组,Jame Gosling 为组长; 设计Java 采用虚拟机代码(Virtual Machine Code),即.class文件,它通过解释器运行 ; 1995年5月Sun Mircosystem 公司对外正式发布Java1.0;
Java2 用途:适用于各种应用开发,尤其是网络应用,网络服务和嵌入式系统。1.2
Java语言的特点 1.简单性 2.面向对象 3.网络适用性 4.健壮性 5.安全性
6.平台无关性 7.可移植性 8.解释型 9.高性能 10.多线程 11.动态性 12.丰富的类库 13.嵌入浏览器运行
1.3
Java类库的概念 1.4
网络浏览器 1.5
Java开发工具
NetBeans: 这个集成环境可以方便地进行程序的编辑、编译、生成和运行。J2sdk :
http:// java.sun.com免费下载;Visual J++ 6.0 / 8.0: VJ++还吸收了VB集成开发环境IDE的特征,是一个强有力的Java程序开发工具。Jcreator
Eclipse(MyEclipse)等
1.6
Java程序的分类 基于控制台的应用程序;
基于浏览器运行的小程序applet。
小程序与应用程序的区别是:小程序必须依赖一个HTML文件和支持Java的网络浏览器。老师演示小程序和applet程序
应用程序举例(程序1-1): public class hello {
public static void main(String args[ ]){
System.out.println(“Hello Java!”);
} }
小程序举例(程序1-2):
import java.awt.Graphics;
// 注意该行的含义 import java.applet.Applet;public class sayhello extends Applet {
public void paint(Graphics g){
g.drawString(“Hello Java!”,35,30);
} }
小程序对应的HTML文件:
1.7
1.8 对Java程序的解释
编写Java程序的风格要求 课堂练习:
请编写一个应用程序输出你自己的学号和姓名 课外练习(作业): 下载并安装J2SDK; 设置系统环境变量 下载并安装MyEclipse 熟悉MyEclipse的开发环境
第2章
数据类型、运算符和表达式
教学目的要求
掌握字符常量和符号表示的常量的概念和应用 掌握整形、浮点型、字符型和布尔型变量的概念和应用 掌握数据的概念 理解参数传递方式
学会逻辑运算符、算术运算符和位运算符的使用方法
主要内容
常量:包括字面常量和符号表示的常量; 变量:整形、浮点型、字符型和布尔型; 数组:Java的数组属于类类型; 参数传递方式;
运算符:包括逻辑运算符、算术运算符和位运算符等;
重点内容
整形、浮点型、字符型和布尔型变量的概念和应用; 符常量和符号表示的常量的概念和应用
难点内容
参数传递方式
课时分配
2课时 教学方法
讲授法、演示法、对比法、实验验证法 讲授内容提要
2.1
常量
整形常量:采用八进制、十进制、十六进制表示,但不能采用二进制表示,和C/C++中的一样。
浮点常量:采用十进制或科学记数法表示。在缺省情况下一个浮点数是double型。布尔常量:true和false,它们不是数,不能进行算术运算。字符常量:与C/C++中的表示类似
。字符串常量:Java中字符串常量是对象。
2.2
变量
变量的命名原则是:以字母(’a’„’z’和 ’A’„’Z’)、下划线(‘_’)和‘$’符号开头的,由字母、数字(’0’„’9’)、下划线和‘$’构成的一个符号序列。
例如,a,_a,NameOfStudent,$10均是合法变量名,而-a和9a是非法变量名。关键字不能用作变量名(见表2-1)注意:Java对变量是区分大小写.2.2.1
整形类型的变量 字节(byte)型,8个位。
短整形(short),占16个位。整形(int),占32个位。
长整形(long int),占64个位。
Java中的整形最值均有符号。例如程序2-1测试最值:
public class Test_Int {
// 程序2-1 测试整形变量的最值
public static void main(String [ ] args){
System.out.println(Byte.MAX_VALUE);
System.out.println(Byte.MIN_VALUE);
System.out.println(Short.MAX_VALUE);System.out.println(Short.MIN_VALUE);
System.out.println(Integer.MAX_VALUE);
System.out.println(Integer.MIN_VALUE);
System.out.println(Long.MAX_VALUE);
System.out.println(Long.MIN_VALUE);
} }
注意: byte、short、int、long是原子类型,而Byte、Short、Integer和Long分别是四种原子类型对应的类类型。
2.2.2
字符类型变量
Java字符量的长度为16个位,表示范围是从‘u0000’ 到 ‘uffff’ 即从0 到 65535; Character是char类型对应的类类型 ; 最大值 Character.MAX_VALUE ; 最小值 Character.MIN_VALUE ; 2.2.3
浮点类型变量 分类:float和double。
Float、Double 是对应的类类型 ;
Float.MAX_VALUE、Float.MIN_VALUE是最值。Float.POSITIVE_INFINITY 和
Float.NEGATIVE_INFINITY是正/负无限大。2.2.4
布尔类型变量
boolean变量取值:true和false ;
true和false不能转换成任何数值表示,true不是1,false也不是0。
2.2.5
原子类型变量的生存空间
一个变量的生存空间是由两个大括号决定的 范围。下列写法在C/C++中是正确的,但在Java中是错误的(注意)。{
int x=1;{ int x=0;// 错误 } }
2.3
变量赋值问题
如果类中定义的原子类型变量,未给出初值,那么它们将有缺省值 :byte、short、int 和long变量的缺省值是0;char、float、double和boolean变量的缺省值分别是’u0’、0.0f、0.0d和false。
方法内定义的局部变量,应当对其赋值,否则无法通过编译。例如: // 程序2-4 class Test {
// 定义一个类
int Value;// 类中的变量未赋值,缺省就是0 } public class Test_Var{ public static void main(String [ ] args){
int x=100;
// 必须赋值,否则无法通过编译
Test obj=new Test();// 对象赋值
System.out.println(obj.Value +“
”+x);
} } 2.4
数组
Java数组是系统定义类Array 的子类; 数组的分类同C/C++:一维和多维。
2.4.1
一维数组
定义数组的格式 :int a[ ] ; 或
int[ ] a ;其值是null ;
在定义数组时不能指定大小。a仅是一个引用,代表一个数组名,但没有对应的空间。产生数组空间的方法有两种 :
在定义时直接赋值:int a[ ]={1,2,3};
通过new分配空间: int a[ ]=new int[10];public class Test_Array{
public static void main(String [ ] args){
int a[ ]={1,2,3}, b[ ];
b= a;
for(int i=0;i<3;i++)b[ i ]++;
for(int i=0;i<3;i++)System.out.println(a[i]);
} }
public class Test_Array{
public static void main(String [ ] args){
int a[ ]={1,2,3}, b[ ];
b = new int[6];
System.out.println(“b数组长度 = ” + b.length);
for(int i=0;iSystem.out.print(b[i]+“
”);
} }
注意:(1)获得数组元素的个数:数组名.length;
(2)一个整形数组若仅仅采用new分配空间,而没有对其赋值,那么每个元素的值是0
注意:Java数组名是一个引用,当将一个数组名赋值给另一个数组时,实际上是名字的复制 2.5
Java中的参数传递方式
Java的参数传递的形式有两种:基本类型按值传递,对象类型按引用传递;
通过return语句从方法中返回时,基本类型总是以值的方式返回,而对象总是以引用方式返回。例如程序2-8 : class test{ int x;} public class Test_Paras {
static test fun(test o,int y){ o.x=20;
}
} y=1;
return o;public static void main(String [ ] args){ test obj1 , obj2;int
Val = 3;obj1=new test();obj1.x=100;
obj2=fun(obj1,Val);
System.out.println(obj1.x+“ ”+ obj2.x+“ ”+Val);
} 2.6
Java的运算符 主要包括:
算术运算符、关系运算符、逻辑运算符、位运算符和三元条件运算符。2.6.1
算术运算符
算术运算符:+、-、*、/、%、++和--,与C/C++基本相同。
%运算符不但可以对整形数据运算,而且可以对浮点型数据运算。例如:3.14 % 2.5的值约等于0.64 ; 隠式数据类型转换:
当整型与浮点型数据进行混合运算时,表达式中的数据类型会进行相应的自动转换,规则为:byte->short->int->long->float->double。
这种转换规则也适应于赋值语句,当赋值符左右两侧变量类型不一致时,只要转换过程中不丢失数据,便进行自动转换。
class number { int x;}
public class relationalOperator{
public static void main(String args[ ]){
} number n1,n2;
n1=new number();
n2=new number();n1.x=1;
n2.x=1;if(n1.x==n2.x)
System.out.println(“对象的数据成员x相等!”);
if(n1==n2)
System.out.println(“n1和n2是一个对象!”);else
System.out.println(“n1和n2不是一个对象!”);}
2.6.2
关系运算符
关系运算符不能同其它类型的变量一同
参与运算,例如假设a,b,c是三个整形的变量,那么 a=b==c 是
正确 OR 错误? ;
关系运算符用于对象时,是判别两个引用是否代表同一个对象。而不是判断两个引用所指向的对象是否同属一个类。
2.6.3
逻辑运算符
逻辑运算符有&&、|| 和!,分别是与、或和非。运算结果是true或false;
逻辑运算有求值“短路”现象,例如程序2-11 : public class shortCut {
static boolean testOne(int x){ System.out.println(x+“ < ”+1+“ ” +(x<1));return x < 1;}
static boolean testTwo(int x){ System.out.println(x+“ < ”+1+“ ” +(x<2));return x < 2;
}
public static void main(String [ ] args){
} if(testOne(6)&& testTwo(1))System.out.println(“表达式为真”);else
System.out.println(“表达式为假”);
}
2.6.4
位运算符 位运算符:&、|、^、~、<<、>>,分别称为位与、或、异或、左移、右移;
Java引入一个专门用于逻辑右移运算符>>>,它采用了所谓的零扩展技术,不论原值是正或负,一律在高位补0。例如:
int a=-2 , b;
b=a>>>30;2.6.5
三元条件运算符 语法格式:(exp)?(exp1):(exp2);
Java要求:(exp1)与(exp2)必须同类型。2.6.6
“+”运算符
Java对“+”进行了重载,可以将任何类型的对象(包含原子类型)转化为String类型。例如:
int x=1;char ch='A';double d=9.8;System.out.println(“Result: ”+x+ch+9.8);课堂练习:
课外练习(作业):
P32 3、4、6题。
第3章
控制语句
教学目的要求
了解Java程序的结构,学习使用各种语句结构来控制程序的流程,完成程序的功能任务。
主要内容
Java的分支语句; 循环控制语句;
break和continue语句;
带标号的break和continue语句。
重点内容
Java的分支语句; 循环控制语句;
break和continue语句;
难点内容
循环控制语句;
break和continue语句;
课时分配
3课时 教学方法
讲授法、演示法、对比法、实验验证法 讲授内容提要
3.1
分支语句 if-else语句;
switch-case语句。
3.1.1
if 语句
if语句的语法格式 同C/C++;
条件表达式必须是布尔类型,例如:
下面的写法在C/C++中是合法的,但在Java中却是非法的 : int i=10;if(i)
...程序3-1描述了用applet从文本框获取数据,然后将比较的结果显示出来。
// 程序 3-1 import java.awt.*;import java.applet.*;
public class compareNumbers extends Applet{
Label lab1,lab2;TextField input1,input2;
int num1,num2;public void init(){ lab1=new Label(“输入第1个整数”);
input1=new TextField(10);
lab2=new Label(“输入第2个整数”);input2=new TextField(10);
add(lab1);
add(input1);add(lab2);add(input2);} public boolean action(Event e , Object o){
} if(e.target==input1 || e.target==input2){ num1=Integer.parseInt(input1.getText());
num2=Integer.parseInt(input2.getText());
if(num1num2)showStatus(num1+“ > ”+num2);else showStatus(num1+“ == ”+num2);} return true;} 3.1.2
switch 语句
switch语句的语法结构 同C/C++;
switch后面的表达式类型必须是字符类型或整形 ; case后面的常量不能重复 ;
程序3-3采用小程序实现将学生的百分制成绩转换为优、良,中、及格和不通过五个等级: // 程序3-3 import java.awt.*;import java.applet.*;
public class scoreConvert extends Applet{
Label prompt;
TextField input;int Excellent,Good,Middle,Pass,Failure;public void init(){ prompt=new Label(“输入成绩”);
} public void paint(Graphics g){ g.drawString(“各等级的人数:”,25,40);g.drawString(“优秀
: ”+Excellent,25,55);g.drawString(“良好
: ”+Good,25,70);g.drawString(“中等
: ”+Middle,25,85);g.drawString(“及格
: ”+Pass,25,100);g.drawString(“不通过: ”+Failure,25,115);input=new TextField(2);add(prompt);add(input);} public boolean action(Event e , Object o){
int score=Integer.parseInt(input.getText());
showStatus(“");
input.setText(”“);
switch(score/10){
case 10: case 9: Excellent++;
break;case 8: Good++;
break;case 7: Middle++;
break;case 6: Pass++;
break;case 5:
case 4:
case 3: case 2:
case 1:
case 0: Failure++;
break;default: showStatus(”输入有误,重新输入!“);
}
repaint();
return true;} } 程序3-3需要注意的地方
在action()方法中调用的repaint()方法,是一个系统方法,它具有自动调用paint()方法的能力,从而实现对网页的刷新。3.2
循环控制语句
Java中的循环控制语句有三种,分别是:while,do-while和for语句;循环体内的语句会反复执行,直到控制布尔表达式的值变为false为止。3.2.1
while语句 while语句格式:
while(Boolean-Expression)
StatementS
程序示例3-4 略
3.2.2
do-while语句
do-while语句的语法格式如下: do{
Statement }while(Boolean-Expression);
程序3-5 如下:
// 产生一个大于0.9的随机数为止 public class GenerateDoubleNumbers {
public static void main(String args[ ]){
} double d;do{ d=Math.random();System.out.println(d);
}while(d<0.9);} 3.2.3
for语句
for语句语法格式如下:
for(ForInitopt;Boolean-Expression;ForUpdateopt)
Statement // 程序3-6输出一个*三角形
public class printGraphics extends Applet{
public void paint(Graphics g){ int xpos,ypos=0;
for(int row=6;row>=1;row--){ xpos=25;ypos+=15;
} for(int column=1;column<=row;column++){
} g.drawString(”*“,xpos,ypos);xpos+=7;
} } 3.3
break语句和continue语句
3.3.1
不带标号的break语句和continue语句
break语句可以跳出包含它的最内层的循环,不再执行剩余的语句;
continue语句停止执行当前的循环,回到循环处,开始执行下一轮的循环。这些特性和C/C++的功能一样。for(int i=1;i<10;i++)
{
if(i%3==0)
continue;
else
System.out.println(”i = “+i);
}
for(int i=1;i<10;i++)
{
if(i%3==0)
break;
else
System.out.println(”i = “+i);
}
课堂练习:
1、仔细分析下面程序,写出程序的最终运行结果。public class s_switch {
public static void main(String args[])
{
int ch=8;
int r=10;
switch(ch-1){
case 7: r=r+3;
case 8: r=r+5;
case 9: r=r+6;break;
default:;
}
System.out.println(”r=“+r);
} }
2、随机产生26个英文字母a~z,直到大于u为止。用while和for语句实现。
课外练习(作业):
P44
1—4
第4章
Java的类
教学目的要求
理解面向对象编程的基本概念 了解类的封装方法
如何创建类和对象
了解成员变量和成员方法的特性
学习使用OOP方式进行程序设计
深刻理解类的继承性和多态性
主要内容
类的定义和使用; 方法的定义和使用; 实例变量和局部变量; 构造方法; 方法的覆盖和重载; 关键字this的用法; 继承的概念和应用; 组合与继承;
抽象方法和抽象类;
对象类型转换;
访问权限限制符:public、private、protected。
重点内容
类的定义和使用; 方法的定义和使用; 构造方法;
方法的覆盖和重载; 关键字this的用法; 继承的概念和应用; 组合与继承;
抽象方法和抽象类; 对象类型转换;
难点内容
构造方法;
方法的覆盖和重载; 继承的概念和应用; 组合与继承; 抽象方法和抽象类
课时分配
8课时 教学方法
讲授法、演示法、对比法、实验验证法、学生讨论法 讲授内容提要
4.1
类与对象
在Java程序中,除原子类型的变量以外都是对象,连Java程序本身也不例外。
类是面向对象程序设计的基础,OO始终是围绕着对象的封装性、继承性和多态性展开讨论的。
4.1.1
类与对象的区别
类是一个抽象的概念,对象是一个具体的概念。
类是在一组对象的基础上,通过抽象和概括获得的一个概念。
对象是由数据和方法紧密结合的一个封装体,具有信息隐藏的能力。
对象可以通过方法(函数)与其它对象进行通信,但并不知道这些方法的实现细节。4.1.2
Java和C编程思想的区别
C是结构化的编程语言,以函数为编程单元,程序员把注意力集中在编写函数上。Java是面向对象的编程语言,以类为编程单元,程序员的精力集中在对类的设计上。
对象将实例变量(instance variable)和对数据的操作(即方法)约束在一起,类似一个独立的程序,易于扩充,易于维护,代码可复用。
4.1.3
如何定义类
类是对象的模板,它定义了对象的结构和操作数据的方法。public class Sayhello extends Applet {
public void paint(Graphics g){
int xPos=35;
int yPos=30;
g.drawString(”Hello Java!“,xPos,yPos);
} } 定义类的通用格式如下:
class className extends superClassName{ type instance-vairbale1;return-type methodName1(parameter-list){
method-body;} }
public class Hello {
public static void main(String args[ ]){
System.out.println(”Hello Java!“);
} }
系统类Object是整个类层次结构中的根。
如果我们要定义Object的子类,可以不指明extends Object,默认情况下一个类就是Object类的子类。
类内定义的变量称为实例变量,函数称为方法;
Java将类的定义和类的实现放在一起,便于系统维护。例如: class point {
// Object类的子类
int x , y;
void init(int a, int b){
int i=0;
x=a;
y=b;
}
} 4.1.4
对象和引用
对象是客观存在的变量,对象的引用就是对象的名字,例如:Point
p1;创建对象:p1=new Point();
一个对象可以有多个别名;
p2=p1;将一个变量设置为null,表明该变量不代表任何对象 :
p1 = null;
每个对象都有自己的变量,改变一个对象的实例变量并不影响到另外一个对象。例如: class Point { // 程序4-1
int x , y;
void init(int a, int b){
x=a;
y=b;
}
} public class TwoPoint{
public static void main(String [ ]args){
Point p1= new Point(), p2= new Point();
p1.x=10;p2.x=30;p1.y=20;p2.y=40;System.out.println(”x = “+ p1.x +” y= “+p1.y);System.out.println(”x = “+ p2.x +” y= “+p2.y);
} } 4.2
方法
方法是一个功能模块,类似C中的函数;
方法和实例变量都必须定义在类内,方法是类的功能接口 ;
定义方法的原则:方法应当只执行单一的任务,并且方法名能有效地表达该任务; 方法的返回值类型、方法名和参数表共同称之为方法的特征。调用方法的格式:引用.方法名(参数表);例如:
Point
p1=new point(),p2=new point();Point p3=p2;p1.init(10,20);//仅对p1对象的x和y进行赋值 p2.init(30,40);//仅对p2对象的x和y进行赋值
对象是客观存在的变量,对象的引用就是对象的名字,例如:point
p1;创建对象:p1=new point();
一个对象可以有多个别名;
p2=p1;将一个变量设置为null,表明该变量不代表任何对象 :
p1 = null;
每个对象都有自己的变量,改变一个对象的实例变量并不影响到另外一个对象。
4.3
实例变量和局部变量 class Loc {
// 程序4-2
int x=1;// 实例变量
void printLocVar(){
int x=25;// 局部变量
}
System.out.println(”n x is :“+x);
++x;
System.out.println(” x is :“+x);
void printInstanceVar(){
System.out.println(”n x is :“+x);
x*=10;
System.out.println(x is :”+x);} } public class TestInstanceVar { // 程序的主类
public static void main(String args[ ]){
System.out.println(“ x is :”+x);
obj.printLocVar();
obj.printInstanceVar();
System.out.println(“ x is :”+x);
loc obj=new Loc();
int x=5;
// 局部变量 x }
} 4.3
实例变量和局部变量
Java中的变量分为两种:类内定义的实例变量,方法中定义的局部变量。
在同一个作用域内,不允许定义两个同名的局部变量。
局部变量可以掩盖实例变量。
实例变量属于对象,它描述了对象的属性,随着对象的存在而存在;
局部变量是随着方法的调用而存在,一旦方法调用结束,局部变量也就消亡了。4.4
构造方法
构造方法的功能是在创建对象时初始化对象的实例变量; 讨论:构造方法的特点: 无返回值,无void 方法名与类名相同 仅在创建对象时调用 class point { // 程序4-3
}
public class createPoint {
public static void main(String args[ ]){
point
p= new point(10,20);
System.out.println(p.x +“ ”+p.y);} int x, y;point(int a, int b){
} x=a;y=b;
} 如果类中没有定义构造方法,编译器会自动创建一个缺省的、不带参数的构造方法。构造方法是在对象创建之后,new操作完成前被调用的。
4.5
方法重载
方法重载是在一个类中定义二个或多个同名的方法,但方法的参数个数或类型不完全相同;例如: class
point { int x, y;point(int a, int b){ x=a;y=b;} point(){ x=-1;y=-1;}
point(double a, int b){ x=(double)a;y=b;} } 方法重载的一个误区:是靠返回值区别重载,即定义多个方法,它们的名称和形参类型完全相同,但返回值不同,这是不允许的;
4.6
关键字this
this指代对象,是对当前对象的一个引用。例如: class IntVector { // 程序4-6 int v[ ];
boolean equals(IntVector other){
if(this == other)return true;
return false;} } class testIntVector {
public static void main(String args[ ]){
IntVector
t1=new IntVector(),t3=new IntVector(),t2=t1;
System.out.println(t1.equals(t2));
System.out.println(t3.equals(t2));
} }
Java中的级连调用,仍是指代当前对象的this。例如:// 程序4-7 import java.awt.*;import java.applet.*;
class time{
private int hour, min, sec;
time(){ setHour(0);setMin(0);
setSec(0);}
time setHour(int h){
hour=((h>=0 && h<24)? h: 0);return this;} time setMin(int m){
min=((m>=0 && m<60)? m: 0);
return this;}
time setSec(int s){
sec=((s>=0 && s<60)? s: 0);
return this;}
String tostring(){ return hour+“:”+min+“:”+sec;} public class timeToString extends Applet{
private time t;
public void init(){
}
t=new time();}
public void paint(Graphics g){ t.setHour(18).setMin(30).setSec(20);
} g.drawString(“ time:”+t.tostring(),25,45);} 在构造方法内部使用this,它用于指代另外一个构造方法,但不能指代非构造方法。例如: class point {
}
4.7
继承
继承是软件重用的一种形式,可以提高系统的性能;
继承语法:
class className
extends
superClassName{
各实例变量和方法的定义
}
例如: class point{
int x, y;
point(int x, int y){
this.x=x;this.y=y;}
point(){ this.x=0;
this.y=0;} }
class circle extends point{
int
radius;
circle(int r, int x, int y){
radius=r;
this.x=x;
this.y=y;
} } Java不支持多继承,但支持多接口;
子类的对象也是其超类的对象,反之未必;
继承具有传递性:
B继承于A,C又继承于B,则C也继承了A中的实例变量和方法。
关键字super
构造方法是一种特殊的方法,子类不能继承超类的构造方法,但子类构造方法可以通过super调用超类的构造方法。int x, y;point(){ this(-1,-1);} point(int a, int b){ x=a;y=b;}
当创建子类对象时,首先执行超类构造方法,然后执行子类的构造方法。例如: class point{
// 程序4-8
int x, y;
point(int x, int y){
} } class circle extends point{
int radius;
circle(int r, int x, int y){
super(x, y);
radius=r;
System.out.println(“子类构造函数被调用!”);
this.x=x;this.y=y;
System.out.println(“父类构造函数被调用!”);
} } public class testInherence {
public static void main(String args[ ]){ circle
c1;
c1=new circle(1,1,1);
} }
再次讨论构造方法
若父类没有定义构造方法,那么对父类数据的初始化将采用系统缺省的构造方法;例如: class point{
int
x, y;
}
class circle extends point{
int radius;
circle(int r, int x, int y){
this.x=x;
this.y=y;
radius=r;
} } 若父类定义有缺省构造方法,那么子类可根据自己的需要设置自己的构造方法。例如: class point{
int x, y;
point(){
this(0,0);
}
point(int x, int y){
this.x=x;this.y=y;
} } class circle extends point{ // 注意子类的构造函数
int radius;
circle(int r, int x, int y){
radius=r;} } 若父类定义的构造方法都是有参的,那么子类构造方法必须通过super调用父类构造方法,class point{
private int x, y;
point(int x, int y){
this.x=x;
this.y=y;
} } class circle extends point{
int radius;
circle(int r, int x, int y){
super(x, y);
radius=r;
} } 4.8
方法的覆盖
方法的覆盖发生在父类和子类之间,若子类中定义的某个方法的特征,与父类中定义的某个方法的特征完全一样,那么就说子类中的这个方法覆盖了父类对应的那个方法。
4.8.1
覆盖与重载的区别 重载可以出现在一个类中,也可以出现在父类与子类的继承关系中,并且重载方法的特征一定不完全相同。
覆盖特点:子类中的方法特征与父类定义的对应方法的特征完全一样。例如: // 程序4-9 class point{
int x, y;
point(){ this(0,0);}
point(int x, int y){
this.x=x;this.y=y;
}
double area(){ return 0;} }
class circle extends point{
int radius;
circle(int r, int x, int y){super(x, y);
radius=r;
}
double area(){ return Math.PI*radius*radius;} } public class testOverWrite {
public static void main(String args[ ]){
} circle c1;
c1=new circle(1,1,1);
System.out.println(c1.area());} 4.8.2
方法的动态调用
Java的所有对象运行时都有一个类型标识(RTTI:Run-Time Type Identification),该标识记录了每个对象所属于的类。Java用此标识在运行时选择正确的方法。例如: // 程序4-11 class point{
int x, y;
point(){ this(0,0);}
point(int x, int y){ this.x=x;this.y=y;
}
double area(){ return 0;} }
class circle extends point{
int radius;
circle(int r, int x, int y){ super(x, y);
radius=r;}
double area(){
// 覆盖了父类的area方法
return
Math.PI*radius*radius;
} } public class dynamicalCall {
public static void main(String args[ ]){
point p[ ]={new point(2,2), new circle(1,1,1)};
for(int i=0;i
System.out.print(“类名: ”+
} p[i].getClass().getName());System.out.print(“父类:”+ p[i].getClass().getSuperclass());System.out.println(“
面积: ”+ } p[i].area());} 子类对象调用方法时:
(1)子类检查是否具有同名和同参数类型的方法,若有则调用该方法,否则继续执行。
(2)到父类中寻找同名和同参数类型的方法,若有则调用该方法。若找不到,将产生编译错误。
对象决定自己到底该调用哪个方法,取决于该对象在继承链中的位置。
4.9
多态性不适合继承链中的实例变量 引用.方法:根据多态性调用;
引用.实例变量:根据引用的类型调用。即:多态性仅仅适用于方法的调用,而不适合实例变量。例如: class Base{
// 程序4-12
int x=1;void print(){ System.out.println(“当前类为 ”+
}
this.getClass().getName());System.out.println(“对象的x= ”+this.x);
} class Derived extends Base{
} int x=2;void print(){ System.out.println(“当前类为 ”+
}
this.getClass().getName());System.out.println(“对象的x= ”+this.x);
public class confusions{ public static void main(String [ ] args){
Base obj=new Derived();
}
}
obj.print();System.out.println(“对象的x= ”+obj.x);
4.10
finalize
Java的垃圾回收器具有自动回收垃圾的能力。
垃圾回收器是一个优先级比较低的线程,在系统空闲时运行。
在对象被回收之前,有时需要执行一些特殊的操作,例如保存文件、清除屏幕等,这时就要用Java的finalize方法。例如: class point{
// 程序4-13
int x, y;
point(int a, int b){
} x=a;y=b;System.out.println(“point constructor:”+getString());
public void finalize(){
// 注意该方法
System.out.println(“point finalizer:”+getString());
}
String getString(){ return “x=”+x+“ y=”+y;
} } class circle extends point{
int radius;
circle(int r, int a, int b){ super(a,b);radius=r;System.out.println(“circle constructor:”+getString());
}
public void finalize(){
System.out.println(“circle finalizer:”+getString());
}
String getString(){
return super.getString()+“
radius=”+radius;
} } public class testFinalize {
public static void main(String args[ ]){
point c1,c2;c1=new circle(1,1,1);c2=new circle(2,2,2);c1=null;c2=null;System.gc();
} }
4.11
static
static修饰变量(与C中的不同);
static修饰方法(与C中的不同);
4.11.1
static变量
static变量是指这样的成员变量:不管在程序运行中生成多少个该类的对象,它们都共享该变量。
即使没有创建对象,该变量仍然存在。因此,static变量又称为类变量。定义格式为:static type variableName;
static变量和一般的实例变量不同,在构造方法中不能对它进行初始化。例如: class point{
// 程序4-14
static int count;int x, y;static{ // 静态初始化块
}
} count=0;System.out.println(“static variable is initialized!”);
point(int a, int b){ count++;x=a;
y=b;
System.out.println(“Call point constructor!”);} public class testStaticVariable {
public static void main(String args[ ]){ point c1=new point(0,0);
System.out.println(“There are ”+
}
4.11.2
static方法
(可举例说明Math类的PI和sqrt等,为什么要用静态变量。)static方法是类中的成员方法,它属于整个类,即使不创建任何对象,也可使用静态方法。调用静态方法格式:类名.方法名(参数); 在子类中不能覆盖父类中定义的静态方法。
静态方法中只能出现静态变量和其它静态方法。并且还不能使用this和super。例如: class point{
// 程序4-15
static int count;
int x, y;
static{ count=0;System.out.println(“static variable is initialized!”);
// 定义静态变量 } point.count +“ points”);
}
point(int a, int b){
count++;x=a;y=b;
System.out.println(“Call point constructor!”);
}
static int getCount(){ // 静态方法 return count;
} } public class testStaticMethod {
public static void main(String args[ ]){
} point c1=new point(0,0);point c2=new point(1,1);
System.out.println(“There are ”+ point.getCount()+“ points”);} 4.12
关键字final
在实例变量、局部变量和方法的形参定义之前加上final,那么这个变量值只能被引用,而不能修改。
final修饰的局部变量和实例变量必须给出初值,因为它修饰的变量代表一个常量。例如: class Base{ // 程序4-16 final int x=1;
// 形式1:修饰实例变量
}
public class finalVariables{
public static void main(String [ ] args){ final int var=100;// 形式3:修饰局部变量
} Base obj=new Base();
obj.print(var);void print(final int y){ // 形式2:修饰参数
// y=0;
// 错误
} System.out.println(x+y);
} 在方法定义前加上final,该方法就不能被子类覆盖,成为终极方法 ;
包含终极方法的类仍然可以被子类继承,子类虽然不能覆盖父类中的终极方法,但可以重载该方法。例如: class Base{
final int x=1;
}
class Derived extends Base { void print(){ // 重载了父类中的print方法
} System.out.println(x);final void print(int y){
}
// 父类中的final方法
System.out.println(x+y);}
4.12.3 final类
在一个类定义前加上final,意味着这个类就不能被其它类继承,成为终极类。
系统类基本上都是final类,如String类。
将class定义为final是为了杜绝继承,类中的方法自然都变成了终极方法。例如: final class Base{ // 声明为final类
final int x=1;
void print(final int y){
System.out.println(x+y);
} }
// 错误:不能继承final 修饰的Base类 class Derived extends Base { }
4.13
组合与继承
面向对象中的软件重用表现为两种形式:继承和对象组合。
设计这类程序的关键是构造方法:子类构造方法调用父类构造、成员对象的初始化。class date{ // 程序4-17
int year, mon,day;
date(int y, int m, int d){ year=y;
mon=(m>0 && m<13)?m:1;day=checkday(d);
}
int checkday(int d){
int daydisp[ ]={0,31,28,31,30,31,30,31,31,30,31,30,31};
if(d>0 && d<=daydisp[mon])
return d;
if(mon==2 && d==29 &&(year%400==0 ||
year%4==0&& year%100!=0))
return d;return 1;
}
String tostring(){ return year+“/”+mon+“/”+day;} }
class employee{ // 雇员类
long id;date birthday;
例如:
employee(long no, int year, int mon, int day){ id=no;
// 设置组合对象
}
String tostring(){
return id+“ , ”+birthday.tostring();} birthday=new date(year,mon,day);}
class manager extends employee { // 经理类
double basePay;
String tostring(){
return basePay+“ , ”+super.tostring();} } public
class compositionAndInherence {
} public static void main(String [ ] args){ manager
boss;
}
boss=new manager(1001,1971,11,5);System.out.println(boss.tostring());
manager(long no, int y, int m, int d){ super(no,y,m,d);
// 调用父类构造函数
} basePay=1000;
4.14
抽象类和抽象方法
抽象方法:仅有方法特征,但没有代码; 抽象类:包含抽象方法的类。
抽象类的作用:提供一种适当的超类,子类通过继承实现父类中的抽象方法。
抽象类不能用final修饰。
抽象类体现了多态性,通过继承可以从抽象类派生出具有相似操作的子类。例如: abstract instrument abstract void play()继承 wind void play()继承 继承 stringed void play()percussion void play()继承 继承 woodwind void play()brass void play()
// 程序4-18 abstract class instrument{
abstract void play();}
// wind不是抽象类
class wind extends instrument{
void play(){ System.out.println(“wind play!”);} }
// percussion也不是抽象类
class percussion extends instrument{
void play(){ System.out.println(“percussion play!”);} }
// stringed也不是抽象类 class stringed extends instrument{
void play(){ System.out.println(“stringed play!”);} }
class woodWind extends wind{ // 覆盖父类中的play方法
void play(){System.out.println(“woodWind play!”);} }
class brass extends wind{
// 覆盖了父类中的play方法
void play(){ System.out.println(“brass play!”);} } public
class music { static void tuneAll(instrument e[ ]){
} for(int i=0;ie[i].play();
// 抽象方法
public static void main(String [ ] args){ instrument orchestra[ ] = new instrument[5];int i=0;
orchestra[i++]=new wind();orchestra[i++]=new percussion();orchestra[i++]=new stringed();orchestra[i++]=new woodWind();orchestra[i++]=new brass();tuneAll(orchestra);
} } 程序运行结果: wind play!percussion play!stringed play!woodWind play!brass play!
4.15
对象的类型转换 4.15.1
向上类型转换
从子类向父类转换,在继承图中是向上移动,通常称为向上类型转换。
类型向上转换是安全的,因为这是从特殊类型到通用类型的转换。
进行向上类型转换时,出现的唯一问题是可能丢失子类中定义的方法和变量。例如: // 程序4-19 class point{
int x, y;
point(int x, int y){
this.x=x;this.y=y;} int getX(){
return x;} }
class circle extends point{
int radius;circle(int r, int x, int y){ super(x, y);radius=r;} double area(){
return Math.PI*radius*radius;
} } public
class testUpCasting {
} public static void main(String [ ] args){
circle c=new circle(1,1,1);point p=c;// 注意:p和c的类型不同 } System.out.println(p.getX());4.15.2
向下类型转换
从父类向子类转换,在继承图中是向下移动,称为向下类型转换。
类型向下转换是不安全的,因为这是从一般类型到特殊类型的转换。例如: public static void main(String [ ] args){
}
4.16
访问权限限制
Java提供的访问权限修饰符有四个,即public、private、protected和友元;
修饰符要置于每个类成员(实例变量和成员方法)的定义之前,且仅能控制它所修饰的那个成员。
4.16.1
友员
缺省修饰符的情况就是友员。友员修饰符意味着同一个目录(包)中的所有类都可以访问这种类型的成员。
friendly不属于Java关键字,是C++的一个关键字。
例如: public class Base{
// 该类位于Base.java文件中
int friend_data=1;// 友员数据成员 }
// 该类位于Derived.java文件中 public class Derived extends Base{ Base p=new Base();
// 访问Base类中的friend_data
}
4.16.2
public 成员
不管两个类是否位于同一个目录中,一个类总可以访问另一个类的public成员。
public还可以用于修饰主类,文件名必须与主类名一致。除此之外,其它3个修饰符都不能用于修饰类,只能修饰成员。例如: public class Base{
public int friend_data=1;// public成员 } void dataUse(){
System.out.println(“data=”+p.friend_data);
} point p=new point(1,1);circle c;c=p;
//注意:此处编译时出错
c=(circle)p;//注意:此处运行时出错 System.out.println(c.area());
public class Derived extends Base{ public Base p=new Base();
public void dataUse(){
}
4.16.3
private成员
private成员的特性:除了其所在类能够访问该成员以外,其它类都不能访问它。
在多人合作开发一个系统的过程中,private可以让你自由使用自己定义的成员,无须担心与其他人写的类相冲突。例如: // 程序4-20 class Base{
private Base(){ }
public class testPrivate {
public static void main(String args[ ]){
// Base p=new Base();
// 编译有错
}
}
Base p = Base.makeBase();} // 注意
}
System.out.println(“data=”+p.friend_data);} static Base makeBase(){ return new Base();
4.16.4
protected成员
protected与继承有关,这种类型的成员可以被子类访问。
同一个包内的非子类,也可以访问这种类型的成员。即:protected天生就具有友元权限,例如:
// 程序4-21 class Base{
// 该类位于Base.java文件中
int friend_data=1;
// 友元成员
public int public_data=2;
// public成员
private int private_data=3;// private成员
protected int protected_data=4;// protected成员 }
class Derived extends Base{ // Derived.java文件
Base a=new Base();void dataUse(){
} System.out.println(a.friend_data);System.out.println(a.public_data);// System.out.println(a.private_data);System.out.println(a.protected_data);} // 将主类存放在testData.java文件中 public class testData {
public static void main(String args[ ]){
} Derived d=new Derived();d.dataUse();
} 访问权限总结
课堂练习:
1、定义一个Student类:
该类的功能有:可以保存、修改和获取学生的姓名、学号等。可以设置学生的英语成绩、数学成绩、Java成绩,并能计算平均分、最高分和最低分。
2、以下代码定义了一个类,请指出其中三条不合法的代码行(行号参见注释)。
class Test22{
//1
//7
} static float fac1(boolean f){ return f?u:v;}
//8 float fac2(boolean f){ return f?u:v;}
//9 float u;
//2 static float v;
//3 static void setUV(boolean f){
//4 u=fac1(f);
//5 v=fac2(!f);
//6 }
课外练习(作业):
P87 1、3、4、6
第5章
接口和包
教学目的要求
掌握接口的定义和使用
了解接口与抽象类的异同点 掌握包的定义和使用 主要内容
接口的定义和使用 包的定义和使用 重点内容
接口的定义和使用 包的定义和使用
难点内容
无 1课时 课时分配 教学方法
讲授法、演示法 讲授内容提要
5.1
接口
引入接口的原因:在程序设计中经常遇到这样一个问题:有些类互不相关,但却具有相似的方法。并且这些方法在各个类中的实现互不相同。我们不能为这些类定义一个共同的父类,但又希望在程序中体现出它们共同的接口。
5.1.1
接口的定义和应用
接口是一系列常量和空方法的集合,它提供了多个类共同的方法,但不限制每个类如何实现这些方法。
Java允许一个类同时实现多个接口,相当于实现多继承的功能。声明一个接口的语法格式:
[public] interface interfaceName [extends super-interface-List]{
type ConstantName=value;
type MethodName(Parameter lists);} 例如:
interface
Sortable{ // 定义一个接口
int Compare(Sortable
s);} 接口中不能声明任何变量和构造方法。
如果一个类实现多个接口,应该在接口名之间用逗号隔开。
当一个类实现接口时,必须实现接口中给出的空方法,若实现接口的类是一个抽象类,可以把实现接口的任务交给子类去实现。例如: // 程序5-1 interface
Sortable{
// 定义一个接口
int Compare(Sortable
s);} class Sort{
// 定义一个排序类,仅有一个静态的方法
public static void SelectSort(Sortable a[ ]){ int i, j, k;Sortable
temp;
for(i=0;i// 选择排序
k=i;
for(j=i+1;jif(a[k].Compare(a[j])<0)k=j;
temp=a[i];a[i]=a[k];a[k]=temp;}
} } class Student implements Sortable{
// 定义一个学生类
private int score;
Student(int x){score=x;}
// 实现接口Sortable中的方法 public int Compare(Sortable s){
Student st=(Student)s;
// 类型强制转换
return score-st.score;}
public String toString(){ return “score=”+score;} } class Rectangle implements Sortable{ // 矩形类也实现了接口
} public class interfaceTest {
public static void main(String args[ ]){ Student stud[ ]=new Student[20];int i;private int length,width;
Rectangle(int x,int y){ length=x;width=y;}
int area(){return length*width;}
public int Compare(Sortable s){
// 实现接口
}
public String toString(){ return “area=”+area();} Rectangle rec=(Rectangle)s;
// 类型强制转换 return
area()-rec.area();
for(i=0;istud[i]=new Student((int)(Math.random()*100));Sort.SelectSort(stud);
// 排序 for(i=0;iSystem.out.println(stud[i].toString());Rectangle R[ ]=new Rectangle[10];for(i=0;iR[i]=newRectangle((int)(Math.random()*10),(int)(Math.random()*10));Sort.SelectSort(R);
// 排序 for(i=0;iSystem.out.println(R[i].toString());
} } 接口中定义的变量实际上是常量,必须给出它们的初始值,实现接口的类可以自由引用这些常量。例如: // 程序5-2的部分 interface constant {
int int int int
EXCELLENT=5;
GOOD=4;
PASS=3;
FAIL=2;} 在类中实现接口中方法时,方法的特征必须和接口中声明的方法特征保持一致;
实现方法时必须在方法前加上public;
若一个类没有对接口中的方法具体实现,那么必须将该类声明为abstract类。例如: interface inter {
// 接口
} void methodA();
abstract class Derived1 implements inter {
// 此处不需要写出methodA()的原型 }
class Derived2 extends Derived1{
public void methodA(){ // 实现方法
} } System.out.println(“Hi,methodA”);5.1.2
接口和抽象类的异同点 接口和抽象类的相同点:
(1)都有空的方法,都必须在子类中实现这些方法。
(2)都不能用new关键字来创建这两种类型的对象。
(3)都可以具有继承关系。
(4)接口和类一样可以具有public属性。接口和抽象类的不同点:
(1)在抽象类中,空的方法必须加abstract关键字,而在接口中不需要。
(2)在抽象类中,除空的方法外,可以定义实例变量和非空的方法,而在接口中,只能定义常量和空的方法。
(3)接口允许多继承,类仅支持单继承。
5.2
包
在Java中可以将自己写的类,按一定的方法归属于不同的子目录中(包)。
在缺省情况下,Java将所有的类归属一个缺省包中。在不同的包中可以有同名的类存在。
Java中的包与C++中的名字空间相似。
5.2.1
package语句
package语句告诉编译器当前类属于哪个包。如果没有package语句,类就存放在无名的缺省包中(即当前目录中)。
引进包的概念主要是为了名字冲突。
格式: package pkgl[.pkg2[.pkg3]];
5.2.2
import语句
import语句位于package语句之后,类的定义之前;格式:import package1[.package2].(class-name | *);
采用*号不影响程序的运行性能,但会影响编译速度。指明具体类比引入整个包更为合理。5.2.3
包应用举例
package Base;
// 将该类存放在d:myjavaBase包中 public class Base { int friend_data=1;// 友元成员
public int public_data=2;// public成员
private int private_data=3;// private成员 protected int protected_data=4;// protected成员
} package Derived;
// 将Base类存放在Derived包中
import Base.*;
// 需要使用Base包中的类
public class Derived extends Base{ Base a=new Base();
// 为了让testData类能调用该方法,修改为public
// 不能访问 public void dataUse(){
// System.out.println(a.friend_data);
System.out.println(a.public_data);
// System.out.println(a.private_data);
// 不能访问
// System.out.println(a.protected_data);// 不能访问
} }
// testData.java文件的内容如下:
import Derived.*;
//需要使用Derived包中的类
// 该类位于工作目录,不需要package语句 public class testData { public static void main(String args[ ]){
}
} Derived d=new Derived();
d.dataUse();
课堂练习:
课外练习(作业):
P108
3~6
第6章
字符串处理
教学目的要求
掌握字符串的分类;
掌握内容不可改变的字符串类String; 掌握字符串常量;
掌握内容可以改变的字符串类StringBuffer; 掌握字符串应用。
主要内容
字符串的分类;
内容不可改变的字符串类String; 字符串常量;
内容可以改变的字符串类StringBuffer; 字符串应用。
重点内容
掌握内容不可改变的字符串类String;
掌握内容可以改变的字符串类StringBuffer; 掌握字符串应用。
难点内容
String和StringBuffer的区别和联系 课时分配
2课时 教学方法
讲授法、演示法、对比法、实验验证法 讲授内容提要
6.1
字符串的分类
java.lang包中定义了 String和StringBuffer两个类;
在运行中值不会改变的字符串,用String类存储;值会改变的字符串用StringBuffer类来存储。
两个类都有final修饰,这样可以优化字符串的操作。
6.2
String类
String类的定义原型 :
public final class java.lang.String
extends java.lang.Object
{
…
} 6.2.1
字符串常量
字符串常量属于String类型;相同的字符串常量属于同一个对象,占用同一块空间,例如: // 程序6-1 public class TestConstString{
public static void main(String args[ ]){
}
} String str1=“Hello”, str2=“Hello”;
System.out.println(str1==str2);System.out.println(“Java”==“Java”);6.2.2
创建String类对象
用new运算符,并调用构造函数创建这种类型的对象,常见构造函数如下:
1.public String()采用该构造函数创建一个不含字符的空对象。例如:
String str =new String();
2.public String(char value[ ])
将字符数组的内容转换为字符串,并赋予新建的对象。例如:
char a[ ]={'J','a','v','a'};String str=new String(a);3.public String(char value[ ], int offset, int count)
例如:char a[ ]={'J','a','v','a'};
String str=new String(a,1,2);
// 字符串str的内容是“av”
4.public String(String value)
采用value对象的值构造一个新的string对象。
例如: String str1=“Java”;String str2=new String(“Java”);
System.out.println(str2);
System.out.println(str1==str2);
5.public String(StringBuffer Buffer)注意采用字符串常量初始化一个String引用的问题。例如: String str = “abc”;相当于:
char data[ ] = {'a', 'b', 'c'};String str = new String(data);应用举例,注意程序6-2的输出结果: public class TestString{
// 程序6-2
public static void main(String args[ ]){
String s1=“Java”, s2=“Java”;String s3=new String(s1);
System.out.println(“ s1==s2 is ”+(s1==s2));System.out.println(“ s1==s3 is ”+(s1==s3));s1=“ABC”;s2=“DEFG”;System.out.println(“ s1==s2 is ”+(s1==s2));s1=s2;
System.out.println(“ s1==s2 is ”+(s1==s2));} } 6.2.3
String类常用方法 1.public int
length():
求串长。例如:
String str=“Java” ;
System.out.println(str.length());2.public char charAt(int
index)
提取指定位置上的字符。
3.public int compareTo(String
anotherString)
对字符串内容按字典序进行大小比较。例如: public class SortStringArrary{
// 程序6-3
public static void main(String args[ ]){
String str,s[ ]={“Computer”,“CHINA”,“world”,“U.S.A”};
int i,j,k;
System.out.print(“排序之前:”);for(i=0;iSystem.out.print(“t”+s[i]);for(i=0;ifor(k=i,j=i+1;jif(s[k].compareTo(s[j])>0)
k=j;
str=s[i];
s[i]=s[k];
s[k]=str;// 注意该行的含义 } System.out.print(“n排序之后:”);for(i=0;iSystem.out.print(“t”+s[i]);
} } 4.char[ ]
toCharArray()
将String对象转换到一个字符数组中,例如:
String s=“Hello,Java!”;
char a[ ];
a=s.toCharArray();
for(int i=6;iSystem.out.print(a[i]);5.public boolean equals(String anString)
比较两个字符串对象的内容是否相等。
6.public boolean equalsIgnoreCase(String anotherString)
以忽略大小写方式,比较两个字符串对象的内容是否相等。
注意:equals()方法与“==” 之间的区别。例如: public class ConfuseQuestion{
// 程序6-5
public static void main(String args[ ]){
String
s1=“java”;
String
s2=new String(s1);
String
s3=s2;
} } System.out.println(s1.equals(s2));System.out.println(s2.equals(s3));System.out.println(s2==s3);System.out.println(s2.equals(s3));7.public int indexOf(int ch / String str)
在字符串中搜索字符或子串,返回字符或子串在String对象中从左边起首次出现的位置。如果没有出现,返回-1。
8.public String substring(int begin, int end)
提取string对象中从begin开始,到end-1结束的子串,返回提取的子串。
9.public String concat(String str)将str对象接到调用对象的后面,返回新串。例如:
String
s1=“Hello ” , s2=“Java” , s3;s3=s1.concat(s2);
System.out.println(s3);注意:如果参数str为空(null),则concat方法不创建新串,而仅仅返回当前串,10.public String replace(char oldChar, char newChar)
将String对象中所有的oldChar字符替换为newChar,返回替换后的新串。例如:
String path=“d:/myjava/documents”;
System.out.println(path.replace('/' , ''));
public String toString()
返回当前字符串对象本身。
12.public static String valueOf(各种类型
f)
将各种数据类型转换成一个相应的字符串表示,该方法是一个static方法。
程序6-6演示了valueOf()方法的应用。
程序6-7自学。
public class TestValueOf{
// 程序6-6
public static void main(String args[ ]){
char a[ ]={'A','B','C','D','E','F'};
int i=123456;float f=3.14159f;boolean b=true;Object
o=null;System.out.println(String.valueOf(a));System.out.println(String.valueOf(a,2,3));System.out.println(String.valueOf(i));System.out.println(String.valueOf(f));System.out.println(String.valueOf(b));
System.out.println(String.valueOf(o));} } 6.2.4 Java应用程序的命令行参数
应用程序可以通过main方法的String数组,访问由解释器传递的命令行参数。例如: public class ShowMainArguments{ //程序6-8
public static void main(String args[ ]){
for(int i = 0;i < args.length;i++)
System.out.println(args[ i ]);
} } 6.3
StringBuffer类
StringBuffer类对象是一个内容可以改变的字符串。可以减少由于少量字符的插人而引起的空间分配问题。
StringBuffer类的原型:
public final class java.lang.StringBuffer
extends java.lang.Object { …
} StringBuffer类对象有一块缓冲区,字符串被存放在缓冲区中,缓冲区的大小可以随程序的需要进行调整。缓冲区的大小称为对象的容量。
当修改对象的内容时,只要StringBuffer对象包含的字符个数没有超出容量,就不会分配新的空间,而直接在原空间内进行修改。若字符的个数超出了容量,该对象会自动调整其容量,从而适应新的存储。
6.3.1
创建StringBuffer类对象
StringBuffer类的构造函数有三种方式:
1.public StringBuffer()创建一个内容为空的StringBuffer对象,容量为16。
例如:StringBuffer s=new StringBuffer();2.public StringBuffer(int length)初始内容为空,容量为length指定的大小。注意:length应大于等于0,不能为负数,否则会产生异常。例如:
StringBuffer s2=new StringBuffer(2);3.public StringBuffer(String str)
初始内容和参数str的内容相同,容量为参数str的长度加上16。例如: String s1=“Java”;
StringBuffer s2=new StringBuffer(s1);则s2的容量是20,内容是“Java”。
6.3.2
StringBuffer类常用方法
1.public int length()
返回字符串的长度
2.public int capacity()
返回缓冲区大小
3.public void setLength(int newLength)
指定对象的长度,将对象的内容进行裁减。如果参数小于对象的长度,则将对象截断;如果参数大于等于对象的长度,则填充空字符('u0')扩充新增加的部分。
4.public void ensureCapacity(int NewCapacity)
设定对象的缓冲区的大小,若参数 小于对象的容量,则新的设置将不起作用,也就是说容量只能扩大而不能缩小。
程序6-9演示了这几个方法的具体应用。
public class TestCapacity{
// 程序6-9
public static void main(String args[ ]){ String
s=“Java”;
StringBuffer
str=new StringBuffer(s);System.out.println(“Length=”+str.length());System.out.println(“Capacity=”+str.capacity());str.setLength(8);
// 设置长度为8 str.ensureCapacity(80);// 设置容量为80 System.out.println(“nstr= ”+str);System.out.println(“Length = ”+str.length());System.out.println(“capacity = ”+str.capacity());
str.setLength(3);
str.ensureCapacity(20);System.out.println(“nstr= ”+str);System.out.println(“Length = ”+str.length());System.out.println(“capacity = ”+str.capacity());
} } 5.public void setCharAt(int index, char ch)
将参数index指定位置上的字符,设置成参数ch
指定的字符。例如:
StringBuffer str=new StringBuffer(“Hello,Java”);
str.setCharAt(3,'L');
则str的内容变成了“HelLo,Java” 6.public StringBuffer append(多种数据类型)
将其它类型的数据添加到StringBuffer对象的尾部,返回修改后的StringBuffer对象。
例如:StringBuffer s1,s2=new StringBuffer();
s1=s2;// s1和s2代表同一个对象
s2.append(3.14).append(' ').append(“Java”);
System.out.println(s1==s2);
// 输出true
System.out.println(s1);
// 输出3.14 Java
7.public String toString()
该方法把StringBuffer对象的内容复制到一个新的String类对象中,返回这个新的String类对象。例如程序6-10。
public class BufferToString{
// 程序6-10
public static void main(String args[ ]){ String s1;StringBuffer s2=new StringBuffer(“Hello ”);s1=s2.append(“Java!”).toString();System.out.println(“s1=”+s1+“"+”s2=“+s2);
} }
8.public StringBuffer insert(int offset, 多种类型
b)该方法是将一个其它类型的对象b插入到offset指定的位置。例如: StringBuffer str=new StringBuffer(” Java!“);
// 将字符串”Hello“插入到下标为0的位置
str.insert(0,”Hello“);
System.out.println(”str= “+str);输出结果为: str= Hello Java!
6.4
略
应用举例
课堂练习:
无 课外练习(作业):
P119 2、3、4
第7章
异常处理
教学目的要求
了解异常的层次结构;
掌握异常处理语句; 了解自定义异常;
了解异常处理中常用的调试方法。主要内容
异常的层次结构;
异常处理语句; 自定义异常;
异常处理中常用的调试方法。
重点内容
异常处理语句;
难点内容
无
课时分配
1课时 教学方法
讲授法、演示法、对比法、实验验证法 讲授内容提要
7.1
异常的层次结构
Throwable是异常类的根节点,定义在java.lang包,它的子类也定义在该包中; Error代表系统错误类,由系统直接处理;
Exception类及其子类是在程序中可捕捉到的异常。见图7.1
Throwable Error achineError … AW TError LinkageError VirtualM RuntimeException ArithmeticException ArrayIndexO utO fBoundsException … Interrupted Exception AWTException IOException Exception FileNotFoundException… EOFException
1.java.lang.ArithmeticException
0作除数(包括模),将产生这类异常。例如:int x=0 , y;
y=100/x;
2.java.lang.ArrayIndexOutOfBoundsException
例如:int a[ ]=new int[10];
a[10]=0;
3.java.lang.ArrayStoreException 例如:int a[ ]=new int[10];
boolean b[ ]=new boolean[10];
System.arraycopy(a,0,b,3,6);//有异常
4.java.lang.ClassCastException 例如: Object obj=new Object();
int a[ ]=(int[ ])(obj);
5.java.lang.IndexOutOfBoundsException
例如:char ch=”ABC“.charAt(99);
注意: 2 是5的子类。
6.java.lang.NegativeArraySizeException
例如: int a[ ]=new int[-10];
7.java.lang.NullPointerException 例如:int a[ ]=null;
System.out.print(a.length);7.2
异常处理语句
缺省的异常处理的情况,例如:
public class DefaultException{
// 程序7-1
public static void main(String args[ ]){ int a,b=0;
a=2/b;
// 此处有异常
System.out.println(“a=”+a);// 不运行此行
} }
异常处理语句有try、catch、finally、throw和throws。异常处理的形式为:
try{
程序执行体
}catch(异常类型1
异常对象1){ 异常处理程序体1 }catch(异常类型2
异常对象2){
异常处理程序体2 }finally {
异常处理结束前的执行程序体 }
7.2.1
try和catch语句
try语句指明可能产生异常的代码段;catch语句在try语句之后,用于捕捉异常,一个try语句可以有多个catch语句与之匹配。异常处理以后,程序从try语句代码段后继续执行。例如:程序7-2。public class TryCatchTest{
// 程序7-2
public static void main(String args[ ]){ int a=99,b=0,c;
try{ System.out.println(”产生异常之前“);c=a/b;
// 该行有异常 System.out.println(”产生异常之后“);}catch(ArrayIndexOutOfBoundsException e){
System.out.println(”处理下标越界异常“);}catch(ArithmeticException e){
System.out.println(”处理算术异常“);}
System.out.println(”异常处理结束“);
} }
注意:用catch语句捕捉异常时,若找不到相匹配的catch语句,将执行缺省的异常处理。例如:
int a=99,b=0,c;
try{ c=a/b;//产生的异常和捕捉的异常类型不一致
}catch(ArrayIndexOutOfBoundsException e){
System.out.println(”处理异常“);
}
注意:当有多个catch语句时,系统依照先后顺序逐个检查。例如: try{ c=a/b;
}catch(ArithmeticException e){ System.out.println(”Divided by zero“);}catch(RuntimeException e){
System.out.println(”Divided by zero“);}
7.2.2
finally语句
无论是否产生异常,finally语句指明的代码一定被执行。例如: public class testFinally{
// 程序7-3
public static void main(String args[ ]){
int a,b=0;
for(int i=0;i<=3;i++){ System.out.println(”Test No: “+(i+1));try{
switch(i){
} case 0:
a=3/b;
break;case 1:
int c[ ]=new int[10];
c[10]=0;
break;case 2:
char ch=”ABC“.charAt(99);
break;case 3:
return;}catch(ArithmeticException e){ System.out.println(“零作除数!”);
}catch(ArrayIndexOutOfBoundsException e){ System.out.println(”数组下标越界!“);}catch(IndexOutOfBoundsException e){ System.out.println(”下标越界!“);}finally{ System.out.println(”在finally块中!“);
} }
7.2.3
throw语句
throw语句用于指出当前行有异常,当程序执行到throw语句时,流程就转到相匹配的异常处理语句,所在的方法也不再返回值。
throw语句可以将异常对象提交给调用者,以进行再次处理。例如:程序7-4。public class ThrowException{
// 程序7-4
public static void Test(){
try{ int c[ ]=new int[10];c[10]=0;}catch(ArrayIndexOutOfBoundsException e){ System.out.println(”t 数组下标越界!“);
}
}
throw e;
// 异常抛出点
//System.out.println(“t产生异常后!”);
该行无法通过编译 }
}
public static void main(String args[ ]){
try{ Test();}catch(IndexOutOfBoundsException e){ System.out.println(”t 下标越界!“);}finally{
System.out.println(”t 在finally块中!“);}
} }
7.2.4
throws语句
throws语句指明方法中可能要产生的异常类型,由调用者进行异常处理。例如: import java.io.*;
// 程序7-6 public class testThrows {
public static String readString()throws IOException{
int ch;String r=”“;boolean done=false;
while(!done){ ch=System.in.read();
} if(ch<0 || ch==0xd)
done=true;else r = r +(char)ch;
return r;
}
public static void main(String args[ ]){ String str;
try{
str=readString();}catch(IOException e){
System.out.println(”产生了输出/输出异常“);
return;}
System.out.println(”整数是:"+Integer.parseInt(str));
} } 建议:在多人合作写程序时,一个方法中产生的异常,最好在该方法中进行处理,不要将异常传播给其他人处理。
7.3
自定义异常类
通过继承Exception类或它的子类,实现自定义异常类;
对于自定义异常,必须采用throw语句抛出异常,这种类型的异常不会自行产生。总体上分为两步:
第1步:定义异常类。例如: class userException extends Exception{
int n=0;
// 计数器