目 录
一、实验目的及要求
1.实验目的
1)在面向抽象编程的基础上,掌握使用接口进行程序设计的核心思想是使用接口回调。
2)掌握类之间的继承性以及多态性原则。
3)明白接口也可以体现程序设计的“开-闭”原则,即对扩展开放,对修改关闭。
2.实验要求
1)深刻理解面向接口编程和“开-闭”原则。
2)要求会定义接口变量。
3)接口变量存放了实现该接口的类的对象的引用。
4)使用接口变量回调类实现的接口方法。
5)上机过程中要遵守实验室的各项规章制度,爱护实验设备,保持环境卫生。
6)本课程的实验过程中,不得进行游戏、上网等操作。
二、实验环境
1.硬件要求:笔记本电脑一台。
2.软件要求:Windows操作系统,使用Java语言,使用Eclipse集成开发环境。
三、实验内容
1.实验方案
打开Java集成开发环境Eclipse进行操作,根据课本和老师在课堂中讲解的内容,定义接口,声明若干个abstract方法:创建类,在类中定义若干个参数为接口类型的方法,通过实现接口的类的对象回调类重写的接口方法,实现相应的功能,看是否与预期效果一样。
2.实验步骤
1)打开Eclipse集成开发环境,建立一个包(面向接口编程)。
2)建立若干类及接口,其中包括普通类、抽象类(abstract)。
3)在相应的类中定义相应的变量和方法(常量、抽象方法等)。
4)在类之间实现继承(extends)关系,并使用super调用隐藏的成员变量。
5)在继承类之间实现方法重写,体现多态性。
6)使用interface定义相应的接口。
7)使用implements实现相应的接口。
8)通过相应的类和接口实现接口的类的对象回调类重写的接口方法并实现相应的功能。
9)完成相关功能的检测并完成实验报告的书写及提交。
3.设计思路
1)通过在主类内设置判断语句进行平台登录及相关操作实现三大板块(个人信息展示、加载进度显示、英雄系数展示)。
2)定义若干的普通类、抽象类(abstract)以及接口(interface)。
3)在类与类之间实现继承(extends)关系以及实现方法重写(体现多态性)。
4)定义相应的接口变量并回调类实现接口方法(implements)。
5)在类中定义相应的函数并实现相关的功能(常量、方法重写等)。
6)运行主类King类实现在窗口输入并输出。
四、实验结果与分析
1.打开Eclipse集成开发环境,并在其中建立包以及所需要的类文件,如图4-1:
图4-1 建立包及类文件
2.进行界面的登录并进行账号和密码的窗口输入以及判断输入密码是否正确,运行主类King类后窗口登录界面如图4-2:
图4-2 窗口登录界面
3.成功登录以后,会进行个人信息的展示以及游戏中英雄相关系数的展示,在两者之间还会进行一定的进度显示,游戏信息显示界面如图4-3所示:
图4-3 游戏信息显示界面
1、实验分析
1)环境问题:在Eclipse集成开发环境中编写代码时字体太小不利于观察。
解决方法:点击Window->Preferences->在搜索栏中输入font->General-> Appearance->Colors and Fonts->Basic->Text Font->点击Edit进行字体的设置->点击确认即完成了字体大小的设置。
2)运行问题:编写Java代码进行中文输出时出现了乱码现象。
解决方法:鼠标右击->Run As->Run Configurations->Common->在Other后填写gbk然后点击Run进行运行后中文可以正常输出。
3)编译问题:建立类后无法运行,显示没有主程序。
解决方法:填写主类运行信息语句public static void main(String[] args)或 者继续在包内新建一个主类,通过类组合的形式进行类的运行。
4)代码问题:在编辑框内写Scanner语句进行窗口输入时显示语句错误。
解决方法:在文件头部写入如下语句import java.util.Scanner;之后错误消失。
5)代码问题:在调用一些类的成员变量的时候显示错误。
解决方法:所调用的类成员变量为私有类型,私有类型只能在类内访问,类外无法对其直接进行访问,在类内构造公有函数形成一个对外接口,在其他类内直接通过调用这个函数来访问其类内部的私有成员即可。
6)代码问题:在显示数据时父类的方法被子类的方法覆盖了。
解决方法:使用super操作被隐藏的成员变量和方法。
7)代码问题:一个类实现接口时报错了。
解决方法:类实现接口时需要重写接口中的所有方法,将接口中的所有方法重写后错误消失。
2、心得体会
1)在使用单引号和双引号的时候要特别注意,输出单个字符时可以使用单引号,如果同时输出多个字符时只能使用双引号进行输出,不然会报错。
2)在使用一些标点符号的时候要特别注意,代码内的标点符号均为英文,所以在注释和写代码切换的时候要特别的注意。
3)私有成员只能在类内进行访问,类外无法对私有成员直接进行访问。
4)在实现窗口输入参数的时候要特别注意,先在文件头部写入import java.util.Scanner;语句后再进行相关输入语句的书写。
5)如果一个类声明实现一个接口,但没有重写接口中的所有方法,那么这个类必须是抽象类(abstract)。
6)实现继承关系时使用extends,定义接口时使用interface,实现接口时使用implements,定义常量时使用final,操作被覆盖的成员和方法时使用super。
五、附源程序
1.主类King类源代码
package 实验三面向接口编程;
import java.util.Scanner;
public class King {
public static void main(String[] args) {
//登陆界面
System.out.println("------欢迎来到登录界面------");
System.out.println("--@@@密码正确才可以进入哦@@@--");
Scanner scanner = new Scanner(System.in);
System.out.print("请输入账号······");
String ZH = scanner.next();
System.out.print("请输入密码······");
int MM = scanner.nextInt();
if(MM == 5201314) {
System.out.println("密码输入正确,恭喜你!");
System.out.println();
//玩家信息
System.out.println("------您的个人信息如下------");
Student student = new Student(null, 0, null, null);
student.show_school();
student.Information(ZH);
student.show_age();
student.show_sex();
System.out.println();
//下载数据显示
System.out.println("------正在为您载入游戏------");
State state = new State();
state.print_state(new Interface());
state.print_state(new Picture());
System.out.println("您的游戏数据已全部加载完成!");
System.out.println("正在进入英雄界面······");
System.out.println();
//英雄界面的相关操作
System.out.println("------欢迎进入英雄界面!------");
System.out.println("---------------------");
Result result = new Result();
result.show(new HanDan());
result.show(new JIAOLONG());
Combat combat;//声明接口变量
combat = new JIAOLONG();//接口变量中存放对象的引用
combat.show_harm();//接口回调
}
else {
System.out.println("密码错误,请重新输入!");
}
}
}
2.Student类源代码
package 实验三面向接口编程;
//Student类继承People类
public class Student extends People{
//子类新增变量
private int age;
private String sex.name;
//子类构造方法
Student(String Type,int age,String sex,String name){
super();//调用父类的构造方法
this.age = 21;
this.sex = "女";
this.name = name;
}
//方法重写
public void show_sex() {
System.out.println("性 别————" + sex);
}
public void show_age() {
System.out.println("年 龄————" + age + "岁");
}
//新增方法
public void Information(String name) {
System.out.println("姓 名————" + name);
System.out.println("手 机 号————13341238118");
}
}
3.People类源代码
package 实验三面向接口编程;
public class People {
//定义常量
final String Type;
//构造方法
People(){
this.Type = "中国大陆居民";
}
public void show_school() {
System.out.println("身份类型————" + Type);
System.out.println("所在学校————" + "新疆大学");
}
public void show_sex() {
System.out.println("性别——————" + "男");
}
public void show_age() {
System.out.println("年龄——————" + "20岁");
};
}
4.定义接口Combat源代码
package 实验三面向接口编程;
public interface Combat {//接口
//静态常量(最大血量值)
public final static int MAX = 100;
//展示伤害
public void show_harm();
}
5.定义接口Attribute源代码
package 实验三面向接口编程;
public interface Attribute {//接口
//展示经验值
public void show_experience();
//展示姓名
public String get_name();
}
6.实现Attribute接口的HanDan类源代码
package 实验三面向接口编程;
//HanDan类实现Attribute接口
public class HanDan implements Attribute{
//重写接口的方法
public void show_experience() {
System.out.print("菡萏经验值——");
System.out.println(85 + " (精英法师)");
System.out.println("专属花中法师,你值得拥有!");
System.out.println("---------------------");
}
public String get_name() {
return "菡萏";
}
}
7.实现Attribute和Combat接口的JIAOLONG类源代码
package 实验三面向接口编程;
//JIAOLONG类实现Attribute和Combat接口
public class JIAOLONG implements Attribute,Combat{
//方法重写
public void show_experience() {
System.out.print("蛟龙经验值——");
System.out.println(98 + " (宗师刺客)");
}
public String get_name() {
return "蛟龙";
}
public void show_harm() {
System.out.print("蛟龙伤害值——");
System.out.println(95 + " (至强伤害)");
System.out.println("限时系列英雄,先到先得!");
System.out.println("---------------------");
}
}
8.抽象类Phone类源代码
package 实验三面向接口编程;
//抽象类
public abstract class Phone {
//抽象方法
public abstract void rate();//显示进度
public abstract String location();//运行位置
}
9.State类源代码
package 实验三面向接口编程;
public class State {
public void print_state(Phone phone) {
System.out.print(phone.location() + "下载进度————");
phone.rate();
}
}
10.子类Picture类源代码
package 实验三面向接口编程;
//Picture类继承Phone类
public class Picture extends Phone{
public void rate() {
System.out.println("67%······");
}
public String location() {
return "内置画质";
}
}
11.子类Interface类源代码
package 实验三面向接口编程;
//Interface类继承Phone类
public class Interface extends Phone{
public void rate() {
System.out.println("78%······");
}
public String location() {
return "游戏界面";
}
}
12.接口回调类Result类源代码
package 实验三面向接口编程;
public class Result {
public void show(Attribute attribute) {
System.out.println(attribute.get_name()+"---至尊英雄");
attribute.show_experience();//接口回调
}
}