抽象类和接口

一、 抽象类

抽象类格式:(public或者default) abstract 类名

抽象类初步理解:普通类可以理解为具体类,它能被实例化。抽象类是抽象的,所以不能被实例化。

抽象类进一步理解:当多个类中出现相同功能,但是功能主体不同,这是可以向上抽取。只抽取功能定义,而不抽取功能定义,就形成了抽象类。

抽象类体现的是一种模板模式的设计,抽象类作为多个子类的通用模板,子类在抽象类的基础上进行扩展、改造,但子类总体上会大致保留抽象类的行为方式。

抽象类的特点:

1、含有抽象方法的类只能被定义为抽象类。

2、抽象方法和抽象类都必须被abstract关键字修饰,但是abstract不能修饰变量。

3、抽象类不能用new关键字来调用抽象类的构造器创建对象,即使抽象类里不包含抽象方法,这个抽象类也不能创建实例。

4、抽象类中的抽象方法要被使用,必须由子类覆盖全部抽象方法后,建立子类对象调用。如果子类只覆盖了这个抽象父类部分抽象方法,那么该子类还是一个抽象类。

5、抽象类在继承方面和一般类一样,支持单继承,多实现。例如API中:public abstract class Reader extends Object implements Readable,Closeable

抽象类的细节:

1、抽象类中有构造函数,用于子类实现后给子类对象进行初始化。

2、抽象类与一般类没有太大区别,可以用“有得有失”形容,

得:抽象类得到一个能力,可以包含只定义方法声明却没有方法体的抽象方法。

失:抽象类失去一个能力,不能创建该类的实例化对象。

3、abstract关键字不能与final,private,static关键字一起使用。原因如下:

(1) final修饰的类不能被继承,被修饰的方法不能被覆盖。

(2) private修饰的成员方法只能被本类访问,覆盖也就无从谈起。

(3) static关键字修饰的成员方法附属于类,可以用类名调用,如果再用Abstract修饰(方法没有方法体),调用起来还有什么意义。

4、抽象类中抽象方法可有可无,但是抽象方法所在的类一定是抽象类。

注意:抽象方法和空方法体的方法不是同一个概念。前者根本没有方法体,后者有方法体但方法体什么都不做。

abstract class Student
{
	abstract void study1();
	abstract void study2();
	void study3()
	{
		System.out.println("抽象类中的非抽象方法");
	}
}

abstract class BaseStudent extends Student//因为只复写了一部分抽象方法,所以还是个抽象类
{
	void study1()
	{
		System.out.println(" base study1");
	}

}

class AdvStudent extends Student//覆盖父类全部抽象方法,可以实例化对象。
{
	void study1()
	{
		System.out.println("adv study1");
	}
	void study2()
	{
		System.out.println("adv study2");
	}
	void work()
	{
		System.out.println("adv work");
	}
}

class AbstractDemo
{
	public static void main(String[] args)
	{
		AdvStudent as = new AdvStudent(); 
		as.study1();//打印adv study1
		as.study2();//打印adv study2
		
		Student s = new AdvStudent(); 
		s.study1();//打印adv study1
		s.study2();//打印adv study2
		s.study3();//打印抽象类中的非抽象方法
	}
}

由代码可见,抽象类和抽象方法的出现,不但能形成继承体系提高代码复用性,而且可以更好地发挥多态的优势,提高程序的灵活性。

二、 接口

接口格式:(public或者default) interface 接口名

接口初步理解:可以认为是一个特殊的抽象类,当抽象类中的方法都是抽象的,那么该类就可以定义为接口。

接口进一步理解:接口定义的是多个类共同的公共行为规范,这些行为是与外部交流的通道,这就意味着接口通常是定义一组公用方法。

接口的特点:

1、接口中的常量系统默认用publicstatic final三个修饰符来修饰。

2、接口中的方法系统默认用publicabstract两个修饰符来修饰。

3、接口是不可以创建对象的,接口中也没有构造函数。

4、需要被子类实现,子类对接口中的抽象方法全部覆盖后,子类才能实例化,否则子类是一个抽象类。

5、接口可以实现多个父接口,但不能显式的继承任何类,但是所有的接口的引用变量都可以直接赋给Object类型的引用变量。

interface Student
{
	int AGE = 20;//默认public static final三个修饰符
	void study();//默认public abstract两个修饰符
	void work();	
}
class StudentA implements Inter
{
	public void study()
	{
		System.out.println("study English");
	}
	public void work()
	{
		System.out.println("teach English");
	}
}
class StudentB implements Inter
{
	public void study()
	{
		System.out.println("study Chinese");
	}
	public void work()
	{
		System.out.println("teach Chinese");
	}
}

由代码可见,接口定义的是一种公共行为规范,StudentA类和StudentB类都要有学习和工作的行为。

三、 抽象类和接口的比较

抽象类和接口用法上的异同:

1、抽象类和接口都不能实例化对象。但抽象类可以有构造器和初始化块,而接口不能有。

2、抽象类的成员修饰符可以自定义;接口的成员修饰符是固定并且默认的。

3、抽象类中可以包含静态成员变量,非静态成员变量以及静态普通方法;接口只包含静态常量和抽象方法。

4、抽象类使用的是is a 关系,接口使用的是likea 关系。

5、抽象类可以继承其他类(包括抽象类和非抽象类),也可以被继承,但这种继承都是单继承;接口不能显式的继承任何类,但是可以实现多个父接口。

抽象类和接口在设计目的上的差异:

抽象类作为系统中多个子类的共同子类,它体现的是一种模板式设计。抽象类可以被当成系统实现过程中的中间产品,这个中间产品已经实现了系统的部分功能。但是这个产品依然不能当做最终产品,必须进一步完善。

接口作为系统与外界交互的窗口,接口体现的是一种规范。对于接口的实现者而言,接口规定了调用者必须向外提供哪些服务;对于接口的调用者而言,接口规定了调用者可以调用哪些服务以及如何调用这些服务。当一个程序中使用接口时,接口是多个模块间的耦合标准;当多个应用程序使用接口时,接口是多个程序之间的通信标准。

为避免误导初学者,本博客如有错误或者不严谨的地方,请在下方给予评论,以便及时修改!谢谢... ...

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值