接口应用的练习
接口用法总结
- 通过接口可以实现不相关类的相同行为,而不需要考虑这些类之间的层次关系。
- 通过接口可以指明多个类需要实现的方法,一般用于定义对象的扩张功能。
- 接口主要用来定义规范。解除耦合关系。
练习一、
package eleven;
//接口的应用
public class TestUSB {
public static void main(String[] args) {
Computer com = new Computer();
com.doWork(new Printer());
Flash f = new Flash();
com.doWork(f);
//实现接口的匿名类的对象
USB phone = new USB(){
@Override
public void start() {
System.out.println("手机开始工作");
}
@Override
public void stop() {
System.out.println("手机停止连接");
}
};
com.doWork(phone);
//实现接口的匿名类的对象
com.doWork(new USB(){
@Override
public void start() {
System.out.println("手机开始工作");
}
@Override
public void stop() {
System.out.println("手机停止连接");
}
});
}
}
class Computer{
public void doWork(USB usb){
usb.start();
System.out.println("。。。此设备开始操作。。。");
usb.stop();
}
}
interface USB{
//USB的尺寸的大小,可以设置为常量
//功能设置为抽象方法
void start();
void stop();
}
//打印机
class Printer implements USB{
public void start(){
System.out.println("打印机开始工作");
}
public void stop(){
System.out.println("打印机停止工作");
}
}
//U盘
class Flash implements USB{
public void start(){
System.out.println("U盘开始工作");
}
public void stop(){
System.out.println("U盘停止工作");
}
}
练习二、
package eleven;
/*
* 定义一个接口用来实现两个对象的比较。
interface CompareObject{
public int compareTo(Object o); //若返回值是 0 , 代表相等; 若为正数,代表当前对象大;负数代表当前对象小
}
定义一个Circle类。
定义一个ComparableCircle类,继承Circle类并且实现CompareObject接口。
在ComparableCircle类中给出接口中方法compareTo的实现体,用来比较两个圆的半径大小。
定义一个测试类TestCircle,创建两个ComparableCircle对象,
调用compareTo方法比较两个类的半径大小。
*/
public class TestCircle {
public static void main(String[] args) {
ComparableCircle c1 = new ComparableCircle(2.3);
ComparableCircle c2 = new ComparableCircle(2.1);
ComparableCircle c3 = new ComparableCircle(2.3);
int i1 = c1.compareTo(c2);
int i2 = c1.compareTo(c3);
int i3 = c2.compareTo(c1);
System.out.println(i1);//1
System.out.println(i2);//0
System.out.println(i3);//-1
int i4 = c1.compareTo(new String());
}
}
interface CompareObject {
int compareTo(java.lang.Object o);
}
class Circle {
private double radius;
public Circle() {
super();
}
public Circle(double radius) {
super();
this.radius = radius;
}
public double getRadius() {
return radius;
}
public void setRadius(double radius) {
this.radius = radius;
}
}
class ComparableCircle extends Circle implements CompareObject {
public ComparableCircle(double radius){
super(radius);
}
@Override
public int compareTo(java.lang.Object o) {
if (this == o) {
return 0;
} else if (o instanceof ComparableCircle) {
ComparableCircle c = (ComparableCircle) o;
if (this.getRadius() > c.getRadius()) {
return 1;
} else if (this.getRadius() < c.getRadius()) {
return -1;
} else {
return 0;
}
} else {
// return -2;
throw new RuntimeException("传入的非ComparableCircle的对象,不可进行比较");
}
}
}
练习三: 抽象类的应用练习:
代码一:
package eleven;
/*
* MyDate类包含:
private成员变量month,day,year;
toDateString()方法返回日期对应的字符串:xxxx年xx月xx日
*/
public class MyDate {
private int year;
private int month;
private int day;
public MyDate(int year, int month, int day) {
super();
this.year = year;
this.month = month;
this.day = day;
}
public String toDateString(){
return year + "年" + month + "月" + day + "日";
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
this.month = month;
}
public int getDay() {
return day;
}
public void setDay(int day) {
this.day = day;
}
}
代码二:
package eleven;
/*
* 定义一个Employee类,该类包含:
private成员变量name,number,birthday,其中birthday 为MyDate类的对象;
abstract方法earnings();toString()方法输出对象的name,number和birthday。
*/
public abstract class Employee {
private String name;
private int number;
private MyDate birthday;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public MyDate getBirthday() {
return birthday;
}
public void setBirthday(MyDate birthday) {
this.birthday = birthday;
}
public Employee(String name, int number, MyDate birthday) {
super();
this.name = name;
this.number = number;
this.birthday = birthday;
}
public abstract double earnings();
@Override
public String toString() {
return "name=" + name + ", number=" + number + ", birthday="
+ birthday.toDateString() + "]";
}
}
代码三:
package eleven;
/*
* 定义SalariedEmployee类继承Employee类,实现按月计算工资的员工处理。该类包括:
private成员变量monthlySalary;
实现父类的抽象方法earnings(),该方法返回monthlySalary值;toString()方法输出员工类型信息
及员工的name,number,birthday。
*/
public class SalariedEmployee extends Employee {
private double monthlySalary;// 月工资
public SalariedEmployee(String name,int number,MyDate birthday,double monthlySalary) {
super(name,number,birthday);
this.monthlySalary = monthlySalary;
}
public double earnings() {
return monthlySalary;
}
@Override
public String toString() {
return "SalariedEmployee [" + super.toString() + "monthlySalary="
+ monthlySalary + "]";
}
}
代码四:
package eleven;
/*
* 参照SalariedEmployee类定义HourlyEmployee类,实现按小时计算工资的员工处理。该类包括:
private成员变量wage和hour;
实现父类的抽象方法earnings(),该方法返回wage*hour值;toString()方法输出员工类型信息
及员工的name,number,birthday。
*/
public class HourlyEmployee extends Employee {
private double wage;
private double hour;
public double earnings() {
return wage * hour;
}
public HourlyEmployee(String name, int number, MyDate birthday,
double wage, double hour) {
super(name, number, birthday);
this.wage = wage;
this.hour = hour;
}
@Override
public String toString() {
return "HourlyEmployee [" + super.toString() + "wage=" + wage
+ ", hour=" + hour + "]";
}
}
代码五:
package eleven;
import java.util.Scanner;
/*
* 定义PayrollSystem类,创建Employee变量数组并初始化,该数组存放各类雇员对象的引用。
* 利用循环结构遍历数组元素,输出各个对象的类型,name,number,birthday,以及该对象生日。
* 当键盘输入本月月份值时,如果本月是某个Employee对象的生日,还要输出增加工资信息。
*/
public class PayrollSystem {
public static void main(String[] args) {
Employee[] emps = new Employee[2];
emps[0] = new SalariedEmployee("李雷", 1001, new MyDate(1998, 12, 21),
8800);
emps[1] = new HourlyEmployee("韩梅梅", 1002, new MyDate(1987, 4, 30), 100,
6);
Scanner s = new Scanner(System.in);
System.out.println("请输入本月的月份:");
int month = s.nextInt();
for(int i = 0;i < emps.length;i++){
if(month == emps[i].getBirthday().getMonth()){
System.out.println("加工资,加100!");
}
System.out.println(emps[i]);
}
}
}
韧桂 2019-12-31