第1关:接口的定义与使用-学生还是老师
100
- 任务要求
- 参考答案
- 评论52
任务描述
又是一节Java课,小明新学会了接口这一新概念,回到家后迫不及待的开始使用接口来写一个输出学生或是老师的小程序,请你来一起指导。
相关知识
接口的基本概念
虽然编写接口的方式和类很相似,但接口并不是类,它们是不同的两个概念。类描述对象的属性和方法,接口则包含类要实现的方法。接口无法被实例化,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。
接口与类的相似点
- 一个接口可以有多个方法。
- 接口文件保存在 .java 结尾的文件中,文件名使用接口名。
- 接口的字节码文件保存在 .class 结尾的文件中。
- 接口相应的字节码文件必须在与包名称相匹配的目录结构中。
接口与类的区别
- 接口没有构造方法。
- 接口中所有的方法必须是抽象方法。
- 接口不能包含成员变量,除了 static 和 final 变量。
- 接口不是被类继承,而是要被类实现。
- 接口支持多继承。
接口的特性
- 接口中每一个方法是隐式抽象的,接口中的方法会被隐式的指定为 public abst\fract(只能是 public abst\fract,其他修饰符都会报错)。
- 接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量(并且只能是 public,用 private 修饰会报编译错误。
- 接口中的方法不能在接口中实现,只能由实现接口的类来实现。
接口与抽象类的区别
- 抽象类中的非抽象方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行。
- 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的。
- 抽象类可以有静态代码块和静态方法(用 static 修饰的方法),而接口中不能含有。
- 一个类只能继承一个抽象类,而一个类可以实现多个接口。
接口的声明
接口的声明使用 interface 关键字:
public interface InterfaceName {
public returnType methodName();
}
注意事项:
- 接口是隐式抽象的,当声明一个接口的时候,不必使用 abst\fract 关键字。
- 接口中每一个方法也是隐式抽象的,声明时同样不必使用 abst\fract 关键字。
- 接口中的方法都是公有的。
接口的实现
当类实现接口的时候,类要实现接口中所有的方法。否则,类必须声明为抽象类。
使用 implements 关键字实现接口:
public class ClassName implements InterfaceName {
public returnType methodName() { //必须实现接口中的方法
...
}
}
编程要求
本关的编程任务是补全右侧代码片段中Begin
至End
中间的代码,具体要求如下:
- 定义一个Introduce接口,包括一个introduction()方法,输出格式见测试样例。
- 定义一个Student类和一个Teacher类实现Introduce接口。
评测说明
平台将自动编译补全后的代码,并生成若干组测试数据,接着根据程序的输出判断程序是否正确。
以下是测试样例:
测试输入: 学生 预期输出: 我是一名学生!
人需要一种淡然、朴实。需要脚踏实地的平实,丰富而不肤浅、恬淡而不聒噪、理性而不盲从。避开无事时过分热络的友谊,这会使你少些负担和承诺。在物欲横流的滚滚红尘中,更需要一份淡泊的心境,谢绝繁华,回归简朴。淡定从容的笑对人生。 开始你的任务吧,祝你成功!
package step1;
import java.util.Objects;
import java.util.Scanner;
public class StudentOrTeacher {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String string = scanner.next();
if (Objects.equals(string, "学生")) {
Student student = new Student();
student.introduction();
}
else if (Objects.equals(string, "老师")) {
Teacher teacher = new Teacher();
teacher.introduction();
}
}
}
/********** Begin *********/
interface Introduce {
public void introduction();
}
class Student implements Introduce{
public void introduction(){
System.out.print("我是一名学生!");
}
}
class Teacher implements Introduce{
public void introduction(){
System.out.print("我是一名老师!");
}
}
/********** End *********/
第2关:接口的继承-体育爱好
200
- 任务要求
- 参考答案
- 评论52
任务描述
不同的人有不同的对体育赛事的爱好,本关我们需要利用接口继承相关的知识编写一个小程序,让不同的人可以说出他们各自的体育爱好。
相关知识
接口的继承
一个接口能继承另一个接口,和类之间的继承方式比较相似。接口的继承也是使用 extends 关键字,子接口继承父接口的方法。
下面的Sports接口被Hockey和Football接口继承:
// 文件名: Sports.java
public interface Sports {
public void setHomeTeam(String name);
public void setVisitingTeam(String name);
}
// 文件名: Football.java
public interface Football extends Sports {
public void homeTeamScored(int points);
public void visitingTeamScored(int points);
public void endOfQuarter(int quarter);
}
// 文件名: Hockey.java
public interface Hockey extends Sports {
public void homeGoalScored();
public void visitingGoalScored();
public void endOfPeriod(int period);
public void overtimePeriod(int ot);
}
在上面的程序中,Hockey接口自己声明了四个方法,从Sports接口继承了两个方法,这样,实现Hockey接口的类需要实现六个方法。相似的,实现Football接口的类需要实现五个方法,其中两个来自于Sports接口。
接口的多继承
在Java中,类的多继承是不合法,但接口允许多继承。
在接口的多继承中extends关键字只需要使用一次,在其后跟着继承接口。 如下所示:
public interface Hockey extends Sports, Event {
...
}
编程要求
本关的编程任务是补全右侧代码片段中Begin
至End
中间的代码,完成MyFavourateTeam类以实现其需要实现的接口,具体要求如下:
- 通过
setSports()
设置喜欢的体育赛事类型,如篮球、足球; - 通过
setTeam()
设置支持的队伍,如洛杉矶湖人、皇家马德里等; - 通过
introduction()
大声说出你喜欢的运动,和喜欢的球队,格式如下:“我最喜欢的体育运动是xxx,我最喜欢的球队是xxx”。(具体输入输出格式可参见测试样例)
评测说明
平台将自动编译补全后的代码,并生成若干组测试数据,接着根据程序的输出判断程序是否正确。
以下是测试样例:
测试输入: 篮球 洛杉矶湖人 预期输出: 我最喜欢的体育运动是篮球,我最喜欢的球队是洛杉矶湖人
对所学知识内容的兴趣可能成为学习动机。 —— 赞科夫 请继续你的实训任务,祝你成功!
package step2;
import java.util.Scanner;
public class SportsEvents {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String sports = scanner.next();
String team = scanner.next();
MyFavourateTeam myFavourateTeam = new MyFavourateTeam();
myFavourateTeam.setSports(sports);
myFavourateTeam.setTeam(team);
myFavourateTeam.introduction();
}
}
interface Sports {
void setSports(String sports);
}
interface Team {
void setTeam(String team);
}
interface ChooseTeam extends Sports, Team {
void introduction();
}
/********** Begin *********/
class MyFavourateTeam implements ChooseTeam {
private String Sports;
private String Team;
public void setSports(String Sports){
this.Sports=Sports;
}
public void setTeam(String Team){
this.Team=Team;
}
public void introduction(){
System.out.println("我最喜欢的体育运动是"+this.Sports+",我最喜欢的球队是"+this.Team);
}
}
/********** End *********/