一 抽象类 (我只提供方法,如果你要实现这个方法,自己写方法体,去实现自己的功能)
1 定义:含一个抽象方法的类就是抽象类
2 注意事项
- 有抽象方法的类必然是抽象类
- 抽象类不可以被实例化,不能被new来实例化抽象类
- 抽象类可以包含属性,方法,构造方法,但是构造方法不能用来new实例,只能被子类调用
- 抽象类只能用来继承
- 抽象类的抽象方法必须被子类继承
3 存在的意义:就是抽象类可以将设计和实现分离,
举个简单的例子:我们有一个动物的类,里面有一个Run的方法,这个时候我们需要继承他,一只狗说我会跑,老虎说我也会跑,孔雀说我也会跑,这个时候每一个子类都要继承他,而且由于Run方法已经被父类实现了,所以每一个都要重写方法体,是不是很麻烦,这个时候JDK就说了,既然那么多类需要继承他,我直接不实现这个方法,你们谁用谁实现算了。这个就是抽象类存在的意义
说的比较官方一些的话,你写你的抽象类,我写我的实现方法。这也是为什么说抽象方法必须被继承才有意义!
public abstract class Action { //用在方法上 抽象方法,只有方法名字,没有方法的实现 //约束 有人帮我们实现 //特点 不能new这个抽象类,只能靠子类去实现它 public abstract void dosomething(); public void hello() { //在抽象类里面可以写普通的方法 但抽象方法必须存在于抽象类中 } }
二 接口
接口可以理解为一种特殊的类,里面全部是由全局常量和公共的抽象方法组成
接口中所有方法都是抽象方法;
接口当中所有的方法都是public类型
接口的格式
interface
interfaceName{
全局常量
抽象方法
}
package demo10; //实现了接口中的类 就需要重写接口中的方法 //利用接口实现多继承 public class UserServiceImpl implements UserService,TimeService { @Override public void add(String name) { } @Override public void delete(String name) { } @Override public void update(String name) { } @Override public void query(String name) { } @Override public void timer() { } } package demo10; //接口 public interface UserService { //接口 他必须要有实现类 //接口中的所有定义都是抽象的而且都是public abstract void add(String name); void delete(String name); void update(String name); void query(String name); // 定义常量 public static final int age = 99; //写的时候直接写返回值类型和名字 参数 } //这个接口中的的实现的方法为增删改查 public interface TimeService { void timer();
接口存在的意义
接口存在的意义就为了更好的将设计与实是现分离。
设计师写完需要的接口,别的不用管了,怎么实现是下面的事情了,这样不仅仅可以提高开发效率,也可以更好的维护。
三接口和抽象类的区别
1.语法层面上的区别
- 抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法;
- 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;
- 接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;
- 一个类只能继承一个抽象类,而一个类却可以实现多个接口。
2.设计层面上的区别
抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。举个简单的例子,飞机和鸟是不同类的事物,但是它们都有一个共性,就是都会飞。那么在设计的时候,可以将飞机设计为一个类Airplane,将鸟设计为一个类Bird,但是不能将 飞行 这个特性也设计为类,因此它只是一个行为特性,并不是对一类事物的抽象描述。此时可以将 飞行 设计为一个接口Fly,包含方法fly( ),然后Airplane和Bird分别根据自己的需要实现Fly这个接口。然后至于有不同种类的飞机,比如战斗机、民用飞机等直接继承Airplane即可,对于鸟也是类似的,不同种类的鸟直接继承Bird类即可。从这里可以看出,继承是一个 "是不是"的关系,而 接口 实现则是 "有没有"的关系。如果一个类继承了某个抽象类,则子类必定是抽象类的种类,而接口实现则是有没有、具备不具备的关系,比如鸟是否能飞(或者是否具备飞行这个特点),能飞行则可以实现这个接口,不能飞行就不实现这个接口
3 表格
参数 | 抽象类 | 接口 |
默认的方法实现 | 它可以有默认的方法实现 | 接口完全是抽象的。它根本不存在方法的实现 |
实现 | 子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现。 | 子类使用关键字implements来实现接口。它需要提供接口中所有声明的方法的实现 |
构造器 | 抽象类可以有构造器 | 接口不能有构造器 |
与正常Java类的区别 | 除了你不能实例化抽象类之外,它和普通Java类没有任何区别 | 接口是完全不同的类型 |
访问修饰符 | 抽象方法可以有public、protected和default这些修饰符 | 接口方法默认修饰符是public。你不可以使用其它修饰符。 |
main方法 | 抽象方法可以有main方法并且我们可以运行它 | 接口没有main方法,因此我们不能运行它。 |
多继承 | 抽象方法可以继承一个类和实现多个接口 | 接口只可以继承一个或多个其它接口 |
速度 | 它比接口速度要快 | 接口是稍微有点慢的,因为它需要时间去寻找在类中实现的方法。 |
添加新方法 | 如果你往抽象类中添加新的方法,你可以给它提供默认的实现。因此你不需要改变你现在的代码。 | 如果你往接口中添加方法,那么你必须改变实现该接口的类。 |
标签:实现,接口,抽象,抽象类,方法,public 来源: https://www.cnblogs.com/lp19990215/p/14291380.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。