JavaRush /Java 博客 /Random-ZH /JAVA 面向对象编程概念
shabnahm
第 18 级

JAVA 面向对象编程概念

已在 Random-ZH 群组中发布
JAVA基于面向对象编程的概念,它允许您进入更高的抽象层次,以现实的方式解决任何问题。面向对象的方法根据更容易在应用程序中重用的现实世界对象来概念化问题的解决方案。例如,Chair(椅子)、Fan(风扇)、Dog(狗)、Computer(电脑)等。在 JAVA 中,类是定义给定类型的对象的一般行为的布局、模板或原型。实例是类的单独实现,类的所有实例都具有相同的属性,这些属性在类定义中进行了描述。例如,您可以定义一个名为 House 的类,并将房间数作为属性,并创建该类的实例,例如两室房屋、三室房屋等。JAVA 面向对象编程概念 - 1优点: 下面列出了面向对象软件开发的一些优点。
  • 降低了软件支持成本,主要是由于它是模块化执行的。
  • 通过继承等功能改进了代码重用,从而加快了软件开发速度。
  • 提高了代码的可靠性和灵活性。
  • 由于现实世界的模拟,易于理解。
  • 在对象级别更好的抽象。
  • 降低从一个开发阶段过渡到另一个开发阶段的复杂性。
OOP有四个主要特征:
  • 封装
  • 遗产
  • 多态性
  • 抽象

封装

封装充当对象应该隐藏什么以及应该打开什么以供其他对象访问的契约。在JAVA中,我们使用访问修饰符private来隐藏方法并限制外界对变量的访问。JAVA还有各种访问修饰符:public、default、protectedprivate,用于限制不同级别的可见性。但最终的目标是封装那些不应该改变的东西。最有效的方法是一个类应该只有一个改变的理由,而封装使“一个理由”的设计成为现实。正确的封装方法是隐藏经常变化的东西,以避免损坏其他类。 优点: 以下是封装的一些优点:
  • 我们可以通过隐藏对象的属性来保护对象的内部状态。
  • 这提高了代码的模块化,因为它可以防止对象以意外的方式进行交互。
  • 提高代码可用性。
  • 这支持特定实体的合同关系。
  • 封装使得软件更容易维护。
  • 对代码的更改可以彼此独立地进行。

多态性

编程中的多态性是指为不同的底层形式(数据类型)提供相同接口的能力。这意味着具有不同功能的类共享相同的接口,并且可以通过引用传递参数来动态调用。一个典型的例子是类Shape(shape)以及从它继承的所有类:(square正方形)、circle(圆形)、dodecahedron(十二面体)、irregular polygon(不规则多边形)、splat(斑点)等等。在此示例中,每个类都有自己的方法Draw(),客户端代码可以简单地执行以下操作:
Shape shape = new Shape();
Shape.area()获得任何形状的正确行为 多态性的美妙之处在于,使用不同类的代码不需要知道它正在使用哪个类,因为它们都按照相同的原理工作。面向对象编程语言用来实现动态多态性的过程称为动态绑定。 注意:多态性是根据对象选择更具体的方法来执行的能力。当不涉及抽象类时,就会出现多态性。 优点:
  • 创建可重用的代码。也就是说,一旦一个类被创建、实现和测试,就可以自由地使用它,而不必担心其中到底写了什么。
  • 这允许更通用和松散耦合的代码。
  • 编译时间减少,从而加快开发速度。
  • 动态链接。
  • 相同的接口可用于创建具有不同实现的方法。
  • 可以使用相同的方法签名来替换整个实现。
方法重写作为多态性的一部分。重写与两个方法交互:父类中的方法和派生类中的方法。这些方法具有相同的名称和签名。覆盖允许您对不同类型的对象以不同的方式执行相同的操作。例如:
while(it.hasNext()) {
Shape s = (Shape) it.next();
totalArea += s.area(dim); //будет применен полиморфизм и вызван нужный метод для каждого an object.
}
JAVA 面向对象编程概念 - 2方法重载或临时多态性或静态多态性 重载与同一类的多个具有相同名称但具有不同方法签名的方法交互。重新加载允许您对不同的数据以不同的方式描述相同的操作。它有时被称为静态多态,但实际上它不是多态。这只不过是两个方法具有相同的名称,但参数列表不同。重启与继承和多态无关。重载方法与重写方法完全不同。 JAVA中通过生成实现参数多态 声明 类时,名称字段可以与不同的类型关联,方法名称可以与不同的参数和返回类型关联。JAVA通过使用泛型来支持参数多态性。
List<String> list = new ArrayList<String>();
为什么我们不能重写JAVA中的静态方法? 重写取决于类实例的存在。多态性的思想是,你可以创建一个子类,那些子类实现的对象将与父类的相同方法(在子类中重写)表现不同。静态方法不与类的任何实例关联,因此不能应用重写本身的概念。JAVA 的创建者受到影响这种方法的两个考虑因素的指导。首先,存在代码执行问题:Smalltalk 因速度慢而受到很多批评(垃圾收集和多态性是这个问题的一部分),而 JAVA 的设计就是为了避免这种情况。第二个考虑因素是决定 JAVA 的目标受众是 C++ 开发人员。让静态方法以这种方式工作对于 C++ 程序员来说非常熟悉,并且还加快了速度,因为无需向上查找类层次结构来确定要调用哪个方法。您直接进入类并调用特定的方法。

遗产

继承是将基类的行为(即方法)和状态(即变量)合并到派生类中的行为,以便它们在该派生类中可用。继承的主要优点是它提供了代码重用的正式机制并避免了重复。继承类通过复制父类的行为并添加新功能来扩展应用程序的功能。这使得代码高度耦合。如果要更改超类,则必须了解子类的所有详细信息,以免破坏代码。继承是软件重用的一种形式,其中从现有类(超类)创建新类(子类),该类扩展其功能并使用超类的一些属性。因此,如果有一个父类,然后出现一个子类,则子类继承父类拥有的所有东西。 优点:
  • 改进了代码重用。
  • 逻辑关系“is a”(是某人、某物)成立。例如:一种 动物。(狗是一种动物)。
  • 代码模块化。
  • 排除重复。
缺陷:
  • 紧耦合:子类依赖于父类的实现,使得代码紧耦合。
还有什么要读的:

Java 开发者小组:

抽象

抽象意味着根据类的接口和功能来设计类,而不考虑实现细节。抽象类表示接口,但不包括实际的实现。它将对象的实现与其行为区分开来。抽象通过隐藏不重要的细节来简化代码。 优点:
  • 通过使用抽象,我们可以分离出可以分组为某种类型的内容。
  • 经常修改的属性和方法可以分组为单独的类型,因此主类型不会发生变化。这强化了 OOP 原则:“代码应该对扩展开放,但对变更关闭。 ”
  • 抽象简化了领域模型的表示。
抽象和封装之间的区别 封装是用作抽象一部分的策略。封装是指对象的结构:对象封装其属性并将其隐藏以防止外部访问。类的用户使用其方法与其交互,但无法直接访问类结构。通过这种方式,类抽象了与其设计相关的实现细节。抽象是一个更通用的术语。除此之外,它还可以通过使用子类来实现。例如,List标准库中的类(列表)是元素序列的抽象,根据元素在列表中的位置进行索引。列表的具体示例ListArrayListLinkedList。与列表交互的代码List会抽象出它所使用的列表的详细信息。如果不使用封装隐藏底层状态,通常不可能进行抽象。如果一个类暴露了它的内部结构,它就不能改变它的内部操作,因此不能被抽象。 什么是抽象类和抽象方法? 在开发过程中,您可能希望基类只为其派生类提供接口。也就是说,您不希望任何人创建基类的实例。您需要以仅将对象强制转换为该接口的方式使用该接口(这是允许多态行为的隐式强制转换)。这是通过使用关键字使此类抽象来实现的abstract。这就带来了一些限制,比如无法创建抽象类的实例;使用抽象类时,必须实现抽象方法。这确保了多态性。抽象类可以包含抽象方法和具体方法。如果一个类中至少有一个方法被声明为抽象的,则整个类也必须被声明为抽象的。然而,不必遵守相反方向的规则。如果一个类被声明为抽象的,则它不能包含抽象方法。仅定义其签名而不提供实现的方法称为抽象方法。它的实际实现留给了它的子类,这些子类扩展了抽象类。抽象方法不能被对象使用,只有另一个类可以扩展它。 什么时候应该使用抽象类? 抽象类允许您定义一些默认行为,并让子类提供任何特定行为。例如:List(list) 是一个接口,又AbstractList定义了 List 的基本行为,可以按原样使用,也可以在子类中进行细化,例如在ArrayList(list array) 中。 什么是接口? 接口的概念是一个抽象类,但接口(由关键字定义interface)更进一步。它完全阻止方法或函数的任何实现。您只能声明方法或函数,但不能提供其实现。实现接口的类必须负责实际的实现。接口非常有用,并且在 OOP 中广泛使用。由于它们共享接口本身和实现,因此它们提供了许多使用优势:
  1. 多重继承
  2. 松耦合。存在操作的抽象,例如分层,具体实现可以是任何东西:JDBC、JPA、JTA 等。
  3. 接口程序未实现
  4. 动态绑定多态性:暴露对象的编程接口,但不透露其实际实现。
  5. 抽象层次,功能分离。
接口和抽象类的区别。
  • 接口是与实现该接口的类之间的契约关系,表明实现按照接口指定的方式发生。这是一个带有声明方法的空壳。
  • 抽象类定义一些通用行为,并要求其子类为其类定义非典型或特定行为。
  • 抽象类的方法和成员可以使用任何访问修饰符来指定;反过来,所有接口方法都必须是公共的。
  • 继承抽象类时,子孙类必须定义抽象方法,而接口可以继承另一个接口,而不必定义其方法。
  • 一个后代类只能扩展一个抽象类,但一个接口可以扩展,或者一个类可以实现许多其他接口。
  • 后代类可以定义具有相同或较少限制的访问修饰符的抽象方法,但实现接口的类必须定义具有相同可见性级别的方法。
  • 接口不包含构造函数,而抽象类包含构造函数。
  • Java接口中声明的变量默认是final的。抽象类可以包含非最终变量。
  • Java 接口的所有成员都是public. 抽象类的成员可以成为等等publicprotected

作品

代码重用可以通过继承和组合来实现。但是使用组合提供了比继承更高级别的封装,因为后端类的更改不一定会影响属于前端类的代码。组合是一种在类中使用“has-a”(具有、包含)关系的设计技术。java继承和对象组合都可以用来重用代码。组合的本质是表达对象之间的“有”关系。想想一把椅子。椅子上有一个座位。椅子有靠背。一把椅子有一定数量的腿。短语“有一个”暗示椅子拥有或至少使用另一个物体的关系。这正是“has-a”关系,它是构成的基础。 优点:
  • 能见度控制
  • 可以在运行时替换实现
  • 松耦合,因为接口类不依赖于实现。
组合和继承之间的差异
不。 组成(有一个/有) 继承(是/是)
1 支持多态性和代码重用。 支持多态性和代码重用。
2 运行时对象已经创建。 该对象是在编译时动态创建的。
3 可以在运行时替换该实现。 可以在编译时更改实现。
4 子类独立于其父类,这有利于松耦合(尤其是在接口控制下)。 子类依赖于父类的实现,因此认为绑定是强的。
5 用途:房子有浴室。说房子是浴室是错误的。 继承是单向的:房子就是建筑物。但这座建筑不是一个家。
注意:不要仅仅为了确保代码重用而使用继承。如果不存在关系“is a”(is),则组合用于这些目的。 组合和聚合之间的区别在于对象关系。 聚合是一种将一个类放入集合中的关系。它是整个关系的一部分,部分可以在没有整体的情况下存在。这样的关系要弱得多。不存在循环依赖。例如:订单和产品。 组合是一种将一个类放入集合中的关系。它是整体关系的一部分,没有整体,部分就无法存在。如果整体被破坏,其所有组成部分也将被破坏。这是一种更牢固的关系。例如:多边形及其顶点、阶及其分量。
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION