JavaSE学习笔记(5.抽象类与接口)

抽象类:

1.抽象类:

通过abstract修饰符描述的类,称之为抽象类;抽象类的成员为:方法(可以为普通方法,也可以是抽象方法)、成员变量、构造器、初始化块、内部类;抽象类不能实例化,只能当做父类被其子类继承

2.抽象方法:

  • 通过abstract修饰符描述的方法,称之为抽象方法;抽象方法不能有方法体存在,且抽象方法必须在抽象类中存在
  • 存在抽象方法(也包括继承自父抽象类或者接口的没有重写或实现的抽象方法)的类,一定为抽象类,一定不能实例化;但抽象类中不一定存在抽象方法!

3.抽象类的作用:

  • 抽象类主要是为了程序更好的实现多态设计的,abstract修饰的类只能继承,abstract修饰的方法只能被重写
  • 抽象类实现模板模式,通过抽象类提供多个子类的通用方法,再将子类存在区别的方法描述为抽象方法,留给子类来设计,这种设计模式为模板模式!

接口:

1.接口的基本概念:

  • 接口是通过interface关键字定义的特殊类
  • 由于接口不能实例化,所以接口中只能包含抽象方法、类方法(java8)、默认方法(java8)、静态常量(final修饰)、内部类(内部接口、内部枚举),不存在初始化块和构造器!
  • 接口可以继承多个父接口,但不能继承自类!!!
  • 接口中的所有成员变量和方法都是public访问属性、可以省略访问修饰符,java会默认补充public访问属性!
  • 接口中的成员变量必须为静态常量使用static final修饰,定义时同样可以省略,java会默认补充static final修饰,同时也会补充public修饰符!
  • 接口中抽象方法定义时可以省略abstract修饰符,java都会默认补充abstract修饰符,同时也会补充public修饰符!
  • 接口中的抽象方法不能存在方法体,但是类方法和默认方法是必须存在方法体的!
  • 接口中的内部类(包括内部接口、内部枚举),都必须是static属性,定义时可以省略,java会默认补充static属性,同时也会补充public修饰符!

2.默认方法:

Java8版本在接口中支持了默认方法和类方法:

接口中定义的默认方法,必须使用default修饰,该方法不能同时被static修饰,而且系统会默认补充public修饰符。由于不使用static修饰,该方法不能直接使用接口调用,所以默认方法只能在接口实现类的实现方法中被调用,作为多个实现类中的公共方法使用!

接口中定义的类方法,必须使用static修饰,该方法不能同时被default修饰,而且系统会默认补充public修饰符。类方法可以直接使用接口来调用!

接口定义的例子:

public interface ITestInterface {
	/*接口中的静态常量*/
	int a = 12;
	public static final int b = 12;
	
	/*接口中的抽象方法*/
	void funa();
	public abstract void funb();

	/*接口中的默认方法*/
	public default void func()
	{
		System.out.println("done func()");
	}
	
	/*接口中的类方法*/
	public static void fune()
	{
		System.out.println("done fune()");
	}
}

2.接口的使用:

  • 接口实现类可以实现多个接口的同时,继承一个父类
  • 接口实现类必须要实现,所有父接口的抽象方法,否则就要将类定义为抽象类
  • 接口本身可以使用extends关键字继承多个父接口,不可以使用implements关键字来继承父接口
  • 实现接口的时候,必须要注意继承自接口的方法都要定义为public访问属性,因为接口中的方法访问属性都是public属性,子类中重写父类方法时,子类访问属性不能小于父类方法的访问属性!

接口继承:

[修饰符] interface 接口 extends 接口1,接口2...
{
	
}

接口实现:

[修饰符] class 类名 extends 父类 implements 接口1,接口2...
{
	
}

3.接口与抽象类:

接口与抽象类并没有什么直接联系,仅仅因为有些相似才拿来进行比较增加记忆,以便找到更恰当的使用场景!

相似点:

  • 两者都不能进行实例化
  • 两者都包括抽象方法

不同点:

  • 接口的设计更侧重,软件设计中降低代码的耦合度和提高代码的扩展性
  • 抽象类的设计更侧重,使用模板模式进行软件开发
  • 接口与抽象类中包含的成员范围有所不同,抽象类中可以包含所有类型的成员;但是接口中不能包含初始化块、构造器和内部类(非内部接口)
  • 接口可以继承多个父接口,抽象类只能继承自一个父类
  • 接口和抽象类的关键字语法使用也不同

Ps后记:

  • 实现类或者子类中继承父类或者实现接口的方法都要加上@override注解
  • 实现类中除了必须要实现接口中定义的方法外,可以随便定义方法和成员变量
  • 接口可以继承接口(使用extends关键字),但不能实现接口(使用implements关键字),同时接口也不能继承抽象类;但抽象类可以实现接口,也可以继承抽象类!
  • 接口和抽象类中都可以存在抽象方法,而且不区分抽象方法的来源(是本类还是继承自父类的);既接口可以在父接口中继续继承抽象方法;抽象类可以在父抽象类中继承抽象方法(使用extends),也可以在实现接口中获取抽象方法(使用implements),不强制必须实现继承的抽象方法!所以抽象类往往也可以给接口做一层缺省方法实现层!

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值