Home

韧桂

思考,总结

接口应用的练习

接口用法总结

  • 通过接口可以实现不相关类的相同行为,而不需要考虑这些类之间的层次关系。
  • 通过接口可以指明多个类需要实现的方法,一般用于定义对象的扩张功能。
  • 接口主要用来定义规范。解除耦合关系。

练习一、

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