联系方式

  • QQ:99515681
  • 邮箱:99515681@qq.com
  • 工作时间:8:00-21:00
  • 微信:codinghelp

您当前位置:首页 >> Java编程Java编程

日期:2018-05-17 06:46


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
免责声明:本站部分内容从网络整理而来,只供参考!如有版权问题可联系本站删除。 站长地图

python代写
微信客服:codinghelp