详述接口

 

public interface  IMammal {//注意没有class
	
	public abstract void move() ;
	public abstract void  eat() ;	
}

1、定义:如果一个抽象类中都是抽象方法,则可以将该抽象类定义成接口   interface 

:接口一般以I开头,这样做使代码更加规范,增加了代码的可读性
2、接口中的抽象方法必须通过一个类来实现    implements  实现

      接口实现类:一个实现了接口中抽象方法的类,因为Whale类实现了接口中抽象方法,所以Whale类即是实现类

public  class Whale implements IMammal {
	
	@Override
	public void eat() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void move() {
		System.out.println("靠鳍游动......");
	}
}

接口注意事项

1前面已提及接口一般以I开头

2、public protected friendly private中 只有public 和默认的能修饰类和接口

3、类似抽象类,如果一个类没有实现接口中的所有抽象方法,则该类必须为抽象类


 

4、接口回调描述的是一种现象:接口声明的变量指向其实现类实例化的对象,那么该接口变量就可以调用接口中的抽象方法

      接口没有构造方法,不能创建自己的对象,但是可以引用实现类的对象   

接口中没有默认构造方法,而且也不能定义构造方法

 

5、接口中的变量为public static final常量,所以可以用类名调用,但不可二次定义赋值

(黄框左上角S F指的是static final)

6、接口中的抽象方法默认public abstract

所以接口里的方法可以不用写public abstract,如

public interface  IMammal {
	
	 void move() ;
	 void  eat() ;
	int age = 12;
}

7、Java8以前版本中规定,接口中所定义的方法只能是抽象方法,从在JDK8及其以后版本的JDK中开始,接口中可以添加一个或多个由default关键字修饰的非抽象方法——默认方法,该方法又称为扩展方法,该默认方法将由接口实现类创建的对象来调用,如下例:

public interface IMammal {
	
	void move();
	
	public default void eat() {
		System.out.println("哺乳动物正在吃......");
	}
}

 同样,从JDK8开始,接口中可以添加一个或多个由static关键字修饰的非抽象方法——静态方法,该方法将由接口直接调用,如下例

interface IMammal {
 
	void move();
 
	static void eat() {
		System.out.println("哺乳动物正在吃......");
	}
}

注意:接口中的静态方法实现类无法继承,                                     默认方法实现类可以继承,如下例
               

 8、通过extends关键字可以使自定义的接口实现继承,但需要注意以下两点:

接口只能继承父接口,不能继承抽象类和普通类。

接口弥补了Java单一继承的缺点(Java中的类只能继承一个父类),即接口可以继承多个父接口,它们之间用英文逗号隔开。

public interface SonSon extends  IMother,IFather

9、接口实现

 通过implements关键字实现接口,Java中的类只能是单继承,但类却可以实现多个接口以弥补Java类单继承的不足,其语法如     下:   

 访问控制符  修饰符  class  类名  implements  接口1  [,接口2, ……] {         变量;         方法;     }

               

 

10、 子接口可以实现父接口中的某些抽象方法

11、含有抽象方法的抽象类必须至少有一个子类完全实现了其抽象方法 √(如下图的son类)

        含有抽象方法的抽象类一定至少会有一个非抽象类,

12、(1)接口重复抽象方法,实现类实现一个;

                 

 


(2)接口中重复常量名,实现类必须指定到底调用哪个接口中的常量

13、一个类可以实现一个或n个接口;如果一个类没有实现接口中所有的抽象方法,则该类必须为抽象类

14、函数式接口

        如果接口内只定义一个抽象方法,则该接口称为函数式接口,如下例:

@FunctionalInterface
interface IMammal {
	
	String NAME = "哺乳动物";
 
	void move();
 
	public default void eat() {
		System.out.println("哺乳动物正在吃......");
	}

注意

可以使用@FunctionalInterface 注解来验证一个接口是不是函数式接口,Java8中java.lang.Runnable、java.util.Comparator<T>都是函数式接口;

函数式接口中可以定义多个常量、多个默认方法和多个静态方法,但只能定义一个抽象方法及多个java.lang.Object中的public方法,如下例: 

@FunctionalInterface
interface IMammal {
 
	void move();

	public default void eat() {
		System.out.println("哺乳动物正在吃......");

	boolean equals(Object obj);
}

其实equals是Object类里面的,按住Ctrl键然后点击equals选 Object implements就可以看到这个类内容,里面还有其他的类。也可以被接口定义。

抽象类与接口区别 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值