一起学Java(四十六)----- 接口

不积跬步,无以至千里;不积小流,无以成江海。

Java语言基础

Java的接口

接口是抽象方法的集合,通常以 interface 来声明。一个类通过继承接口的方式,来继承接口的抽象方法。

定义一个接口:

interface A{
	public static final String NAME = "tutu"; // 全局常量
	public abstract void print(); // 抽象方法	
}
  • 接口的使用

1、由于接口里面存在抽象方法,所以接口对象不能直接使用关键字new进行实例化;

2、接口必须要有子类,但此时一个子类可以使用implements关键字实现多个接口;

3、接口的子类(如果不是抽象类),那么必须要覆写接口中的全部抽象方法;

4、接口的对象可以利用子类对象的向上转型进行实例化。

示例:

interface A{
	public static final String NAME = "tutu"; // 全局常量
	public abstract void print(); // 抽象方法	
}
interface B{
	public abstract void get();
}
class X implements A,B{

	@Override
	public void get() {
		// TODO Auto-generated method stub
		System.out.println("接口B中的抽象方法get()");
	}

	@Override
	public void print() {
		// TODO Auto-generated method stub
		System.out.println("接口A中的抽象方法print()");
	}
	
}
public class TestDemo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		X x = new X();
		A a = x;
		B b = x;
		a.print();
		b.get();
	}
}

程序输出:

接口A中的抽象方法print()
接口B中的抽象方法get()

由于X类是A和B的子类,那么X类的对象可以变为A接口或者B接口对象。

注意:

public class TestDemo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		A a = new X();
		B b = (B) a;
		b.get();
		
		System.out.println(a instanceof A);
		System.out.println(a instanceof B);
	}
}

 程序输出:

接口B中的抽象方法get()
true
true

 从定义结构来讲,A和B两个接口没有任何直接联系,但这两个接口却拥有同一个子类。我们不要被类型和名称所迷惑,因为实例化的是X子类,而这个类对象属于B类的对象,所以以上代码可行,只不过从代码的编写规范来讲,并不是很好。

  • 子类除了实现接口还可以继承抽象类

语法格式:

class 子类 [extends 父类] [implemetns 接口1,接口2,...] {}

 示例:

interface A{
	public static final String NAME = "tutu"; // 全局常量
	public abstract void print(); // 抽象方法	
}
interface B{
	public abstract void get();
}
abstract class C{
	public abstract void change();
}
class X extends C implements A,B{

	@Override
	public void get() {
		// TODO Auto-generated method stub
		System.out.println("接口B中的抽象方法get()");
	}

	@Override
	public void print() {
		// TODO Auto-generated method stub
		System.out.println("接口A中的抽象方法print()");
	}

	@Override
	public void change() {
		// TODO Auto-generated method stub
		System.out.println("抽象类C中的抽象方法change()");
	}
	
}

 对于接口,里面的组成只有抽象方法和全局常量,为了书写简单,可以不用写public abstract 或者public static final;

并且,接口中的访问权限只有一种:public,即:定义接口方法和全局常量的时候就算没有写上public,那么最终的访问权限也是public,注意不是default。

以下两种写法是完全等价的:

interface A{
	public static final String NAME = "tutu"; // 全局常量
	public abstract void print(); // 抽象方法	
}

 以及:

interface A{
	String NAME = "tutu"; // 全局常量
	void print(); // 抽象方法	
}

注意:

一个抽象类只能继承一个抽象类,但一个接口却可以使用extends关键字同时继承多个接口(但接口不能继承抽象类)。

示例:

interface A{
	public static final String NAME = "tutu"; // 全局常量
	public abstract void print(); // 抽象方法	
}
interface B{
	public abstract void get();
}
interface C extends A,B{
	public abstract void change();
}
class X implements C{

	@Override
	public void get() {
		// TODO Auto-generated method stub
		System.out.println("接口B中的抽象方法get()");
	}

	@Override
	public void print() {
		// TODO Auto-generated method stub
		System.out.println("接口A中的抽象方法print()");
	}

	@Override
	public void change() {
		// TODO Auto-generated method stub
		System.out.println("接口C中的抽象方法change()");
	}
	
}

博客借鉴:https://blog.csdn.net/wei_zhi/article/details/52738471

猜你喜欢

转载自www.cnblogs.com/smilexuezi/p/12938482.html