Java基础-对接口的理解

接口

定义:接口从语法角度来说像是一种特殊的抽象类,两者都可以包含抽象方法且不能创建对象。接口是一种标准,通常用来约束其子类(实现类)应具备的功能

作用:降低程序间耦合,更自然的使用多态;在设计环节中使用接口定义标准,使开发更加灵活

1、接口的语法

​ 1.1 接口语法和规定

  • 语法:interface 接口名{}
    • interface MyInterface{}
  • 接口里面只允许有公开静态的常量和公开抽象的方法(jdk1.8以前)
  • 接口里面所有不加访问修饰符的代表是公共的
  • 普通的类,只能继承一个类;但是可以实现多个接口
  • 实现多个接口,这个类必须重写所有接口里面的所有抽象方法
interface MyInterface{    
    //公开静态的常量
    String NAME2 = "jack"; //默认在编译的时候,会添加上 public static final
    public static final String NAME1 = "xqc";//推荐这么写
    
    //公开抽象的方法
    void test1();//默认会添加 public abstract void test1();
    public abstract void test2();//推荐这么写
}

​ 1.2 jdk1.8接口可以存在静态方法默认方法;

Java 8 允许给接口添加一个非抽象的方法实现,只需要使用 default 关键字即可,这个特征又叫做扩展方法(也称为默认方法或虚拟扩展方法或防护方法)。在实现该接口时,该默认扩展方法在子类上可以直接使用,它的使用方式类似于抽象类中非抽象成员方法。

扩展方法不能够重写(也称复写或覆盖) Object 中的方法,却可以重载Object 中的方法。
如:toString、equals、 hashCode 不能在接口中被覆盖,却可以被重载。

默认方法允许我们在接口里添加新的方法,而不会破坏实现这个接口的已有类的兼容性,也就是说不会强迫实现接口的类实现默认方法。

默认方法和抽象方法的区别是抽象方法必须要被实现,默认方法不是。作为替代方式,接口可以提供一个默认的方法实现,所有这个接口的实现类都会通过继承得到这个方法(如果有需要也可以重写这个方法)


静态方法,通过static关键字修饰的方法;和普通类的静态方法调用方式一致

2、接口的规范

  • 我们重写一个方法,修饰符一定是比重写之前的访问级别要高或者说一样
class A{
    public void test(){ // default        
    }
}

class B extends A{
    public void test(){ //重写的时候, public protected default  private(错误的)        
    }
}

实现接口的方法,修饰符一定是public;[接口里面所有的抽象方法,默认都是public修饰符]

3、常见的关系

类/接口

​ 3.1 类与类之间的关系;

​ 可以是继承关系, extends来描述继承关系; 单继承

​ 3.2 类与接口之间的关系;

​ 是一个实现的关系; implements 某个类实现了多个接口; 多实现

​ 语法: A implements IB1,IB2,IB3…{}

​ 3.3 接口与接口之间的关系;

​ 接口继承接口; extends关键字来描述;

​ IA extends IB1,IB2,IB3…{}

​ 接口与接口之间继承的是什么东西 : 会将我们所有的属性,抽象方法全部通通继承过来.

代码:接口的多态、继承、引用、实现等

package com.qianfeng.xqc.day0226;
public interface IA {
	public void a();

	// jdk8可以允许有默认方法的存在,默认方法可以有方法主体;
	// 理解为就是类里面的普通方法;
	default void test2() {

		System.out.println("接口里面的默认方法");

	}

	// jdk1.8 接口可以有静态方法; 全局唯一;使用方式: 接口名.方法名
	public static void test() {
		System.out.println("接口里面的静态方法");
	}
}


package com.qianfeng.xqc.day0226;
public interface IB {
	public void b();
}


package com.qianfeng.xqc.day0226;
public interface IC extends IA,IB {//接口继承接口
	public void c();
}


package com.qianfeng.xqc.day0226;
public abstract class AD {
	public abstract void d();
}


package com.qianfeng.xqc.day0226;
public class Impl1 extends AD implements IC {//继承抽象类AD,实现接口IC(IC继承接口IA和IB)

	public void a() {System.out.println("IA接口");}//IA接口的方法,IC从IA继承过来的

	public void b() {System.out.println("IB接口");}//IB接口的方法,IC从IB继承过来的

	public void c() {System.out.println("IC接口");}//IC接口的方法

	public void d() {System.out.println("AD抽象类");}//AD抽象类的方法
	
}


package com.qianfeng.xqc.day0226;
public class Impl2 extends AD implements IA,IB {

	public void a() {System.out.println("IA接口");}//IA接口的方法

	public void b() {System.out.println("IB接口");}//IB接口的方法

	public void d() {System.out.println("AD抽象类");}//AD抽象类的方法
	
}


package com.qianfeng.xqc.day0226;
public abstract class AImpl extends AD implements IA {
	//不实现抽象类和接口的方法,就将自己变成抽象类
}


package com.qianfeng.xqc.day0226;
public class Test {
//	接口的定义,接口的多态,单继承与多实现,接口与接口的继承
	public static void main(String[] args) {

		//多态	//Impl2继承抽象类AD,实现接口IA和IB
		Impl2 impl = new Impl2();//继承抽象类AD,实现接口IA和IB
		impl.a();
		impl.b();
		impl.d();
		
		AD ad = impl;//只能实现抽象类AD的方法
		ad.d();
		
		IA ia = impl;//只能实现接口IA的方法
		ia.a();
		
		//调用接口里面的静态方法
		IA.test();
		
		//调用接口里面的默认方法
		//接口里面的默认方法如何去访问 匿名内部类
		new IA() {
			public void a() {};
		}.test2();
		
	}

}

                                         千锋杭州逆战201
                                            2020.02.26
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值