在Java中,面向对象最简单的理解就是通过创建对象去调用对应的方法,比如:
Student s=new Student();
s.name="kobe";
System.out.println(s.name);
s.study();
但其实还有很多内容,Java有很多机制来维护面向对象特性,最基本的就是封装、多态和继承。下面来记录下它们的一些细节和注意事项。
继承
继承可以把多个类中相同成员提取到一个公共的类中,通过继承的实现方式来让子类和父类产生关系,继而让子类们具备父类的内容,最大的好处就是可以提高代码的复用性,降低修改代码的成本。
继承注意事项:
- 子类只能继承父类的非私有成员(成员变量和成员方法)。
- 子类不能继承父类的构造方法,但可以通过super去访问父类的构造方法,子类所有的构造方法默认都会访问父类的空参构造方法,如果父类没有空参构造方法,子类可通过super(参数1,参数2,…)去调用父类的带参构造方法,语句需要放在子类构造方法的第一句。
- 被final修饰的类不能被继承。
封装
通过隐藏程序实现的细节,只提供对外访问的方法,就是封装。
封装是需要通过权限修饰符来实现的。Java权限修饰符提供的访问权限:
权限修饰符 本类 同一个包下(子类和无关类) 不同包下(子类) 不同包下(无关类)
private √
无 √ √
protected √ √ √
public √ √ √ √
通过private修饰类、方法、成员变量可隐藏对象实现的细节,只提供一个路径给对外访问,可降低偶合,提供代码安全性。
多态
同一个对象在不同时刻体现出来的不同状态就是多态。通过继承和接口实现,如下Person是Student和Teatcher的父类:
Person p=new Student();//此时p是学生
Person p=new Teatcher();//此时p是老师
多态的前提:
- 要有继承关系。
- 要有方法重写。
- 要有父类引用指向子类对象。
多态中成员访问特点:
- 成员变量,编译时期看父类,运行时期看父类。
- 成员方法,编译时期看父类,运行时期看子类,父类方法被子类方法重写。
- 静态属性,编译时期看父类,运行时期看父类,静态是和类相关的。
- 构造方法,创建子类对象的时候,会访问父类的构造方法,对父类数据进行初始化。
- 多态不能使用子类的特有功能。
多态的应用除了有继承非抽象类,还有抽象类的继承和接口的实现,Java的抽象类和接口都可以只声明方法体,而把具体实现留给实现类。
总结,Java就是通过这些特性实现的面向对象:
- 高内聚,低耦合,通过封装权限修饰,每个类、接口可以只负责一件事,对外提供一种功能。
- 当类写好后,拒绝再修改代码,需要扩展新需求时,可借助抽象和多态,把可能变化的内容抽象出来,通过继承或者接口实现来补充想要的功能。
- 编写代码可依赖于抽象,不依赖于具体实现,针对抽象或者接口编程,而不针对实现编程。