首页 > 编程知识 正文

简述java面向对象特性,java面向对象的理解

时间:2023-05-04 07:28:47 阅读:50269 作者:1985

面向对象(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

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。