关于接口的学习收获

接口的声明

java语言只支持单继承机制,不支持多继承。但若遇到复杂问题,单继承会给程序设计带来很多问题。Java语言使用接口解决这个问题。Java语言规定一个子类只能继承一个父类,能实现多个接口。通过接口可以指明多个类需要实现的一组方法。接口可以比抽象类更好地规范子类的行为,实现多态性但接口不能实现代码复用。

接口可以实现多继承,类只允许单继承

声明接口时,需要使用interface关键字,其语法格式如下:

<public> <abstract> interface	接口名称 [extends父接口列表]{	

        <public> <static> <final> 变量名=初值;	                     // 静态常量	

        <public> <abstract> 返回值 方法名([参数表]) throws [[异常列表];//抽象方法

说明:

默认修饰符:其中用尖括号括起来的修饰符是是默认的修饰符,通常省略不写。

接口名称:接口的名字,有时还会在接口名宇字后加 able 或 ible 作为结尾,或者在名字前加一个字母“I”。

多继承:可以使用extends来继承父接口,但但它与类中的extends不同,它可以有多个父接口,各父接口间用逗号“,”隔开。

常量:接口可以有静态的公开常量,即用public static final加以修饰。接口不能有成变量,否则会因为多继承造成同名变量的问题。

方法:接口中的所有方法都是抽象的和公开的,即用public abstract 修饰。

与抽象类一样,接口不能被实例化。

接口的实现

接口的定义格式:

接口一般以"I"开头。

[访问修饰符] interface 接口名[extends 接口1, 接口2, ...] {


    常量

    抽象方法
}

抽象类定义格式

public abstract class 类名 [extends 基类]{
    成员变量
    构造方法
    getter与setter方法
    普通方法

    .....

    abstract 方法
}
    
接口抽象类
区别只包含常量及抽象方法 (JDK7之前)可以包含有一般成员,也可以包含有抽象方法。
成员默认为public的成员可以是私有的、受保护的、内部的或公有的
变量默认为final的可以包含非final的变量
抽象方法可以不加abstract,默认abstract抽象方法一定要加abstract
相同点只能被继承,不能实例化

一旦定义了接口,会有一个或更多的类来实现这个接口。由于接口中只有静态常量和抽象方法

故实现接口的类必须定义接口中的抽象方法。接口实现的语法格式为:

Class 类名 implements 接口名称{	// 接口的实现

    //类体

}

例子:求给定圆的面积。

运行结果如下图所示:

注意:

一个类可以实现多个接口,在implements后列出需要实现的接口名。

如果某个类不是abstract类型,那么类要实现该接口的所有抽象方法。

在类中实现接口的抽象方法中,必须与接口中定义的方法头完全一致,即方法名、返回值类型及形参列表要完一致。如果方法名相同,但参数不同,则不是实现接口的抽象方法,而是定义新的方法。

public interface Shape2D {
	double PI = 3.1415926;  //定义静态常量PI
	double area();          //定义求面积的抽象方法
}
public class Circlel implements Shape2D{
	double radius;
	public void setRadius(double radius){
		this.radius = radius;
	}
	public double area(){
		return PI*radius*radius;
	}
}
public class InterfaceDemo {
	public static void main(String[] args) {
		Circlel c = new Circlel();
		c.setRadius(10);
		System.out.print("Circle area:"+c.area());
	}
}

在一个接口时,如果接口中的某个抽象方法在类中没有实现,则该类是一个抽象类,不能生成

对象。

接口的继承

接口可以通过关键字 extends 继承其他接口。子接口将继承父接口中所有的常量和抽象方法。子接口的实现不仅要实现子接口的抽象方法,还要实现父接口的所有抽象方法。

例子接口的继承

运行结果如下图所示:

public interface Shape3D extends Shape2D{
	double volume();
}
public class Circlel2 implements Shape3D{
	double radius;
	public Circlel2(double radius){
		this.radius = radius;
	}
	public double volume() {
		return 4*PI*radius*radius*radius/3;
	}
	public double area(){
		return PI*radius*radius;
	}
}
public class InterfaceDemo2 {
	public static void main(String[] args) {
		Circlel2 c = new Circlel2(10);
		System.out.println("circle area:"+c.area());
		System.out.println("circle volume:"+c.volume());
	}
}

例子: 实现多个接口。

运行结果如下图所示:

public interface Color {
	void setColor(String str);
}
public class Circle3 implements Shape2D, Color {
	String co1;
	double radius;
	public Circle3(double radius) {
		this.radius = radius;
	}
	public static void main(String[] args) {
	}
	public String getColor(){
		return co1;
	}
	public double area() {
		return PI*radius*radius;
	}
}
public class InterfaceDemo3 {
	public static void main(String[] args) {
		Circle3 c = new Circle3(10);
		c.setColor("red");
		System.out.println("circle area:"+c.area());
		System.out.println("circle color:"+c.getColor());
	}
}

接口新特性

分类

JDK7以前:接口中只能定义抽象方法

JDK8的新特性:接口中要以定义有方法体的方法。(默认、静态)

JDK9的新特性:接口中可以定义私有方法。

原因:只要接口中增加新的抽象方法,所有的实现类必须跟着改变,否则实现类会报错。

解决方法:在接口中增加有方法体的方法,实现类中不需要进行重写实现该接口。

使用场景:接口升级

JDK8新增方法

JDK8新增的方法:静态方法,使用static修饰

public interface Inter{
	public static void show(){
		System.out.println("借口中 的静态方法");
	}
}

注意事项:

静态方法只能通过接口名调用,不能通过实现类名或对象名调用。

public可以省略,static不能省略。

静态方法不能重写,但实现类中可以写一个同名的静态方法。

JDK9新增方法

JDK9新增的方法:私有方法

普通私有方法,用于封装默认方法中的重复代码。

静态私有方法,用于封装静态方法中的重复代码。

public interface Inter{
	public default void show1(){
		System.out.println("show1方法");
		show3();
	}
	public default void show2(){
		System.out.println("show2方法");
		show3();
	}
	private void show3(){
		System.out.println("记录信息,有100行代码");
	}
	
}
public interface Inter{
	public static show1(){
		System.out.println("show1方法");
		show3();
	}
	public static show2(){
		System.out.println("show2方法");
		show3();
	}
	private static void show3(){
		System.out.println("记录信息,有100行代码");
	}
	
}

接口的特点

1.接口的特点

接口中的属性全部为公共静态常量,    方法全部是公共抽象方法。所以接口不能用new关键    
字来创建实例,即不能被实例化。接口必须被类实现:

实现全部抽象方法,实现类成为普通的类。

不实现全部抽象方法,实现类成为抽象类。

接口是多继承的,同时类可以实现多个接口。

2.接口与抽象类的比较

接口与抽象类的区别如表所示:

抽象类接口
abstract 修饰符不能省略 abstract 修饰符省略abstrsct修饰符
子类和实现类抽象类的子类继承 (extends) 抽象类,单继承接口的实现类实现 (implements) 接口,多实现
继承单继承多继承
变量和方法除抽象方法外,有成员变量,也可以有普通方法只能有抽象方法和静态常量
复用实现代码的复用不能实现代码的复用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值