Jave新人之路 -- 接口

接口

1. 基本定义

  • 定义:当抽象类中的方法都是抽象方法的时候,建议将该类定义为接口

  • 接口特点:耦合性低、规则性强、扩展性强等,接口与接口之间可以多继承,类与接口之间可以多实现

  • 存在的意义:主要是用于定义规范/规则。定义的是可能用到的功能,现在不用不代表以后不用

  • 关键词:interface(接口)、implements(实现)

注意事项:

  • 接口中的方法一定是抽象方法,变量一定是静态的常量

(因为接口不存在对象,所有没有变量,只可以是静态的常量,无需对象可以直接通过类名调用)

  • 接口中的常量默认修饰符是public static,方法的默认修饰符是public abstract。可以省略,但是我们推荐把注释和修饰符都写上

2. 接口的多继承和多实现

第一、类与接口之间的多实现

   interface Food {
		void eat();
	
		void print();
	}
	
	interface Drinks {
		void drink();
	
		void print();
	}
	
	class A {
		public void Full() {
		};
	}

//原则,先继承后实现
	class Dinner extends A implements Food, Drinks {// 这个操作是一个继承

		@Override
		public void eat() {
			// TODO Auto-generated method stub
		}
	
		@Override
		public void drink() {
			// TODO Auto-generated method stub
		}
	
		public void print() {
		}
		// 因为没有方法体,不会出现调用不明确的情况,只要调用成功即可,从A中还是B中调用show方法没有区别,所以接口才能实现多实现A,B
	
	}

}

第二,接口之间形成继承体系

	    // 酒
	interface Liquor {
		// 让人喝醉
		void inebriation();
	}
	     // 金酒
	interface Gin extends Liquor {// 接口间的继承体系
		// 可以入药
		void medicine();
	}
	
	// 哥顿牌的金酒
	class Goudon implements Gin {//
		public void price() {
		}
		
		@Override
		public void inebriation() {
			
		}
		
		@Override
		public void medicine() {
		
	
		}
	}

第三、接口与接口之间多继承

// 酒
interface Liquor {
		// 让人喝醉
		void inebriation();
	}

// 烈酒
interface Spirit {
	// 酒精度
	void proof();
}

// 金酒
interface Gin extends Liquor, Spirit { //接口间的多继承关系
	// 可以入药
	void medicine();
}

// 哥顿牌的金酒
class Goudon implements Gin {//
	public void price() {
	}

	@Override
	public void inebriation() {
	
	}

	@Override
	public void medicine() {
	
	}

	@Override
	public void proof() {
		
	}
}

3. 接口中的默认方法

  • 接口是由抽象类延伸过来的,抽象类是由继承延伸过来的,总之就是接口本质也是继承的概念。抽象类中定义的是该类事物的公共的属性及方法,接口中定义的是额外的功能及属性;

  • 继承的目的:将公共的属性和方法抽离出来以简化代码,接口也具备该目的

  • 接口的目的:可以定义额外的功能,也可以定义公共的功能(在抽象类的基础上,如果你还需要所有的子类有一个共同的功能,就使用默认功能)

  • 接口默认方法的作用:当多个类中都是用到了同一个功能的时候,那么该功能相当于就是这一类事物的共有方法,可以直接使用

interface Liquor {
	// 额外的共同点
	default void alcohol() {
		System.out.println("都是酒精饮料");
	}
    //共同的功能酒精度
	void proof();

}

class Gin implements Liquor {
	public void origin() {
		System.out.println("产自英格兰");
	}

@Override
public void proof() {
	System.out.println("这是42°的酒");

   }

}

class Rum implements Liquor {
	public void material() {
		System.out.println("使用甘蔗糖蜜酿造");
	}



	@Override
	public void proof() {
		System.out.println("这是40°的酒");
	}
}


最后的输出结果中物流是在类Gin还是类Rum中的对象都可以调用默认方法alcohol,然后输出为都是酒精饮料

如果一个类继承的两个接口中有同样的默认方法,使用哪个是可选的,但是必须进行选择和重写

interface Liquor {
	// 额外的共同点
	default void alcohol() {
		System.out.println("都是酒精饮料");
	}
    //共同的功能酒精度
	void proof();

}
interface Liquor2 {
	default void alcohol() {
		System.out.println("第二接口的默认方法");
	}
	void proof();
}


在使用的时候

class Rum implements Liquor,Liquor2 {

  @Override
	  public void alcohol() {
		Liquor.super.alcohol();
		//如果你将Liquor改为Liquor2,输出就是"第二接口的默认方法"
		//此处的super就是指代子类对象,因为没有对象方法体没法实现
	}
}

总结(抽象类和接口之间的区别):

1、接口中都是抽象方法,抽象类中还可以有普通方法

2、抽象类中可以有构造器,接口中没有

3、抽象类中定义的是公共的功能,接口中定义的额外的功能

4、不同于抽象类,接口可以实现接口之间的多继承

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值