Java基础接口

导读:本篇文章讲解 Java基础接口,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

接口:

1、接口也是一种“引用数据类型”。编译之后也是一个class字节码文件。

2、接口是完全抽象的。(抽象类是半抽象。)或者也可以说接口是特殊的抽象类。

3、接口怎么定义,语法是什么?

  • [修饰符列表] interface 接口名{}

4、接口支持多继承,一个接口可以继承多个接口。

5、接口中只支持两部分内容,一部分是:常量。一部分是:抽象方法。接口中没有其它内容。

6、接口中所有的元素都是public修饰的。(都是公开的)。

7、接口中的抽象方法定义时:public abstract修饰符可以省略。

8、接口中的方法都是抽象方法,所以接口中的方法不能有方法体。

9、接口中的常量的public static final 可以省略

总结一句话:三个字“解耦”
面向接口编程,可以降低程序的耦合度,提高程序的扩展力。符合OCP开发原则。
接口的使用离不开多态机制。(接口+多态才可以达到降低耦合度。)

接口可以解耦合,解开的是谁和谁的耦合!!!
任何一个接口都有调用者和实现者
接口可以将调用者和实现者解耦合
调用者面向接口调用
实现者面向接口编写实现

示例代码:

public class InterfaceTest01{
	public static void main(String[] args){
		
		//输出常量
		System.out.println(MyMath.PI);
		
		//编译报错,无法为最终变量PI分配值
		//MyMath.PI = 15.2;
		System.out.println(MyMath.k);
		// MyMath.k = 111;
	}
}

//接口A
interface A{
	
}
//接口可以单继承
interface B extends A{
	
}
//接口可以多继承
interface c extends B,A{
	
}
//我的数学接口
interface MyMath{
	
	//常量
	public static final double PI = 3.1415926;
	
	//public static final 可以省略吗?[可以]
	//double PI = 3.1415926;//编译通过
	
	//k是不是常量???是
	//接口中随便写一个变量就是常量
	//常量:值不能发生改变的常量
	int k = 80;
	
	//抽象方法
	public abstract int sumInt(int a,int b);
	
	//public abstract 可以省略并且接口中的方法不能带有主体
    int sum(int x,int b);
}

接口的基础语法:
1、类和类之间叫做继承,类和接口之间叫做实现。
别多想:你仍然可以将”实现”看做“继承”。
继承使用extends关键字完成。
实现使用implements关键字完成。

2、五颗星:当一个非抽象的类实现接口的话,必须将接口中所有的
抽象方法全部实现(覆盖、重写)

示例代码:

public class InterfaceTest02{
	
	public static void main(String[] args){
		
		//接口可以使用多态
		//父类型的引用指向子类型的对象
		MyMath mm = new MyMathImpl();
		//调用接口里面的方法(面向接口编程)
		int result1 = mm.sum(10,20);
		System.out.println(result1);
		
		int result2 = mm.sub(20,10);
		System.out.println(result2);
	}
}
	
//特殊的抽象类,完全抽象的,叫做接口
interface MyMath{
	double PI = 3.1415926;
	int sum(int a,int b);
	int sub(int a,int b);
}

// 这样没问题
/*
abstract class MyMathImpl implements MyMath {
}
*/

//编写一个类(这个类是一个“非抽象”的类)
//此类名字随意
//错误:MYMathImpl不是抽象的,并且未覆盖MyMath中的抽象方法sub(int,int)
//class MyMathImpl implements MyMath{}

class MyMathImpl implements MyMath{
	
	//错误:正在尝试分配更低的访问权限; 以前访问权限为public【访问权限控制符】
	/*
	int sum(int a, int b){
		return a + b;
	}
	*/
	
	// 重写/覆盖/实现 接口中的方法(通常叫做实现。)
	public int sum(int a,int b){
		return a + b;
	}
	
	public int sub(int a,int b){
		return a - b;
	}
}

接口和接口之间支持多继承,那么一个类可以同时实现多个接口吗?

  • 对于计算机来说,一个机箱上有多个接口,一个接口是接键盘的,一个接口是接鼠标的,一个接口是接电源的,一个接口是接显示器的…

重点(五颗星):一个类可以同时实现多个接口。

这种机制弥补了java中的哪个缺陷?

  • java中类和类只支持单继承。实际上单继承是为了简单而出现的,现实世界中存在多继承,java中的接口弥补了单继承带来的缺陷。

  • 接口A和接口B虽然没有继承关系,但是写代码的时候,可以互转。编译器没意见。但是运行时可能出现:ClassCastException

之前有一个结论:

  • 无论向上转型还是向下转型,两种类型之间必须要有继承关系,没有继承关系编译器会报错。(这句话不适用在接口方面。)最终实际上和之前还是一样,需要加:instanceof运算符进行判断。向下转型养成好习惯。转型之前先if+instanceof进行判断。

示例代码:

public class InterfaceTest03{
	
	public static void main(String[] args){
		
	   // 多态该怎么用呢?
	   // 都是父类型引用指向子类型对象
	   A a = new D();
	   B b = new D();
	   C c = new D();
	   
	   
	   //a.m2(); // 编译报错。A接口中没有m2()方法。
	   
	   // 这个编译没问题,运行也没问题。
	   // 调用其他接口中的方法,你需要转型(接口转型。)
	   B b2 = (B)a;
	   b2.m2();
	   
	   // 直接向下转型为D可以吗?可以
		D d = (D)a;
		d.m2();

	   
       m m = new e();
	   
	   // 经过测试:接口和接口之间在进行强制类型转换的时候,没有继承关系,也可以强转。
	   // 但是一定要注意,运行时可能会出现ClassCastException异常。
	   // 编译没问题,运行有问题。
	   //k k = (k)m;
       if(m instanceof k){
		   k k = (k)m;
	   }	   
	}
}

interface X{
	
}

interface Y{
	
}

interface Z extends X,Y{ //接口和接口支持多继承。
}

interface k{
	
}

interface m{
	
}

class e implements m{
	
}

interface A{
	void m1();
}

interface B{
	void m2();
}

interface C{
	void m3();
}

// 实现多个接口,其实就类似于多继承。
class D implements A,B,C{

    public void m1(){
		
	}

    public void m2(){
		System.out.println("m .....");
	} 
	
	public void m3(){
		
	}	
}

继承和实现都存在的话,代码应该怎么写?

  • extends 关键字在前。implements 关键字在后。

示例代码:

public class InterfaceTest04{
	
	public static void main(String[] args){
		// 创建对象(表面看Animal类没起作用!)
		Flyable f = new Cat();//多态。
		f.fly();
		
		// 同一个接口
		Flyable f2 = new Fish();
		// 调用同一个fly()方法,最后的执行效果不同。
		f2.fly();
	}
}

// 动物类:父类
class Animal{
	
}

// 可飞翔的接口(是一对翅膀)
// 能插拔的就是接口。(没有接口你怎么插拔。)
// 内存条插到主板上,他们之间有接口。内存条可以更换。
// 接口通常提取的是行为动作。
interface Flyable{
	void fly();
}

// 动物类子类:猫类
// Flyable是一个接口,是一对翅膀的接口,通过接口插到猫身上,让猫变的可以飞翔。
class Cat extends Animal implements Flyable{
	
	public void fly(){
		System.out.println("我是一只猫,我在太空翱翔,我喜欢飞!");
	}
}

// 蛇类,如果你不想让它飞,可以不实现Flyable接口
// 没有实现这个接口表示你没有翅膀,没有给你插翅膀,你肯定不能飞。
class snake extends Animal{
	
}

// 想飞就插翅膀这个接口。
// 鱼(默认实际上是存在继承的,默认继承Object。)
/*
class Fish extends Object implements Flyable{
}
*/
class Fish implements Flyable{//没写extends,也是有的,默认继承Object。
	public void fly(){
		System.out.println("我是一只鱼,我学会了飞!(六眼飞鱼!)");
	}
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/94319.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!