4-2:使用基于接口的多态
目的
通过简单实例进一步学习基于接口的多态,体会基于接口的多态要比基于继承的多态灵
活性更好。继承只能让超类引用指向与其属于同一类的对象;接口引用则能指向任意类型的
对象,即使对象间没有任何关系,只要这些对象所在的类实现了该接口即可。
要求
写出下列代码的运行结果,并给出正确运行结果的截图。
内容
编程实现一个接口 Food,两个类 Apple、Beef,分别都实现了接口 Food 中的方法 doEat。
其中 Apple 继承其父类 Fruit,声明其属性为水果;Beef 继承其父类 Meat,声明其属性为肉
类。运行后效果如图 4-2 所示。
图 4-2 运行结果
实现思路
分别创建两个具体类:苹果类(Apple)和牛肉类(Beef),其中,苹果类(Apple)继承
自水果类(Fruit),而牛肉类(Beef)继承自肉类(Meat),但是这两个类均实现了食物(Food)
接口,并且实现了接口中食用的方法(doEat)。在主方法中用食物接口引用 f 指向了创建的
苹果对象,并且调用其食用的方法,接着用同样的引用 f 指向创建的牛肉对象,并且以同样
的方式调用了其食用的方法。
关键代码如下所示:
interface Food
{
//吃食物的方法
public void doEat();
}
//水果抽象类
abstract class Fruit
{ }
//肉抽象类
abstract class Meat
{ }
//苹果类继承自水果类实现了食物接口
class Apple extends Fruit implements Food
{
//实现接口中的方法
public void doEat()
{
System.out.println("我是苹果,我属于水果,我可以充当食物被吃掉!!");
}
}
//牛肉类继承自肉类实现了食物接口
class Beef extends Meat implements Food
{
//实现接口中的方法
16
public void doEat()
{
System.out.println("我是牛肉,我属于肉类,我可以充当食物被吃掉!!");
}
}
//main 方法
//创建苹果对象
Food f=new Apple();
//调用苹果吃的方法
f.doEat();
//创建牛肉对象
f=new Beef();
//调用牛肉吃的方法
f.doEat();
通过 javac、java 等命令编译并运行程序,程序运行结果如图 4-2 所示。
4-3:匿名内部类作用的体现
目的
通过实例了解匿名内部类的作用。在实际开发中,有很多自己编写的类只需要使用一次,
并不需要多次创建对象。这时使用匿名内部类将类代码与创建对象同部完成,既方便又提高
了代码的可维护性。
要求
写出下列代码的运行结果,并给出正确运行结果的截图。
内容
编程实现利用匿名内部类实现比较器,将 5 个学生根据其年龄大小依次输出。运行后效
果如图 4-3 所示。
图 4-3 运行结果
实现思路
定义作为集合元素的 Student 类,该类实现了 Comparable 接口,并实现了接口中的
compareTo 方法,指定其对象将按照学号比较大小,并且重写了 toString 方法,以便其能够更
好的打印显示。在主方法中创建了一个 TreeSet 对象,并通过匿名内部类为其指定了自己的比
较器,指出按学生的年龄从大到小进行排列。最后,向 TreeSet 中添加了 5 个 Student 对象,
并将自动排序后的结果打印输出。
关键代码如下所示:
class Student implements Comparable
{
17
//学生的成员属性
String name;
int age;
int classNum;
//学生类的无参构造器
public Student()
{}
//学生类的有参构造器
public Student(String name,int age,int classNum)
{
this.name=name;
this.age=age;
this.classNum=classNum;
}
//重写 toString 方法
public String toString()
{
//将类名引导的属性序列字符串返回
return "\nwyf.jc.Student[name="+this.name
+",age="+this.age
+",classNum="+this.classNum
+"]\n";
}
//实现 compareTo 方法
public int compareTo(Object o)
{
//强制类型转换
Student s=(Student)o;
//用 classNum 作为基准进行排序
return this.classNum-s.classNum;
}
}
//main 方法中
//利用匿名内部类创建比较器
TreeSet ts1=new TreeSet(
new Comparator()
{
public int compare(Object o1,Object o2)
{
//将接收到的对象的引用进行强制类型转换
Student s1=(Student)o1;
Student s2=(Student)o2;
//指定按年龄进行排序
return s2.age-s1.age;
}
});
//向 ts1 中添加内容不同的学生对象的元素
ts1.add(new Student("tom",21,97005));
ts1.add(new Student("jerry",19,97003));
ts1.add(new Student("lucy",18,97004));
ts1.add(new Student("smith",28,97001));
ts1.add(new Student("jc",23,97002));
//打印 ts1 中的元素
System.out.println("这里的 Sorted 集是按年龄从大到小进行的排序:");
System.out.println(ts1);
通过 javac、java 等命令编译并运行程序,运行程序结果如图 4-3 所示。
18
4-4:编写数组复制的程序
目的
通过实例学习数组复制,并理解数组复制后对其中一个数组进行操作,对另一个数组的
影响。在 Java 中,将一个数组引用赋给另一个数组引用后,这两个数组引用将指向同一个
数组对象。若使用箭头表示数组引用,椭圆表示数组对象,则图 8-1 所示表示了这种情况。
图 8-1 数组复制示意图
要求
写出下列代码的运行结果,并给出正确运行结果的截图。
内容
编程实现数组复制 a=b,并对数组 b 中的元素进行修改时,输出数组 a 的结果。运行后
效果如图 4-4 所示。
图 4-4 运行结果
实现思路
两个引用 a、b 指向同一个数组对象,则通过一个引用修改,另一个引用能感知变化。
关键代码如下所示:
//创建了一维 int 数组对象,并让引用 a 指向该数组对象
int[] a={1,2,3};
//将 a 的值赋给 b,让 b 也指向此数组对象
int[] b=a;
//通过引用 b,将数组的第 2 个元素赋值为 5
b[1]=5;
System.out.println("a[1]="+a[1]+", b[1]="+b[1]);
int i1=2;
int i2=i1;
i2=i2+6;
System.out.println("i1="+i1+", i2="+i2);
通过 javac、java 等命令编译并运行程序,程序运行结果如图 4-4 所示。
4-5:改变 String 对象引用的指向
目的
通过实例了解 Java 中 String 是不可变字符串类的含义。在 Java 中字符串对象是永远不
变的,其从创建的那一刻开始,内容将永远不会发生变化,也正是因为这一点,才保证了字
符串对象可以复用。但字符串对象引用的指向是可以发生变化的,这样在使用时也就感觉不
到字符串是不能改变的了。从本实验读者就可以理解 String 字符串不可变的含义。
要求
19
写出下列代码的运行结果,并给出正确运行结果的截图。
内容
编程实现声明字符串 String 类 s1、s2,对其进行初始化后,令 s2=s1.concat(s2),再输出
s1、s2 的内容。运行后效果如图 4-5 所示。
图 4-5 运行结果
实现思路
分别创建字符串对象 s1 和 s2。将字符串 s2 的内容追加到字符串 s1 内容的后边组成
新的内容,并查找字符串常量池中有没有与新内容相同的字符串。若有,将引用 s2 指向
该对象;若没有,则新创建一个包含新内容的字符串对象,并将引用 s2 指向该对象。实
现结果示意图如图 4-6 所示。
图 4-6 改变字符串 String 引用指向示意图
关键代码如下所示:
//创建字符串对象 s1 与 s2
String s1="JavaSE6.0";
String s2="核心技术大全";
//将字符串 s1 与 s2 相连接并将结果赋给 s2
s2=s1.concat(s2);
//打印字符串 s1 与 s2
System.out.println("对字符串 s1 进行连接字符串操作,字符串 s1 与 s2 的结果为:");
System.out.println("s1 = "+s1);
System.out.println("s2 = "+s2);
通过 javac、java 等命令编译并运行程序,程序运行结果如图 4-5 所示。
20
课堂作业 5
5-1:组合使用文本区与滚动窗口
目的
通过实例学习文本区域滚动窗口的使用。在自动换行的情况下,当文本内容超过一行时,
文本区自动换行。当文本区超过滚动窗口的大小时,滚动窗口根据需要自动出现水平或垂直
滚动条。在单词边界换行的情况下,文本区在自动换行时不会把单词拆开;而在字符边界换
行的情况下,文本区在自动换行时会根据需要将单词拆开。
要求
写出下列代码的运行结果,并给出正确运行结果的截图。
内容
编程实现文本区与滚动条的综合使用,实现了 4 个按钮 jbArray[1]、jbArray[2]、jbArray[3]、
jbArray[4],按下 4 个按钮分别改变文本区的换行状态,包括自动换行、不换行、单词边界、
字符边界。运行后效果如图 5-1 所示。
图 5-1 运行结果
实现思路
将文本区放到滚动窗口中,并向文本区中添加了一些文本,在初始情况下文本区是字符
边界自动换行。实现了 4 个按钮,按下 4 个按钮分别改变文本区的换行状态。
关键代码如下所示:
public class Sample7_1 extends JFrame implements ActionListener
//创建 JPanel 对象
private JPanel jp=new JPanel();
//创建按钮数组
private JButton[] jbArray=
{new JButton("自动换行"),new JButton("不换行"),
new JButton("单词边界"),new JButton("字符边界")};
//创建文本区
private JTextArea jta=new JTextArea();
//将文本区作为被滚动控件创建滚动窗体
private JScrollPane jsp=new JScrollPane(jta);
public Sample7_1()
21
{
//设置 JPanel 的布局管理器
jp.setLayout(null);
//循环对按钮进行处理
for(int i=0;i<4;i++)
{
//设置按钮的大小文职
jbArray[i].setBounds(20+i*110,120,90,20);
//将按钮添加到 JPanel 中
jp.add(jbArray[i]);
//为按钮注册动作事件监听器
jbArray[i].addActionListener(this);
}
//设置 JScrollPane 的大小与位置
jsp.setBounds(20,20,450,80);
//将 JScrollPane 添加到 JPanel 容器中
jp.add(jsp);
//设置 JTextArea 为自动换行
jta.setLineWrap(True);
//为 JTextArea 添加 10 条文本
for(int i=0;i<20;i++)
{
jta.append("["+i+"]Hello, this is an Example!");
}
//将 JPanel 容器添加进窗体
this.add(jp);
//设置窗体的标题、大小位置以及可见性
this.setTitle("文本区与滚动条");
this.setResizable(False);
this.setBounds(100,100,500,180);
this.setVisible(True);
}
//实现 ActionListener 中的方法
public void actionPerformed(ActionEvent e)
{
if(e.getSource()==jbArray[0])
{//按下自动换行按钮
jta.setLineWrap(True);
}
else if(e.getSource()==jbArray[1])
{//按下不换行按钮
jta.setLineWrap(False);
}
else if(e.getSource()==jbArray[2])
{//按下单词边界按钮
jta.setWrapStyleWord(True);
}
else if(e.getSource()==jbArray[3])
{//按下字符边界按钮
jta.setWrapStyleWord(False);
}
}
通过 javac、java 等命令编译并运行程序,程序运行结果如图 9-1 所示。
22
5-2:使用滑块与进度条
目的
通过实例学习并巩固关于滑块与进度条的知识及使用。滑块可以从指定的范围内选取一
个值,而进度条则可以指示当前值在指定范围内的百分比。在恰当的情况下使用滑块或进度
条可以使得界面的交互更加友好,使用更加方便。
要求
写出下列代码的运行结果,并给出正确运行结果的截图。
内容
编程实现滑块与进度条的综合使用,设置滑块值为 1000,并为两个组件注册事件监听
器 ChangeEvent,实现当滑块滑动后进度条将指示滑块的当前值。运行后效果如图 5-2 所示。
图 5-2 运行结果
实现思路
使用了一个滑块与一个进度条,滑块设置为绘制主副刻度及主刻度标签,进度条设置为
显示进度百分比的普通模式。同时,代码中为滑块注册了 ChangeEvent 事件监听器,当滑块
被拖动时进度条即时显示对应的百分比。
关键代码如下所示:
public class Sample7_2 extends JFrame implements ChangeListener
{
//创建 JPanel 容器
private JPanel jp=new JPanel();
//创建进度条与滑块
private JProgressBar jpb=new JProgressBar(0,1000);
private JSlider js=new JSlider(0,1000);
//创建标签数组
private JLabel[] jlArray={new JLabel("请拖动滑块"),new JLabel("进度指示条")};
public Sample7_2()
{
//为容器 JPanel 设置布局管理器
jp.setLayout(null);
//设置标签的大小位置,并将标签添加进 JPanel 容器
for(int i=0;i<jlArray.length;i++)
{
jlArray[i].setBounds(20,20+i*100,80,30);
jp.add(jlArray[i]);
}
//设置滑块的大小位置
js.setBounds(20,40,450,50);
//将滑块添加进 JPanel
jp.add(js);
//设置进度条的大小位置
jpb.setBounds(20,150,450,26);
//将进度条添加进容器 JPanel
23
jp.add(jpb);
//设置滑块到绘制刻度标记以及主刻度标签的状态
js.setPaintTicks(True);
js.setPaintLabels(True);
//分别设置主副刻度标记的间隔
js.setMajorTickSpacing(200);
js.setMinorTickSpacing(40);
//为滑块注册 ChangeEvent 事件监听器
js.addChangeListener(this);
//设置进度条的初始值
jpb.setValue(500);
//设置进度条将显示信息字符串
jpb.setStringPainted(True);
//将 JPanel 添加进窗体
this.add(jp);
//设置窗体的标题、大小位置以及可见性
this.setTitle("滑块与进度条示例");
this.setResizable(False);
this.setBounds(100,100,500,250);
this.setVisible(True);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void stateChanged(ChangeEvent e)
{
//设置当滑块滑动后进度条将指示滑块的当前值
jpb.setValue(js.getValue());
}
通过 javac、java 等命令编译并运行程序,运行程序结果如图 5-2 所示。
5-3:学生成绩管理系统
目的
通过该实验,完成大作业的第四和第五部分内容,熟悉 Java 语言的图形界面设计和数
据库访问。
要求
写出主要代码,并给出正确运行结果的截图。
内容
在图形界面中显示学生成绩管理系统。按面向对象的思路,可对 3 或多门课程成绩进行
管理,课程信息可保存在数据库中。分别输入 3 门或多门课程的学生姓名、学号、平时分数、
期末分数,可按总评成绩进行排序显示,可按姓名或学号查询。
24
课堂作业 6
6-1:Applet 简单使用
目的
通过实例了解 Applet 生命周期的全过程、最简单的 Applet 标签的表示、appletviewer 的
指向 SimpleApp 类。
内容
编程实现 Applet,小应用程序在生命周期的各个方法中,只是简单地表明其状态,不做
复杂工作;如在初始化时,在 init 方法中在输出项 buffer 中添加“Applet 初始化...”。运
行后效果如图 6-1 所示。
图 6-1 运行结果
实现思路
首先定义 Applet 中的 init(),start(),stop(),destroy(),paint()等方法,并在 SimpleApp.html
中利用 applet 标签定义。系统首先调用了 Applet 类中的 init()方法,随后调用了 Applet 类中的
start()方法,最后调用了 Applet 类中的 paint()方法。
关键代码如下所示:
public void init() {
buffer = new StringBuffer();
addItem(“Applet 初始化... ");
}
public void start() {
addItem("Applet 启动... ");
}
public void stop() {
addItem("Applet 停止运行... ");
}
public void destroy() {
addItem("准备卸载...\n");
}
void addItem(String newWord) {
System.out.println(newWord); buffer.append(newWord);
repaint();
}
public void paint(Graphics g) {
g.drawRect(0, 0, getSize().width - 1,
getSize().height - 1);
g.drawString(buffer.toString(), 5, 15);
}
}
相应的 SimpleApp.html 内容为:
<applet code="SimpleApp.class"
width="300" height="50">
</applet>
25
使用 java、appletviewer 命令编译并运行程序,程序运行结果如图 6-1 所示。
6-2:在 Applet 中使用 BorderLayout
实验目的
通过实例在 Applet 中使用布局管理器 BorderLayout。在 Applet 中使用各种布局管理器加
载方式与在 Application 中基本相似,通过这个例子,读者可以学会在 Applet 中使用布局管
理器。
实验内容
编程实现 Applet 中使用 BorderLayout 管理器,在管理器个 5 个区域内,分别添加 5 个
按钮,包括 buttonWest、buttonEast、buttonCenter、buttonNorth、buttonSouth,5 个按钮没
有操作。运行后效果如图 6-2 所示。
图 6-2 运行结果
实现思路
首先定义 5 个按钮,分别是 buttonWest、buttonEast、buttonCenter、buttonNorth、
buttonSouth,并对其分别进行标识。利用 setLayout 方法及 add 方法创建 BorderLayout 布局
管理器,将各个按钮加载至 BorderLayout 布局管理器的各个区域内。
关键代码如下所示:
public class BorderLayoutTest extends Applet{
Button buttonNorth,buttonSouth,
buttonWest,buttonEast,buttonCenter;
public void init(){
buttonNorth = new Button("North");
buttonSouth = new Button("South");
buttonWest = new Button("West");
buttonEast = new Button("East");
buttonCenter = new Button("Center");
setLayout(new BorderLayout());
add(buttonNorth,BorderLayout.NORTH);
add(buttonSouth,BorderLayout.SOUTH);
add(buttonWest,BorderLayout.WEST);
add(buttonEast,BorderLayout.EAST);
add(buttonCenter,BorderLayout.CENTER);
}
}
HTML 文件内容为
<applet code="BorderLayoutTest.class"
width="350" height="350">
</applet>
使用 java、appletviewer 命令编译并运行程序,程序运行结果如图 6-2 所示。
26
6-3:Java Applet 中使用字体列表显示各种字体
目的
通过实例学习在 Applet 中使用字体列表获取系统各种字体并显示的方法。
内容
编程实现展示用户系统环境下的字体,使用 getAvailableFontFamilyNames()获取所有的字
体。运行后效果如图 6-3 所示。
图 6-3 运行结果
实现思路
利用下列方式可以获取系统图形环境中支持的字体列表,并利用获取的 fontList 初始化
Font 将其名称及效果进行输出。
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
String[] fontList = ge.getAvailableFontFamilyNames();
关键代码如下所示:
public class AllFonts extends Applet{
String[] fontList;
public void init(){
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
fontList = ge.getAvailableFontFamilyNames();
}
public void paint(Graphics g){
Dimension d = getSize();
int x = 10,y = 10,index=0,xWidth = d.width/4;
int fontSize = g.getFont().getSize();
while(index<fontList.length){
String fontName = fontList[index];
Font f = new Font(fontName,Font.PLAIN,fontSize);
g.setFont(f);
g.drawString(fontName, x+(index%4)*xWidth,y);
index++;
if((index%4)==0){y+=fontSize+5;};
}
}
}
使用 java、appletviewer 命令编译并运行程序,程序运行结果如图 6-3 所示。
版权所有:编程辅导网 2021 All Rights Reserved 联系方式:QQ:99515681 微信:codinghelp 电子信箱:99515681@qq.com
免责声明:本站部分内容从网络整理而来,只供参考!如有版权问题可联系本站删除。