接口(Interface)

接口(Interface)是抽象方法和常量值的定义的合集,可以代替抽象类。

接口中可以定义的内容:

1.成员变量必须是一个常量值(接口中没有变量值,只有常量),格式: [public] [static] [final] 数据类型long 常量名=数据值;

2.封装的方法:

JDK8之前—抽象方法

[public] [abstract] 返回值类型 方法名(参数列表);

JDK8时—抽象方法,默认方法,静态方法

[public] default 返回值函数类型 方法名(参数列表){方法体};

[public] static 返回值类型 方法名(参数列表){方法体};

注意:接口中不能定义变量,也不能定义构造方法(等价于接口不能创建对象)也不能有静态代码快

//1.接口是一个特殊的抽象类  
//2.interface 接口名 {}
//3.类实现接口用implements表示
// class 类名  implements 接口名 {}
//4.接口不能实例化   接口可以按照多态的形式来创建
//5.接口的子类  a:可以是抽象类 但是意义不大
//           b:可以是具体类,实现所有的抽象方法(推荐的方案)

//多态:
//  A:具体类多态(几乎没有)
//  B:抽象类多态(很少)
//  C:接口的多态(最常见)

//动物园  

//定义动物训练的接口
interface AnimalTrain{
	
	//抽象方法
	public abstract void jump();
	
}

//抽象类实现接口  那抽象方法可以不用重写
abstract class Dog implements AnimalTrain{
	
}

//具体类
class Cat implements AnimalTrain{

	@Override
	public void jump() {
		
		System.out.println("猫可以跳高了...");
	}
}


public class Demo01 {
	
	public static void main(String[] args) {
		
		//接口不能new
		//但是可以提供多态的方式来创建
		//向上转型
		AnimalTrain animalTrain=new Cat();
		
	}
}

接口的特点

//接口的成员特点:
//构造方法:  接口没有构造方法
//成员变量:  只能是静态的常量
//默认加上修饰符  static final
//建议:大写手写出修饰符
//成员方法: 必须是抽象方法  abstract关键字可以不写,自动生成
//接口的变量是静态常量,所以不能改变
interface Inter{
	
//	  public static final int num = 10;
//	  
//	  public static final int num2 = 20;
//	  
//	  public static final int num3 = 30;
	
	public int num=10;
	
	public final int num2=20;
	
	public static final int num3=30;
	
	
	//抽象方法 abstract关键字可以不写,自动生成
	public  void show();
	
}

 class InterImpl implements Inter{

	@Override
	public void show() {
		
	}


	
}

public class Demo02 {
	
	public static void main(String[] args) {
		
		System.out.println(Inter.num);
		
		//The final field Inter.num cannot be assigned
		//Inter.num=30;
		
		
		
		System.out.println(Inter.num2);
		System.out.println(Inter.num3);
		
	}

}

接口的关系

类与类: 继承关系 单继承,但是可以多层继承

类与接口:

实现关系: 可以单实现,也可以多实现 并且可以在继承一个类的基础上实现多个接口

接口与接口关系:
继承关系,可以单继承,也可以多继承

interface Mother{

	public void show();
	
}

interface Father{
	
	public void hello();
}


interface Daughter extends Mother,Father{
	
}

class Son extends Object implements Mother,Father{

	@Override
	public void show() {
		
	}

	@Override
	public void hello() {
		
	}
	
}

抽象类和接口的区别

抽象类:

成员变量:可以是常量,可以是变量

构造方法:有

成员方法:可以是抽象的,也可以是非抽象的

接口

成员变量:只能是静态的常量

成员方法:只能是抽象方法

类与类:继承关系 单继承,但是可以多层继承

类与接口:实现关系 可以单实现,也可以多实现

接口与接口:继承关系,可以单继承,也可以多继承

默认方法

默认default修饰,不可以省略,供子类调用或者重写

interface Person{
	
	public void hello();
	
	//默认方法
	public default void method() {
		System.out.println("method");
	}
	
}


class PersonIml implements Person{

	@Override
	public void hello() {
		System.out.println("你好");
	}


	
	
}

public class PersonDemo {

	public static void main(String[] args) {
		
		Person person=new PersonIml();
		person.hello();
		person.method();
		
	}
	
}

静态方法

interface Person{
	
	public void hello();
	
	//默认方法
	public default void method() {
		System.out.println("method");
	}
	
	//静态方法
	public static void method2() {
		System.out.println("我是接口的静态方法...");
	}
	
}


class PersonIml implements Person{

	@Override
	public void hello() {
		System.out.println("你好");
	}


	
	
}

public class PersonDemo {

	public static void main(String[] args) {
		
		Person person=new PersonIml();
		person.hello();
		person.method();
		
		//静态方法 可以通过接口直接调用
		Person.method2();
		
	}
	
}

私有方法

可以在接口中编写私有的方法,然后拿给默认方法来调用

//jdk9 私有方法
//	private void method5() {
//		System.out.println("aaaa");
//	}
//	
//	public default void method3() {
//		method5();
//	}

java接口中可以定义非常量变量吗 java定义接口类型变量_java接口中可以定义非常量变量吗