详述java接口

目录

一.定义接口

二.接口的特点

1.命名

2.构造方法

3.实现类的实现

4.属性的默认的修饰符

 5.方法的默认的修饰符

三.接口的使用

1.接口中的方法

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

3.两个接口中重名问题

 四.拓展

1.类的访问权限修饰符

2.抽象类的实现


一.定义接口

一个抽象类中可以有多个抽象方法还可以没有抽象方法,可以没有其他方法也可以都是其他方法,但是当一个抽象类中只有抽象方法时,就可以将该抽象类定义成一个接口,定义方法就是将abstract class改成interface,以下就是一个简单的接口:

//接口
public interface Mammal {

	public abstract void move();
	
	public abstract void eat();
}

接口中的抽象方法也同样需要一个类来实现它们,这个类就叫做实现类,和抽象类的子类不同,实现类不是通过extends继承父类,而是通过implements来实现,如下:

//接口
public interface Mammal {

	public abstract void move();
	
	public abstract void eat();
}

//实现类
public class Whale implements Mammal{

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

	@Override
	public void eat() {
		System.out.println("eating...");
	}
}

二.接口的特点

1.命名

接口名的命名一般以大写I开头,所以上段代码中的接口名规范的命名应该是这样:

//接口
public interface IMammal {

	public abstract void move();
	
	public abstract void eat();
}

2.构造方法

接口和抽象类一样不能创建对象。但不同的是,抽象类中存在默认的无参构造方法,但是接口不存在默认的构造方法,也不能自定义构造方法,像下面这样在接口中定义构造方法,创建接口的对象,都会报错:

//接口
public interface IMammal {

	public IMammal() {//接口中不能定义构造方法
		
	}
	public abstract void move();
	
	public abstract void eat();
}


//实现类
public class Whale implements IMammal{

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

	@Override
	public void eat() {
		System.out.println("eating...");
	}
	
	public static void main(String[] args) {
		IMammal mammal = new IMammal();//实现类中不能创建接口的对象
	}
}

3.实现类的实现

和抽象类一样,如果一个类没有实现接口中的所有抽象方法,则没有实现的抽象方法都被继承到了这个类中,所以该类一定是个抽象类:

//接口
public interface IMammal {

	public abstract void move();
	
	public abstract void eat();
}


//实现类
public abstract class Whale implements IMammal{//抽象类

	@Override
	public void move() {
		System.out.println("鱼鳍游动、、、");//只实现了接口中的一个抽象方法
	}
}

4.属性的默认的修饰符

接口中是可以定义属性的,但是接口中的属性均为默认的public、static、final。

首先,它是静态的,接口所以虽然不能创建对象,但是可以在实现类中通过类来调用静态属性,像下面的代码便可打印接口中的属性:

//接口
public interface IMammal {

	int age=10;//默认static的属性
	public abstract void move();
}


//实现类
public class Whale implements IMammal{

	@Override
	public void move() {
		System.out.println("鱼鳍游动、、、");//接口中抽象方法的实现
	}
	
	public static void main(String[] args) {
		System.out.println(IMammal.age);//类名调用接口的属性
	}
}

再就是,接口中的属性一定是个常量,如何证明呢?在实现类中修改它的值,就像下面这样,发现无法修改,则证明接口中属性的值是常量:

//接口
public interface IMammal {

	int age=10;//默认static的属性
	public abstract void move();
}


//实现类
public abstract class Whale implements IMammal{

	@Override
	public void move() {
		System.out.println("鱼鳍游动、、、");
	}
	
	public static void main(String[] args) {
		IMammal.age=1;
	}
}

 5.方法的默认的修饰符

接口中的抽象方法都是默认的public、abstract,所以在接口中定义抽象方法的时候大可不必再在方法前敲那么多修饰符了,直接像下面这样写即可:

//接口
public interface IMammal {

	void move();
	
	void eat();
}

三.接口的使用

这是接口的一大重点难点,接口的使用上有许许多多的细节上的注意事项:

1.接口中的方法

第一个是和JDK版本有关的,在JDK8及其以后的版本的JDK中,接口内不再是仅可以定义抽象方法了,还可以定义static修饰的静态方法与default关键字修饰的默认方法。

如何更改JDK版本见博客: Eclipse如何更改JDK版本

这时我们在接口中定义下面代码中的两种非抽象的方法就会发现编译器报错,这时如果按刚才叙述的步骤将JDK改回1,8版本就会显示编译正确:

//接口
public interface IMammal {

	void move();
	
	default void breath() {
		
	}
	
	static void speak() {
		
	}
}

要注意一点就是,刚才说到接口中的抽象方法都是默认的public访问权限,但是上面这两个非抽象的方法的访问权限是自己定义的,没有默认的public。

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

在java中,类只有单继承,也就是说一个类只能有一个父类,但是接口可以多继承,而接口的继承又分为两种:

       第一种:一个类可以实现多个接口,但不能继承接口。既然是实现类,当然也满足:如果没有实现所有接口中所有的抽象方法,则该类必须为抽象类。下面是示例:

//接口一
public interface Mother {

	void eat();
}


//接口二
public interface Father {

	void move();
}


//两个接口的实现类
public class Son implements Father,Mother{

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

	@Override
	public void move() {
		// TODO Auto-generated method stub
		
	}
}

       第二种:接口可以继承多个接口,但不能继承类:

//接口一
public interface Mother {

	void eat();
}


//接口二
public interface Father {

	void move();
}


//两个接口的子接口
public interface Son extends Father,Mother{

}

这里要注意的是,子接口可以继承父接口,但是不能实现父接口中的方法,因为子接口也是个接口,无法对抽象方法进行重写操作。

3.两个接口中重名问题

       第一种:当两个接口中有重复抽象方法,这时实现类实现一个即可

但是如果只有方法名重复但是参数列表不相同,就出现了方法的重载,这时需要在实现类中实现两个方法。

要注意的是,如果两个重名的方法仅有返回值不相同时,就像下面这样,编译器会报错:

//接口一
public interface Mother {

	void eat();
}

//接口二
public interface Father {

	int eat();
}

//两个接口的实现类
public class Son implements Father,Mother{

}

第二种:当接口中重复常量名,实现类必须指定到底调用哪个接口中的常量;假如有如下两个接口中有两个重名的常量,那么在实现类中调用的时候,必须用类名指定调用的是谁:

//接口一
public interface Mother {

	double AGE=2.0;
}

//接口二
public interface Father {

	int AGE=10;
}

//两个接口的实现类
public class Son implements Father,Mother{

	public static void main(String[] args) {
		System.out.println(Mother.AGE);
		System.out.println(Father.AGE);
	}
}

 四.拓展

1.类的访问权限修饰符

public protected friendly private四个访问权限修饰符中,只有默认的和public可以修饰类

2.抽象类的实现

含有抽象方法的抽象类必须至少有一个子类完全实现了其所有的抽象方法,换句话说,含有抽象方法的抽象类至少有一个非抽象子类,因为抽象类如果一个非抽象子类都没有,所有子类包括父类都不能创建对象,所以失去了作用。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值