笔记15 接口

package test0909;


import java.lang.Comparable;		//	1导入接口; 由于java.lang包可以默认导入,顾可省略此步;
import java.util.Arrays;
/*
 * 		1、什么是接口?
 * 			是一套标准、是一套规则、是一套对所有类的统一的要求。
 * 
 * 		2、为什么会出现接口?
 * 			原因: 在java语言中规定,只支持单继承,不支持多继承。	
 * 				但是,为了实现多继承的现象,java专家提出接口。
 * 			因此,接口是为了实现多继承的功能而出现的;也可以说是为了让所有的类遵守一种统一的标准,一套统一的规则。
 * 
 * 		3、如何使用接口?
 * 			关键字:	implements
 * 			使用方式为:  public class 子类 [ extends 父类 ]  implements  接口 {......}
 * 
 * 		4、在java语言中,接口包含的成份只有两种:
 * 			1) 公共的静态的符号常量。 即: public static final 类型名 符号常量名 = 值;
 * 				例如: public static final double PI = 3.14;
 * 
 * 			2) 接口中的所有方法均为抽象的。
 * 				即: public abstract 类型名 方法名(参数列表) ;
 * 				例如:  public abstract int add( int x, int y );
 * 
 * 			注意: 接口中也可以什么都没有。
 * 
 * 		5、自定义一个接口
 * 			格式:  [ public ] interfact 接口名 { ...... }		//接口和类是一个数量级的;
 * 
 * 		6、在java语言,接口有两种:
 * 			1) 现存的接口(由专家制定好的,提供给程序员使用)。
 * 
 * 			2) 自定义接口(由程序员自已定义)。
 * 
 * 		7、如何使用现存的接口?
 * 			1) 导入( import )接口。
 * 			2) 编写一个类去实现( implements )该接口。
 * 			3) 要求在实现类中必须对继承自接口的所有抽象方法一一实现其功能(重写它们)。 
 * 			4) 编写一个测试类测试它。
 * 
 * 		典型案例:通过此案例理解并掌握接口的应用。
 * 			例如: 有许多学生,现要求他们按成绩由小到大排序。
 * 
 * 		8、自定义接口如何使用?
 * 			1) 定义( interface )一个接口;
 * 			2) 导入( import )该自定义的接口;
 * 			3) 编写一个类去实现( implements )该接口;
 * 			4) 在该实现类中重写来自接口的所有抽象方法;
 * 			5) 编写一个测试类并且在测试类需要人为调用重写后的方法。
 * 
 * 		9、接口与抽象类作一个对比?
 * 			1) 抽象类必须由 abstract 关键字修饰。
 * 			2) 抽象类一定有父类且仅有一个父类。
 * 			3) 抽象类包含零个或一个或多个抽象方法。
 * 			4) 抽象类必须被继承且其子类中必须重写来自父类的所有抽象方法。
 * 			
 * 			5) 接口必须由interface关键字生成。
 * 			6) 接口中只有两种成份: 公共的静态的符号常量 和 公共的抽象方法。
 * 			7) 接口可以被所有类实现,且该类必须重写来自接口的所有抽象方法。
 * 			8) 一个接口可以没有父接口,也可以只有一个父接口,还可以有多个父接口。
 * 				即: public interface 接口 [extends 父接口1 [, 父接口2 [, ...]]] { .......}
 */
public class InterfaceTest {
	public static void main(String[] args) {
	
		Students[] ss = new Students[5];
		
		ss[0] = new Students("张3" , false, 21, "尚学堂" , 650 );
		ss[1] = new Students("张5" , true, 20, "尚学堂" , 675 );
		ss[2] = new Students("张4" , false, 22, "北京大学" , 720 );
		ss[3] = new Students("张1" , true, 24, "尚学堂" , 630 );
		ss[4] = new Students("张2" , false, 23, "清华大学" , 750 );
	
		System.out.println("五个学生的基本信息如下: ");
		for( Students tem : ss ){
			System.out.println( tem  );
			System.out.println( "------------------------------");
		}
		
		//排序: 要排序,就必须比较大小。  
		//专家规定:凡是对象要比较大小,就必须使用统一的方法名,统一的返回值类型.
		//因此,这个方法就为 public abstract  int  compareTo(Object obj);
		//这一个抽象方法放置于 接口中最恰当。因为,接口可以被所有类实现。
		//此接口,专家制定好了。它为  Comparable 并存放于 java.lang.Comparable包中。
		Arrays.sort( ss ); //说明: sort()方法依赖 compareTo()方法。
		
		System.out.println("\n\n以上五个学生排序如下: ");
		for( Students tem : ss ){
			System.out.println( tem  );
			System.out.println( "------------------------------");
		}
	}
}
/*
 * 		结论:  凡是对象要比较大小,就需要实现Comparable接口,重写compareTo()方法,为
 * 			对象比较大小提供依据。
 *   
 */
class Persons {
	private String name;
	private final boolean SEX;
	private int age;
	
	public Persons() {
		int n = (int)( 2 * Math.random());
		this.SEX = n == 1;
	}

	public Persons(String name, boolean sex, int age) {
		this.name = name;
		SEX = sex;
		this.age = age;
	}
	
	public String toString() {
		return "" + name + "   " + (SEX ? "男":"女") + "   " + age;
	}
}

class Students extends  Persons  implements  Comparable  { 		//2 当前类实现接口Comparable为专家提供的接口
	
	//3 对继承自接口的抽象方法重写;目的是为对象比较大小提供依据。
	public int compareTo(Object obj) {
		Students st2 = (Students)obj;		//	强制将obj的类型转换为Students类;
		
		if( this.score > st2.score ){		//	按照成绩比较类的大小
			return 1; 
		}else if( this.score < st2.score ){
			return -1;
		}else{
			return 0;
		}
	}

	private String school;
	private int score ;
	
	public Students() {
		super();
	}
	public Students(String name, boolean sex, int age , String school, int score ){
		super( name, sex, age );
		this.school = school;
		this.score = score;
	}
	
	public String toString() {
		return super.toString() + "  " + school + "   " + score;
	}
}


 

package test0909;

public class DogInterfaceTest {
	public static void main(String[] args) {
		Dog d1 = new Dog("旺财", true, 2);
		Dog d2 = new Dog("小强", false, 1);
		Dog d3 = new Dog("大毛", true, 5);
		Dog d4 = new Dog("二黄", false, 3);
		Dog d5 = new Dog("小白", true, 4);
		
		Dog[] ds = { d1, d2, d3, d5, d4 };
		
		System.out.println("最初,五只小狗的信息如下:");
		for( int i = 0; i < ds.length; i++ ){
			System.out.println( ds[i] );
			System.out.println("-----------------");
		}
		
		//排序
		//Arrays.sort( ds ); //sort()方法与Comparable接口的compareTo()方法关联
		
		//自己编写代码实现排序
		for(int i = 0; i < ds.length; i++ ){
			for(int j = i+1;  j < ds.length;  j++ ){
				if( ds[i].compareTo(ds[j]) > 0 ){   //注意: 人为调用了重写的方法。
					
					Dog temp = ds[i];
					ds[i] = ds[j];
					ds[j] = temp;
				}
			}
		}
		
		System.out.println("\n按大小排序后,五只小狗的信息如下:");
		for( int i = 0; i < ds.length; i++ ){
			System.out.println( ds[i] );
			System.out.println("-----------------");
		}
	}
}

class Dog  implements  MyInterface {			//继承自己编写的MyInterface接口;

	//4 重写来自接口的所有抽象方法;让Dog类的对象拥有比较大小的功能。
	@Override
	public int compareTo(Object obj) {
		Dog d2 = (Dog) obj;
/*	
		if( this.age > d2.age ){
			return 1;
		}else if( this.age < d2.age ){
			return -1;
		}else{
			return 0;
		}
*/		
		return this.age - d2.age;		//比较dog的年龄属性;
	}
	
	private String name;
	private boolean sex;
	private int age;
	
	public Dog() {
	}

	public Dog(String name, boolean sex, int age) {
		this.name = name;
		this.sex = sex;
		this.age = age;
	}
	
	public String toString() {
		return name + "   " + (sex ? "公":"母") + "   " + age;
	}
	
}

interface  MyInterface {			//创建一个接口;
	
	//public abstract int compareTo(Object obj);		//专家给定的compareTo方法;
	public abstract int compareTo(Object obj);			//自己编写compareTo方法
	//其中public abstract这两个关键字可以省略,	//因为接口里面所有的方法都是公共的抽象方法
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值