接口的相关题目
1. 关键字 static
1. 请问 static 关键字可以修饰哪些元素?它们分别代表什么意义?
static 关键字可以修饰成员变量、成员方法及代码块,被 static 修饰的成员是类成员。
2. 请问 static 修饰的成员变量在内存中有什么特点?
被 static 修饰的成员随着类的加载而加载,静态成员变量被该类的所有对象共享。
3. 请问被 static 修饰的成员可以怎样调用它们?
静态成员可以使用类名访问,也可以使用对象访问,一般建议使用类名直接访问。
2. 关键字 final
1. 请写出 final 可以修饰的元素,并写出修饰后的含义。
修饰类:被 final 修饰的类,不能被其他类继承;
修饰变量:被 final 修饰的变量不能被重新赋值(引用类型的变量不能改变地址值);
修饰方法:被 final 修饰发方法,不能被子类重写。
3. 问答题
1. 请问子类实现接口使用什么关键字?
实现接口使用 implements
2. 请问子类实现接口后有什么要求?
子类实现接口后,需要重写接口中所有的抽象方法。
1. 多实现时父接口中有如下情况:
同名的抽象方法,仅需重写一次
同名的默认方法,必须重写
同名的静态方法,无需重写
2. 继承一个类,同时实现了一个或多个接口时出现如下情况:
父类中的方法和父接口中的抽象方法同名,就近原则
3. 请问子类是否可以同时实现多个接口?
可以
4. 请问子类是否可以在继承一个类的同时实现多个接口?
可以
5. 请问接口是否可以继承一个或多个接口?
可以
4. 编程题 1
- 请定义“员工(类)”:
- 属性:姓名、性别、年龄(全部私有)
- 行为:工作(抽象)
- 无参、全参构造方法
- get/set 方法
- 请定义“绘画(接口)”:
- 抽象方法:绘画
- 请定义“Java员工类”继承自“员工类”。
- 请定义”UI员工类”,继承自“员工类”,并实现“绘画”接口。
- 请按上述要求设计出类结构,并实现相关的方法,并进行调用测试。
参考答案:
- 员工类
/**
* 员工
*/
public abstract class Employee {
//成员变量
private String name; //姓名
private String gender; //性别
private String age; //年龄
//空参构造
public Employee() {
}
//全参构造
public Employee(String name, String gender, String age) {
this.name = name;
this.gender = gender;
this.age = age;
}
//成员方法
public abstract void work();
//getter & setter 略
}
- 绘画接口
/**
* 绘画
*/
public interface Paint {
void paint();
}
- Java 员工类
/**
* Java 员工 继承 员工类
*/
public class JavaEmployee extends Employee {
@Override
public void work() {
System.out.println("Java 员工正在工作...");
}
}
- UI 员工类
/**
* UI员工 继承 员工类 实现 绘画接口
*/
public class UIEmployee extends Employee implements Paint {
@Override
public void work() {
System.out.println("UI 员工正在工作...");
}
@Override
public void paint() {
System.out.println("UI 员工正在绘画...");
}
}
5. 编程题 2
- 一个机动车管理系统中有以下类的设计:
- 机动车类:
- 汽车类:
- 奔驰车
- 宝马车
- 摩托车类:
- 雅马哈摩托
- 宝马摩托
- 机动车类:
- 所有的车都有如下信息:
- 属性:品牌、价格
- 行为:运行
- 现在要求为所有“宝马车系”的汽车增加一个 GPS 功能。
- 请设计出上述的类结构,并用代码实现。
参考答案:
- 机动车
**
* 机动车
*/
public class MotorVehicle {
private String brand; //品牌
private String type; //类型
private int maxSpeed; //最大速度
//行驶
public void run() {
System.out.println(brand + type + "以每小时" + maxSpeed + "公里的速度在狂奔...");
}
//空参构造
public MotorVehicle() { }
//全参构造
public MotorVehicle(String brand, String type, int maxSpeed) {
this.brand = brand;
this.type = type;
this.maxSpeed = maxSpeed;
}
//getter & setter 略
}
- GPS
/**
* GPS
*/
public interface GPS {
//定位
void positioning();
}
- 汽车
/**
* 汽车类 继承 机动车类
*/
public class Car extends MotorVehicle {
//空参构造
public Car() { }
//全参构造
public Car(String brand, int maxSpeed) {
super(brand, "汽车", maxSpeed); //确定类型为汽车
}
}
- 奔驰汽车
/**
* 奔驰汽车 继承 汽车类
*/
public class BenzCar extends Car {
//构造方法
public BenzCar(int maxSpeed) {
super("奔驰", maxSpeed); //确定品牌
}
}
- 宝马汽车
/**
* 宝马汽车 继承 汽车类 实现 GPS接口
*/
public class BMWCar extends Car implements GPS {
//构造方法
public BMWCar(int maxSpeed) {
super("宝马", maxSpeed); //确定品牌
}
//重写接口中的方法
@Override
public void positioning() {
System.out.println("使用GPS定位...");
}
}
- 摩托车
/**
* 摩托车 继承 机动车
*/
public class Motorcycle extends MotorVehicle {
//空参构造
public Motorcycle() { }
//全参构造
public Motorcycle(String brand, int maxSpeed) {
super(brand, "摩托车", maxSpeed); //确定类型为摩托车
}
}
- 雅马哈摩托车
/**
* 雅马哈摩托车 继承 摩托车类
*/
public class YamahaMoto extends Motorcycle {
//构造方法
public YamahaMoto(int speed) {
super("雅马哈", speed); //确定品牌
}
}
- 宝马摩托车
/**
* 宝马摩托车 继承 摩托车 实现 GPS接口
*/
public class BMWMoto extends Motorcycle implements GPS {
//构造方法
public BMWMoto(int speed) {
super("宝马", speed); //确定品牌
}
//重写接口中的方法
@Override
public void positioning() {
System.out.println("使用GPS定位...");
}
}
- 测试
public class Demo {
public static void main(String[] args) {
//汽车
BenzCar benzCar = new BenzCar(220);
benzCar.run();
BMWCar bmwCar = new BMWCar(230);
bmwCar.run();
bmwCar.positioning();
//摩托车
YamahaMoto yamahaMoto = new YamahaMoto(120);
yamahaMoto.run();
BMWMoto bmwMoto = new BMWMoto(125);
bmwMoto.run();
bmwCar.positioning();
}
}