类、对象、抽象类、接口概述

本文深入探讨Java中类与对象的概念,解释抽象类、接口及其区别,通过具体实例帮助理解面向对象编程的基本原则。

java重新学习之

什么叫类?

类是现实世界中某一类具有相同特征或行为的事物(对象),抽象出来的。
类是广泛的概念,而对象则是该类的具体实例。
例子:人是类,因为人们都具有很多相似的特征(眼,鼻子等等)或行为(吃饭、睡觉、拉粑粑)。所以人就是类。
那小明就是类的一个实例。是世界中实实在在能看得到摸得到的人,所以,小明就是对象。


什么叫对象?

对象,就是类的一个个实例。

对象的抽象化就是类,类的具体化就是对象


什么叫抽象类

抽象类就是通过修饰符abstract修饰符修饰的类。例如Shape需要定义一个测量周长的方法calPerimeter();让子类去调用并实现的时候,不同的子类(形状)对该行为(方法)的实现又各有不同。那么该父类就不想编写该方法的实现体。
于是需求就出现了
那么如何去定义这样一个类,既能定义一些方法,又不需要方法体呢?
那么抽象类就可以完成这种功能。

如下面代码,里面的方法就不需要方法体。而子类集成父类之后,也可以使用这些方法了。

public abstract ShopSellerService {

	public abstract void deleteShopSeller(ShopSeller shopSeller);

	public abstract  List findSellerListByStoreId(String storeId);

	public abstract ShopSeller findShopSellerById(String memberId);	
}

有些人会想,既然不需要实现提,那么直接在子类中定义并实现不就可以了吗?
笔者也是这样想的。
书上给了解释,如果shape的引用变量引用到了shape子类的实例。父类中没有定义这种方法,而是在子类中定义并实现。那么该引用变量去使用这个方法的时候,就需要强制类型转换,这样就降低了程序的灵活性。

抽象类使用方法:
1.抽象类和抽象方法必须要用abstract修饰,抽象方法不能有方法体。
2.抽象类无法被实例化,无法使用new关键字来调用构造器来创建抽象类的实例。即使抽象类里不包含抽象方法也不能创建实例。
3.抽象类里可以包含,方法(普通、抽象方法)、构造器、初始化块、内部类5种成分。抽象类的构造器不能用于创建对象,而是用于被子类调用的。
4.包含抽象方法的类,一定要被定义成抽象类。但是抽象类中可以没有抽象方法。

包含抽象方法的类,有以下3种情况。

  1. 直接定义一个抽象方法。
  2. 继承成一个抽象父类,但没有完全实现父类包含的抽象方法。
  3. 实现了一个接口,但没有完全实现接口包含的抽象方法。

注意:当使用static修饰一个方法时,表明这个方法属于该类本身,即通过类就可调用该方法,但如果该方法被定义成抽象方法,则将导致通过该类来调用该方法时出现错误(调用了一个没有方法体的方法肯定会引起错误)。因此static和abstract不能同时修饰某个方法,即没有所谓的类抽象方法。

什么叫接口?

接口是一种特殊的抽象类,接口中不能包含普通方法。但是Java8允许接口中定义默认方法,默认方法可以提供方法实现。
什么是默认方法?Java8改进这点优点在哪里
接口定义了一些所需要遵守的规范,接口不关心实现类的内部数据,也不关心这些类中方法的实现细节。但!一定要遵守这些规范!就是子类必须要实现接口中的方法才行!
例子:
就像学校规定了学生上学的规范:8点之前上课,必须穿校服,等等。
但是学校不关心你几分几秒到,不关心你怎么到的学校,只要8点前到就行。
学校也不会关心你校服里面穿什么,只要穿校服就行!
这就是规范,只要遵守这些规范就行。

接口与抽象类的区别

1.接口中不能有普通方法,但可以有默认方法default定义的方法,以及默认方法的实现。抽象类中可以有抽象方法,普通方法,也可以没有抽象方法。
2.定义抽象类是对普通的class添加abstract,即为抽象类。但是接口不需要class,而是需要interface
[修饰符] interface [接口名] extends 父接口1 父接口2
一个接口可以有多个父接口,但是接口只能继承接口,不能继承类。
3.接口中不能包含构造器和初始化块来定义。接口里可以包含成员变量(只能是静态常量)、方法(只能是抽象实例方法、类方法或默认方法、)、内部类(包括内部接口、枚举)定义。
今天在写项目的时候,发现接口中的方法都没有修饰符,于是很好奇
接口定义的是多个类的行为规范,因此,接口中的所有的成员(方法、常量、内部类、和内部枚举)都是public访问权限的。定义接口成员时可以省略访问控制修饰符,如果要为成员指定访问控制修饰符,也只能是用public。
而成员变量默认是public static final修饰的,在接口中都没省略了。

接口与类的区别
接口支持多继承,接口可以继承多个父接口。类不支持多继承。类只能继承一个父类。
问题:前面说过子类继承接口之后,必须要实现全部的方法才行。如果不能继承父接口的全部方法,那么这个子类就包含抽象方法。那么前面说过,包含抽象方法的类,必须是抽象类。那么疑问来了,子接口继承父接口又不能实现父接口中的方法那么继承父接口干嘛呢?

接口既然是给多个类提供行为规范的,那么父接口的规范可能不够精细。有一些类需要更加严格的规范怎么办呢?
比如学校定义了一些广泛的规范。但是每个班级又有一些特殊的要求。所以班级的要求既要遵守学校的规范,又要有自己的规范。那么子接口就出现了。

从某种程度上来看,接口类似于整个系统的“总纲”,它制定了系统各模块应该遵循的标准,因此一个系统中的接口不应该经常改变。一旦接口被改变,对整个系统甚至其他系统的影响将是辐射式的,导致系统中大部分类都需要改写。
抽象类则不一样,抽象类作为系统中多个子类的共同父类,它所体现的是一种模板式设计。抽象类作为多个子类的抽象父类,可以被当成系统实现过程中的中间产品,这个中间产品已经实现了系统的部分功能(那些已经提供实现的方法),但这个产品依然不能当成最终产品,必须有更进一步的完善,这种完善可能有几种不同方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值