Java上机2019/11/01
相关知识点
接口体中只有常量的声明(没有变量)和抽象方法声明。而且接口体中所有的常量的访问权限一定都是public(允许省略public、final修饰符),所有的抽象方法的访问权限一定都是public(允许省略public、abstract修饰符)。
接口由类去实现以便绑定接口中的方法。一个类可以实现多个接口,类通过使用关键字implements声明自己实现一个或多个接口。如果一个非抽象类实现了某个接口,那么这个类必须重写接口的所有方法。
实验1 评价成绩
具体代码:
Estimator.java
package Evaluation_results;//这是我自己另外创建的包
//实验目的:掌握类怎样实现接口
//实验要求:体操比赛计算选手成绩的办法是去掉一个最高分和最低分后再计算平均分
//而学校考查一个班级的某科目的考试情况时,是计算全班同学的平均成绩
//Gymnastics类和School类都实现了ComputerAverage接口,但实现的方式不同
interface CompurerAverage {
public double average(double x[]);
}
class Gymnastics implements CompurerAverage {
public double average(double x[]) {
int count = x.length;
double aver = 0, temp = 0;
for (int i = 0; i < count; i++) {
for (int j = i; j < count; j++) {
if (x[j] < x[i]) {
temp = x[j];
x[j] = x[i];
x[i] = temp;
}
}
}
for (int i = 1; i < count - 1; i++) {
aver = aver + x[i];
}
if (count > 2)
aver = aver / (count - 2);
else
aver = 0;
return aver;
}
}
class School implements CompurerAverage {
// 【代码1】重写public double average(double x[])方法,返回数值x[]的元素的算术平均
public double average(double x[]) {
int count = x.length;
double aver = 0, sum = 0;
for (int i = 0; i < count; i++) {
sum = sum + x[i];
}
aver = sum / count;
return aver;
}
}
public class Estimator {
public static void main(String args[]) {
double a[] = { 9.89, 9.88, 9.99, 9.12, 9.69, 9.76, 8.97 };
double b[] = { 89, 56, 78, 90, 100, 77, 56, 45, 36, 79, 98 };
CompurerAverage computer;
computer = new Gymnastics();
// 【代码2】computer调用average(double x[])方法,将数组a传递给参数x
double result = computer.average(a);
System.out.printf("%n");
System.out.printf("体操选手最后得分:%5.3f\n",result);
computer = new School();
// 【代码3】computer调用average(double x[])方法,将数组b传递给参数x
result = computer.average(b);
System.out.printf("班级考试平均分数:%-5.2f", result);
}
}
运行结果:
实验后的练习:
School类如果不重写public double average(double x[])方法,程序编译时提示怎样的错误?
实验2 货车的装载量
具体代码:
CheckCarWeight.java
package Truck_load;
//实验目的:掌握接口回调技术
//实验要求:货车要装载一批货物,货物由三种商品组成:电视、计算机、和洗衣机。卡车需要计算出整批货物载货的重量。
//要求有一个ComputeWeight接口,该接口中有一个方法:public double computeWeight()
//有三个实现该接口的类:Television、Computer和WashMachine。这三个类通过实现接口computeTotalSales给出自重。
//有一个Truck类,该类用ComputeWeight接口类型的数组作为成员(Truck类面向接口),那么该数组的单元就可以存放Television对象的引用、
//Computer对象的引用或WashMachine对象的引用。程序能输出Truck对象所装载的货物的总重量。
interface ComputerWeight {
public double computeWeight();
}
class Television implements ComputerWeight {
// 【代码1】重写computeWeight()方法
public double computeWeight() {
return 12.5;//康佳 LED42M3500PDE 含底座:12.5KG
}
}
class Computer implements ComputerWeight {
// 【代码2】重写computeWeight()方法
public double computeWeight() {
return 2.6;//华硕(ASUS)A53XI245SD-SL:2.6KG
}
}
class WashMachine implements ComputerWeight {
// 【代码3】重写computeWeight()方法
public double computeWeight() {
return 12;//小天鹅超大容量洗衣机:12KG
}
}
class Truck {
ComputerWeight[] goods;
double totalWeights = 0;
Truck(ComputerWeight[] goods) {
this.goods = goods;
}
public void setGoods(ComputerWeight[] goods) {
this.goods = goods;
}
public double getTotalWeight() {
totalWeights = 0;
// 【代码4】计算totalWeights
for(int i=0;i<goods.length;i++) {
totalWeights=totalWeights+goods[i].computeWeight();
}
return totalWeights;
}
}
public class CheckCarWeight {
public static void main(String[] args) {
ComputerWeight[] goods = new ComputerWeight[650];// 650件货物
for (int i = 0; i < goods.length; i++) {
if (i % 3 == 0)
goods[i] = new Television();
else if (i % 3 == 1)
goods[i] = new Computer();
else if (i % 3 == 2)
goods[i] = new WashMachine();
}
Truck truck = new Truck(goods);
System.out.printf("\n货车装载的货物重量:%-8.5f kg\n", truck.getTotalWeight());
goods = new ComputerWeight[68];// 68件货物
for (int i = 0; i < goods.length; i++) {// 简单分成两类
if (i % 2 == 0)
goods[i] = new Television();
else
goods[i] = new WashMachine();
}
truck.setGoods(goods);
System.out.printf("货车装载的货物重量:%-8.5f kg\n", truck.getTotalWeight());
}
}
运行结果:
实验3 小狗的状态
具体代码:
CheckDogState.java
package Puppy_Village;
//实验目的:掌握接口编成思想
//实验要求:小狗在不同环境条件下可能呈现不同的状态表现,要求用接口封装小狗的状态。具体要求如下。
//(1)编写一个接口DogState,该接口有一个名字为void showState()的方法。
//(2)编写Dog类,该类中有一个DogState接口声明的变量state。另外,该类有一个show()方法,在该方法中让接口state回调showState()方法。
//(3)编写若干个实现DogState接口的类,负责刻画小狗的各种状态。
//(4)编写主类,在主类中测试小狗的各种状态。
interface DogState {
public void showState();
}
class SoftlyState implements DogState {
public void showState() {
System.out.println("听主人的命令");
}
}
class MeetEnemyState implements DogState {
// 【代码1】重写public void showState()方法
public void showState() {
System.out.println("屈服吧,愚蠢的人");
}
}
class MeetFriendState implements DogState {
// 【代码2】重写public void showState()方法
public void showState() {
System.out.println("我还以为没有人理我了");
}
}
class MeetAnotherDog implements DogState {
// 【代码3】重写public void showState()方法
public void showState() {
System.out.println("要来一杯吗,我看你跟我一样");
}
}
class Dog {
DogState state;
public void show() {
state.showState();
}
public void setstate(DogState s) {
state = s;
}
}
public class CheckDogState {
public static void main(String[] args) {
Dog yellowDog = new Dog();
System.out.print("狗在主人面前:");
yellowDog.setstate(new SoftlyState());
yellowDog.show();
System.out.print("狗遇到敌人:");
yellowDog.setstate(new MeetEnemyState());
yellowDog.show();
System.out.print("狗遇到朋友:");
yellowDog.setstate(new MeetFriendState());
yellowDog.show();
System.out.print("狗遇到同伴:");
yellowDog.setstate(new MeetAnotherDog());
yellowDog.show();
}
}
运行结果:
实验后的练习 水的状态
具体代码:
WaterForm.java
package Water_form;
//实验目的:用面向接口的思想编写程序,模拟水杯中的水在不同温度下可能出现的状态。
interface State {// 形态接口
public void showState();// 表述形态的方法
}
class GasState implements State {
// 重写showState()方法
public void showState() {
System.out.println("该温度下水为气态(水蒸气)");
}
}
class LiquidState implements State {
// 重写showState()方法
public void showState() {
System.out.println("该温度下水为液态(自来水)");
}
}
class SolidState implements State {
// 重写showState()方法
public void showState() {
System.out.println("该温度下水为固态(冰雪糕)");
}
}
class Cup {
State state;
public void show() {
state.showState();
}
public void setstate(State s) {
state = s;
}
}
public class WaterForm {
public static void main(String[] args) {
Cup soda = new Cup();
System.out.print("水的温度为0~100摄氏度:");
soda.setstate(new LiquidState());
soda.show();
System.out.print("水的温度为小于0摄氏度:");
soda.setstate(new SolidState());
soda.show();
System.out.print("水的温度为大于100摄氏度:");
soda.setstate(new GasState());
soda.show();
}
}
运行结果: