面向对象(OOP)的三个特性:封装性(Encapsulation )、继承性和多态性。
面向对象(OOP)的五个原则:单一责任原则(SRP )、开放封闭原则)、rxdcdq置换原则) ) LSP )、依存倒置原则(DIP )、接口隔离原则(ISP )。
1 .面向对象的三个特性面向对象的三个特性:封装性(Encapsulation )、继承性和多态性。
1.1封装性
封装:封装对数据和数据的操作,用该对象自身的行为)方法)读取和改变对象的状态(属性)以隐藏细节。
Java中的属性封装使用private修饰符,并在private修饰符中将该属性声明为专用属性,以便只有类内部可以直接访问该属性,除非另有说明。 对于专用属性,要对一组setter (和getter )方法执行操作,必须使用setter () )和getter () )方法。 可以快速生成setter (和getter )方法ide (idea,eclipse )。
类允许您使用this关键字访问类的专用属性。 this关键字只能在类的方法主体中使用。 如果是this.id,则访问类的专用属性id。
良好的封装可以减少结合; 保证属性操作的安全性。
一些访问修饰符包括:
3358 www.Sina.com/http://www.Sina.com/http://www.Sina.com/http://www.Sina.com/privata
继承性:将许多具有共同特性的事物抽象为一个类,该类是多个类的父类。 父类的含义是,可以提取多个类的共性,复用代码,减少代码量。
示例:三个班,Pupil班(小学生)、MiddleSchoolStudent班(中学生班)、CollegeStudent班(中学生班)、大学生班)。 他们有名字、学号、班级等属性,具有必须去上课、考试等行为的特性。
我们可以把家长班写为student班(学生),在student班实现名字、学号、班等属性、课堂、考试等行为,还可以写Pupil班、MiddleSchoolStudent班、collelent班不用自己去上课的方法你本来要写三次,继承后你只需要一次实现,就实现了代码复用,减少了代码量。
Java只能单一继承。 也就是说,一个类只能有一个父类。 (a继承b后,不能继承其他类)。 允许多层继承(a继承b,b继承c ); 多个类继承一个类(b和c都继承a )。
子类继承关键字:扩展。 extendsB类,a类是b的子类,b类是a的父类。
子类可以访问父类的公共成员和受保护的成员。 在和子类中,四个访问属性的含义如下:
http://www.Sina.com/http://www.Sina.com/public开放保护只有包中的其他类、自己和子类可以访问
否则:相当于私有,无法访问
私有具有只有自己可以访问而无法访问继承的缺点。 提高类之间的耦合性。
访问修饰符
多态性:程序中定义的引用变量“指示的具体类型”和“从该引用变量发出的方法调用”在编程时不确定,而是在程序运行中才确定。 也就是说,引用变量指向哪个类的实例对象,该引用变量发出的方法调用是在哪个类中实现的方法
,必须在由程序运行期间才能决定。静态多态(编译时多态):方法的重载实现 。重载:方法名相同,方法参数个数和类型不同
动态多态(运行时多态): 子类中对父类方法的重写、接口、抽象类和抽象方法。
接下来举几个动态多态的例子。
1.3.1 子类中对父类方法的重写
父类为 Student , 子类为 pupil 。
Student.java :
package duotai;public class Student { public void play() { System.out.println("play"); }}pupil.java :
package duotai;public class Pupil extends Student{ public void play() { System.out.println("唱儿歌"); } public static void main(String args[]) { Student student = new Student(); Pupil pupil = new Pupil(); Student student1 = new Pupil(); student.play(); pupil.play(); student1.play(); }}执行 pupil.java 中的 main 方法,运行截图如下:
1.3.2 接口实现多态
List 接口的两个实现类,ArrayList,LinkedList。
public class ListStudy { public static void main(String args[]) { List<String> list = new ArrayList<>(); List<String> list1 = new LinkedList<>(); }} 2. 面向对象的五个基本原则2.1 单一职责原则(SRP)
一个类应该只有一项工作。
比如在职员类里,将工程师、销售人员、销售经理这些情况都放在职员类里考虑,其结果将会非常混乱,在这个假设下,职员类里的每个方法都要if else判断是哪种情况,从类结构上来说将会十分臃肿,并且上述三种的职员类型,不论哪一种发生需求变化,都会改变职员类!这个是大家所不愿意看到的!
2.2 开放封闭原则(OCP)
对象或实体应该对扩展开放,对修改封闭。
更改封闭即是在我们对模块进行扩展时,勿需对源有程序代码和DLL进行修改或重新编译文件!这个原则对我们在设计类的时候很有帮助,坚持这个原则就必须尽量考虑接口封装,抽象机制和多态技术!
2.3 rxdcdq替换原则(LSP)
子类可以替换父类并且出现在父类能够出现的任何地方,这个原则也是在贯彻GOF倡导的面向接口编程!
在这个原则中父类应该尽量使用抽象类和接口。
2.4 依赖倒置原则(DIP)
高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。具体实现应该依赖于抽象,而不是抽象依赖于实现。
可以这样理解,上面我举例子的时候先说了兔子和绵羊,然后才推出食草动物。但如果我们继续认识了牛、马等食草动物,我们会发现我们需要不断调整食草动物的描述,这样程序会变得僵化,所以我们不应该让子类依赖于实体,不应该让父类模块依赖于子类模块。所以我们需要将食草动物设计为抽象类,即抽象类或接口。这样下层只需要实现相应的细节而不会影响父类。
2.5 接口隔离原则(ISP)
不应强迫客户端实现一个它用不上的接口,或是说客户端不应该被迫依赖它们不使用的方法,使用多个专门的接口比使用单个接口要好的多!
比如,为了减少接口的定义,将许多类似的方法都放在一个接口中,最后会发现,维护和实现接口的时候花了太多精力,而接口所定义的操作相当于对客户端的一种承诺,这种承诺当然是越少越好,越精练越好,过多的承诺带来的就是你的大量精力和时间去维护!
参考文献: 面向对象程序设计——Java语言网课课件 - 翁恺 - 浙江大学 Java 程序开发案例课堂 - 自然的短靴、wxdxc - 清华大学出版社菜鸟教程 - Java 教程Java2 实用教程 - nxdmg、wjdqz - 清华大学出版社https://www.cnblogs.com/fzz9/p/8973315.html#%E3%80%80%E3%80%803%E5%A4%9A%E6%80%81https://www.cnblogs.com/profession/p/4862903.html