Java基础-接口和抽象类

接口

接口是一种能力

  • 体现在方法上,接口中拥有的方法就可以说拥有某种能力

接口是一种约定

  • 体现在接口的名称和注释上:有些接口只有名称;方法的实现方式要通过注释来约定
  • 面向接口编程:程序设计时面向接口的约定不考虑方法具体实现
为什么需要接口?
  • 接口就是比抽象类还抽象的抽象类,可以更加规范对子类实现的约束,全面的专业的实现了:规范和具体实现的分离
  • 接口就是规范,定义了一组规则,体现了现实世界中如是你是…则必须能的思想。例如如果你是天使,你就必须会飞。
  • 接口的本质是契约,就是我们人间的法律一样,制定了就要去遵守
  • 项目的具体需求是多变的,我们只能以不变应万变,这里的不变就是规范,因此我们开发往往是面向接口编程。
接口相关规则
  • 接口的方法都是抽象
  • 即使没有显式的将接口中的成员用public标示,也是public访问类型
  • 接口中的变量默认是public static final标识,所以接口中定义的变量都是全局静态常量
  • 可以定义一个新接口,用extends继承另一个已存在的接口
  • 可以定义一个类,用implements去实现接口中的所有方法
  • 可以定义一个抽象类,用implements去实现接口中的部分方法
  • 如何定义接口?
    格式:
    [访问修饰符] interface 接口名 [extends 父接口1,父接口2…]
    常量定义:public static final 数据类型 常量名
    方法定义:public abstract 返回值类型 方法名
    1.8以后方法定义可以有:
    default 返回值类型 方法名(参数列表){方法体}
    public static 返回值类型 方法名(参数列表){方法体}
  • 如何实现接口
    子类通过implements实现接口中的规范
    接口不能够实例化,但是可用于声明引用变量类型
    一个类实现了接口,必须实现接口中所有方法,并且这些方法都是public
    Java是单继承,但是接口可以多继承

抽象类

抽象类概念
  • Java中的对象是对现实世界的具象化,但是在现实世界中,某些类并不具备实例化的意义,因此可以定义为抽象类
抽象类的使用说明
  • 创建抽象类需要关键字abstract
  • 抽象类可以定义属性和构造函数
  • 不能进行实例化,不可以new对象
  • 抽象类中的某些方法需要子类进行更丰富的实现,父类实现没有意义,此时可以将抽象类中的方法定义为抽象方法,没有具体的实现,只包含方法名称,参数列表,返回值类型,访问修饰符
  • 使用abstract关键字修饰的方法是抽象方法,可以不写方法的实现
  • 子类在继承抽象类的时候需要关键字extends,必须要实现抽象父类中的抽象方法,如果将子类定义为抽象类,可以不实现抽象父类中的抽象方法
  • 有抽象方法的一定是抽象类,但是抽象类不一定有抽象方法
接口和抽象类的区别?
  • 抽象类中的方法可以有普通方法和抽象方法,而接口中只能有抽象方法,但是在jdk1.8中,接口也可以有静态方法和default修饰的方法,但是必须要有方法体
  • 抽象类需要使用extends关键字来修饰,而接口是使用interface关键字来修饰
  • 子类使用extends来继承抽象类,使用implements实现接口
  • 子类继承抽象类的时候必须实现全部抽象方法,可以不实现普通方法,而接口中的方法必须全部实现(不包括静态方法和default方法)
  • 抽象类中可以定义成员变量,接口中只能定义全局静态常量
  • 抽象类在子类继承的时候是单继承,接口支持多继承(子类可实现多个接口)
  • 抽象类和接口都不能够实例化,但是抽象类可以定义构造方法,而接口是不可以的。
  • 抽象类可以实现接口,并且可以不实现接口中的方法,而接口只能继承接口,不可以实现接口
  • 注:在实际的项目开发中,如果可以用接口尽量使用接口,将单继承的父类留在最关键的地方。
实例
  • 定义接口A
//接口中被允许定义构造方法,因为接口本身不能够创建对象,属性只能是常量,所以定义构造方法没有意义
public interface A{
	void test01(); //默认就是public stract viod
	public static void staticMethod(){//静态方法必须有方法体
		System.out.println("我是静态方法");
	}
	default void defaultMethod(){//默认方法必须有方法体
		System.out.println("我是默认方法")
	}
}
  • 定义接口B
public interface B{
	void test02(); //默认就是public stract viod
}
  • 定义接口A的实现子类
public class ASon implements A{
	@Override
	public void test01(){
		System.out.println("我是test01"); //子类是普通类必须要实现接口中的抽象方法,其他类型的放啊可以不用实现
	}
}
  • 定义接口A,B的实现子类
//java中的多继承,子类可以实现多个接口的实现类,接口里面的抽象方法必须实现
public class ABSon implements A,B{
	@Override
	public void test01(){
		System.out.println("我是test01"); //子类是普通类必须要实现接口中的抽象方法,其他类型的放啊可以不用实现
	}
	@Override
	public void test02(){
		System.out.println("我是test02"); //子类是普通类必须要实现接口中的抽象方法,其他类型的放啊可以不用实现
	}
}
  • 定义抽象子类的接口
//抽象子类在实现接口的时候可以不实现接口中的抽象方法
public abstract class AbstractSon implements A{

}
  • 接口与接口的关系
//接口只能继承接口不能用implements关键字
public interface A extends B{

}
  • 抽象类
public abstract class AbstractClass{
	private String filed1 = "filed";
	public AbstactClass(String filed1){ //定义构造函数意义就是子类可以获取到父类的属性值
		this.filed1 = filed1
	}
	public abstract void test01();
	public void test02(){
		System.out.println("我是测试方法02");
	}
}
  • 抽象类的普通子类
//普通子类继承抽象父类必须要重写抽象父类的抽象方法,普通方法可以不重写
public class extends AbstractClass{
	@Ovrride
	public void test01(){
		System.out.println("我是测试方法01");
	}	
}
  • 抽象类的抽象子类
//抽象子类继承抽象父类可以不重写抽象父类的抽象方法
public abstract class extends AbstractClass{

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值