Java接口的基础语法(interface)(超详细!)

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

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

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

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

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

5、接口中只包含两部分内容:

  • 一部分是:常量
  • 一部分是:抽象方法

接口中没有其它内容了。只有以上两部分。

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

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

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

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

eg.

public class Test01{
	public static void main(String[] args){

		// 访问接口的常量。
		System.out.println(MyMath.PI);

		// 常量能重新赋值吗?
		//错误: 无法为最终变量PI分配值
		//MyMath.PI = 3.1415928;
	}
}

// 定义接口
interface A{

}

// 接口支持继承
interface B extends A{

}

// 一个接口可以继承多个接口(支持多继承)
interface C extends A, B{
}

// 我的数学接口
interface MyMath{

	// 常量
	//public static final double PI = 3.1415926;

	// public static final可以省略
	double PI = 3.1415926;

	// 抽象方法
	//public abstract int sum(int a, int b);

	// 接口当中都是抽象方法,那么在编写代码的时候,public abstract可以省略
	int sum(int a, int b);

	// 接口中的方法可以有方法体吗?
	// 错误: 接口抽象方法不能带有主体
	/*
	void doSome(){
	
	}
	*/
}

10、类和类之间叫做继承(extends),类和接口之间叫做实现(implements)

11、当一个非抽象的类实现接口的话,必须将接口中所有的抽象方法全部实现(覆盖、重写)(和继承抽象类一样)。

eg.

public class Test02{
	public static void main(String[] args){
		//错误: MyMath是抽象的; 无法实例化
		//new MyMath();
		
		// 父类型的引用指向子类型的对象(多态)

		MyMath mm = new MyMathImpl();
	}
}
// 特殊的抽象类,完全抽象的,叫做接口。
interface MyMath{
	double PI = 3.1415926;
	int sum(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;
	}
}

12、一个类可以同时 实现多个接口

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


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

注意:继承中,如果两个类没有关系,强转编译器会报错!


之前有一个结论:
无论向上转型还是向下转型,两种类型之间必须要有继承关系,没有继承关系编译器会报错。(这句话不适用接口方面。)


最终实际上和之前还是一样,需要加:instanceof 运算符进行判断。

向下转型养成好习惯。转型之前先if + instanceof进行判断。

eg.

public class Test03{
	public static void main(String[] args){
		// 多态该怎么用呢?
		// 都是父类型引用指向子类型对象
		A a = new D();
		//a.m2(); // 编译报错。A接口中没有m2()方法。
		B b = new D();
		C c = new D();

		// 这个编译没问题,运行也没问题。
		// 调用其他接口中的方法,你需要转型(接口转型。)
		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 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{
	// 实现A接口的m1()
	public void m1(){
		
	}
	// 实现B接口中的m2()
	public void m2(){
		System.out.println("m2 ....");
	}
	// 实现接口C中的m3()
	public void m3(){
	
	}
}

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

extends 关键字在前,implements 关键字在后

eg.

class Animal{
}

// 可飞翔的接口(是一对翅膀)
// 接口通常提取的是行为动作。
interface Flyable{
	void fly();
}

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

5.03补充:

类在强制转换过程中,如果类转换成接口类型。
那么类和接口之间不需要存在继承关系,也可以转换。
Java语法允许。

  • 53
    点赞
  • 195
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
接口是一种特殊的抽象类,它只包含常量和方法的定义,没有变量和方法的实现。在Java,使用关键字"interface"定义接口。一个类可以通过实现接口来具体实现接口定义的方法。 接口的语法格式如下: ``` interface InterfaceName { // 常量定义 // 抽象方法定义 } ``` 接口可以继承其他接口,使用关键字"extends"。一个接口可以继承多个接口,形成多继承的关系。 接口的主要作用是被实现类实现,实现类必须提供接口所有方法的具体实现内容才能实例化。接口和实现类之间存在多态性的关系。 在强制类型转换,如果类转换成接口类型,类和接口之间不需要存在继承关系,也可以进行转换。 Java接口的常量定义使用关键字"public static final",常量的值不能被重新赋值。 下面是一个示例代码,展示了接口的语法和用法: ```java // 定义一个接口 interface MyInterface { // 常量定义 public static final int CONSTANT = 100; // 抽象方法定义 public abstract void method();} // 实现接口 class MyClass implements MyInterface { // 实现接口的方法 public void method() { // 方法的具体实现 System.out.println("Method implementation"); } } // 测试类 public class Test { public static void main(String[] args) { // 创建实现类的实例 MyClass myObj = new MyClass(); // 调用实现类的方法 myObj.method(); // 访问接口的常量 System.out.println(MyInterface.CONSTANT); } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值