首页 > 其他分享 >20230418 0. 面向对象基础

20230418 0. 面向对象基础

时间:2023-06-19 09:45:07浏览次数:28  
标签:20230418 继承 子类 基础 接口 面向对象 抽象类 父类 方法

面向对象的三大特性:封装、继承、多态

面向对象的好处:可维护、可扩展、可复用、灵活性好

封装

每个对象都包含它能进行操作所需要的所有信息,这个特性称为封装,因此对象不必依赖其他对象来完成自己的操作。

封装有很多好处:

  • 第一,良好的封装能够减少耦合
  • 第二,类内部的实现可以自由地修改
  • 第三,类具有清晰的对外接口

继承

只有合理的应用继承才能发挥好的作用

对象的继承代表了一种'is-a'的关系,如果两个对象A和B,可以描述为'B是A',则表明B可以继承A。

继承者还可以理解为是对被继承者的 特殊化 ,因为它除了具备被继承者的特性外,还具备自己独有的个性。

继承定义了类如何相互关联,共享特性。继承的工作方式是,定义父类和子类,或叫作基类和派生类,其中子类继承父类的所有特性。子类不但继承了父类的所有特性,还可以定义新的特性。

学习继承最好是记住三句话,如果子类继承于父类,

  • 第一,子类拥有父类 非private 的属性和功能;
  • 第二,子类具有自己的属性和功能,即子类可以扩展父类没有的属性和功能;
  • 第三,子类还可以以自己的方式实现父类的功能(方法重写)。

protected 表示继承时子类可以对基类有完全访问权

在Java中,子类从它的父类中继承的成员有方法、属性等,但对于构造方法,有一些特殊,它不能被继承,只能被调用。

继承是有缺点的,那就是父类变,则子类不得不变

继承会破坏包装,父类实现细节暴露给子类,继承显然是一种类与类之间强耦合的关系

多态

多态表示不同的对象可以执行相同的动作,但要通过它们自己的实现代码来执行

  • 第一,子类以父类的身份出现
  • 第二,子类在工作时以自己的方式来实现
  • 第三,子类以父类的身份出现时,子类特有的属性和方法不可以使用

子类可以选择使用override关键字,将父类实现替换为它自己的实现,这就是方法重写Override,或者叫作方法覆写

多态的原理是当方法被调用时,无论对象是否被转换为其父类,都只有位于对象继承链最末端的方法实现会被调用。也就是说,虚方法是按照其运行时类型而非编译时类型进行动态绑定调用的。

要深刻理解并会合理利用多态,不去研究设计模式是很难做到的。也可以反过来说,没有学过设计模式,那么对多态乃至对面向对象的理解多半都是肤浅和片面的。

抽象类

Java允许把类和方法声明为abstract,即抽象类和抽象方法。

  • 第一,抽象类不能实例化
  • 第二,抽象方法是必须被子类重写的方法
  • 第三,如果类中包含抽象方法,那么类就必须定义为抽象类,不论是否还包含其他一般方法

应该考虑让抽象类拥有尽可能多的共同代码,拥有尽可能少的数据

抽象类通常代表一个抽象概念,它提供一个继承的出发点,当设计一个新的抽象类时,一定是用来继承的,所以,在一个以继承关系形成的等级结构里面,树叶节点应当是具体类,而树枝节点均应当是抽象类

接口

接口是把隐式公共方法和属性组合起来,以封装特定功能的一个集合。一旦类实现了接口,类就可以支持接口所指定的所有属性和成员。声明接口在语法上与声明抽象类完全相同,但不允许提供接口中任何成员的执行方式。

实现接口的类就必须要实现接口中的所有方法和属性。

一个类可以支持多个接口,多个类也可以支持相同的接口

接口的命名,有些语言前面要加一个大写字母'I',这是一种规范。

抽象类和接口的区别:

  • 第一,类是对对象的抽象,抽象类是对类的抽象,接口是对类行为的抽象。
    • 接口是对类的局部(行为)进行的抽象,而抽象类是对类整体(字段、属性、方法)的抽象。如果只关注行为抽象,那么也可以认为接口就是抽象类。总之,不论是接口、抽象类、类甚至对象,都是在不同层次、不同角度进行抽象的结果,它们的共性就是抽象。
  • 第二,如果行为跨越不同类的对象,可使用接口;对于一些相似的类对象,用继承抽象类。
  • 第三,从设计角度讲,抽象类是从子类中发现了公共的东西,泛化出父类,然后子类继承父类,而接口是根本不知子类的存在,方法如何实现还不确认,预先定义

实现接口和继承抽象类并不冲突

抽象类是自底而上抽象出来的,而接口则是自顶向下设计出来的

  • 事实上,只有小猫的时候,你就去设计一个动物类,这就极有可能会成为过度设计了。所以说,抽象类往往都是通过重构得来的
  • 而接口就完全不是一回事。我们很早已经设计好了电源插座的接口,但在几十年前是无法想象未来会有什么样的电器需要电源插座的

集合

数组的优点,比如说数组在内存中连续存储,因此可以快速而容易地从头到尾遍历元素,可以快速修改元素等。缺点嘛,应该是创建时必须要指定数组变量的大小,还有在两个元素之间添加元素也比较困难

Java提供了用于数据存储和检索的专用类,这些类统称集合。这些类提供对堆栈、队列、列表和哈希表的支持。大多数集合类实现相同的接口。

泛型

泛型是具有占位符(类型参数)的类、结构、接口和方法,这些占位符是类、结构、接口和方法所存储或使用的一个或多个类型的占位符。泛型集合类可以将类型参数用作它所存储的对象的类型的占位符;类型参数作为其字段的类型和其方法的参数类型出现。

通常情况下,都建议使用泛型集合,因为这样可以获得类型安全的直接优点而不需要从基集合类型派生并实现类型特定的成员。此外,如果集合元素为值类型,泛型集合类型的性能通常优于对应的非泛型集合类型(并优于从非泛型基集合类型派生的类型),因为使用泛型时不必对元素进行装箱。"

标签:20230418,继承,子类,基础,接口,面向对象,抽象类,父类,方法
From: https://www.cnblogs.com/huangwenjie/p/17490329.html

相关文章

  • 20230418 0.1. UML
    UML这一节非常帮!!!1.11UML类图几种关系以及代码示例继承classBirdextendsAnimal{}实现classWideGooseimplementsIFly{}关联Association企鹅需要'知道'气候的变化,需要'了解'气候规律。当一个类'知道'另一个类时,可以用关联(association)。classPenguinex......
  • 【技术积累】自然语言处理中的基础知识【一】
    什么是自然语言处理(NLP)自然语言处理(NaturalLanguageProcessing,NLP)是计算机科学和人工智能领域中的一个重要分支。它研究如何让计算机去理解、处理和生成自然语言,使计算机能够像人一样读、写、听和说自然语言。NLP主要涉及文本处理、语音识别、文本生成等技术。它主要通过利......
  • redis基础笔记
    redis1、redis的基本使用学习网址http://redisdoc.com/说明:redis安装好后,有16个数据库,初始默认使用0号库,编号是0...151、添加key-val[set]2、查看当i去哪redis的所有key[keys*]获取key对应的值[getkey]切换redis数据库[seletionindex]如何查看当前数据库的key-va......
  • Java基础
    数据类型INFINITY和NaN//INFINITY定义publicstaticfinaldoublePOSITIVE_INFINITY=1.0/0.0;publicstaticfinaldoubleNEGATIVE_INFINITY=-1.0/0.0;publicstaticfinalfloatPOSITIVE_INFINITY=1.0f/0.0f;publicstaticfinalfloatNEGATIVE_INFINITY......
  • C++基础知识总结
    2023/6/18本篇章记录学习过程C++的基础概念和代码测试实现,还有很多需要补充。一是还不清楚,二是还没有学到。打算学习过程中后面再做补充。先看完《C++primer》书之后再慢慢来添加补充1.函数重载一个函数名可以实现多个功能,这取决于函数参数不同来实现判断对应的功能,与返回......
  • Java Websocket 01: 原生模式 Websocket 基础通信
    目录JavaWebsocket01:原生模式Websocket基础通信JavaWebsocket02:原生模式通过Websocket传输文件Websocket原生模式原生模式下服务端通过@ServerEndpoint实现其对应的@OnOpen,@OnClose,@OnMessage,@OnError方法客户端创建WebSocketClient实现对应的......
  • 必知必会:Java基础
    创建对象有几种方式(1)new创建对象;(2)反射创建对象;(3)采用clone机制;(4)序列化机制。创建反射对象的几种方式(1)类.class:通过 类名.class 创建反射获取对象; 类.class 是静态加载,是JVM编译时就要加载。Class<ClassDemo>oClass=ClassDemo.class;(2) object.getClass() :以 实......
  • NOI / 1.9编程基础之顺序 09:直方图
    描述给定一个非负整数数组,统计里面每一个数的出现次数。我们只统计到数组里最大的数。假设Fmax(Fmax<10000)是数组里最大的数,那么我们只统计{0,1,2.....Fmax}里每个数出现的次数。输入第一行n是数组的大小。1<=n<=10000。紧接着一行是数组的n个元素。输出按顺序输......
  • 8086汇编语言基础学习(二)—— 汇编指令和伪指令
    8086汇编语言基础学习(二)——汇编指令和伪指令数据传输指令:1.MOV指令描述:赋值指令格式:MOV DST,SRT功能:双操作数,将SRT赋值给DST注意:DST,SRT不能同时为mem,对于所有的双操作数皆是如此。不允许对CS赋值其中一个是段寄存器时,另一个就必须是数据寄存器将立即数送入mem时......
  • Java面向对象编程的三大特性:封装、继承、多态。
    一、封装封装的核心在于私有化(private),大部分情况下,来封装对象的属性,很少有封装方法的。通过将对象的属性封装,提供对外的公共方法来访问属性是最常见的方式。publicstaticclassFengZhuang{//通过封装,设置私有属性privateStringname;privat......