什么是对象

对象是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位。一个对象由一组属性和对这组属性进行操作的一组服务组成。

类的实例化可生成对象,一个对象的生命周期包括三个阶段:生成、使用、消除。

当不存在对一个对象的引用时,该对象成为一个无用对象。Java的垃圾收集器自动扫描对象的动态内存区,把没有引用的对象作为垃圾收集起来并释放。当系统内存用尽或调用System.gc()要求垃圾回收时,垃圾回收程与系统同步运行。

面向对象的特征

封装,继承和多态。

  • 封装:面向对象最基础的一个特性,封装性,是指隐藏对象的属性和现实细节,仅对外提供公共访问方式。

封装的原则:将不需要对外提供的内容都隐藏(设置访问修饰符为“private”)起来。把属性都隐藏,仅提供公共方法对其访问,可以在访问方式中加入逻辑判断等语句。

  • 继承:继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类、基类);得到继承信息的类被称为子类(派生类)。
  • 多态:多态性是指允许不同子类型的对象对同一消息作出不同的响应。简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情。

多态性分为编译时的多态性和运行时的多态性。
运行时的多态是面向对象最精髓的东西,要实现多态需要做两件事:
1). 方法重写(子类继承父类并重写父类中已有的或抽象的方法)
2). 对象造型(用父类型引用引用子类型对象,这样同样的引用调用同样的方法就会根据子类对象的不同而表现出不同的行为)。

什么是类

类是具有相同属性和方法的一组对象的集合,它为属于该类的所有对象提供了统一的抽象描述,其内部包括属性和方法两个主要部分。在面向对象的编程语言中,类是一个独立的程序单位,它应该有一个类名并包括属性和方法两个主要部分。

Java中的类实现包括两个部分:类声明和类体。

多态的好处

多态的定义:指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。

主要有以下优点:

  • 可替换性:多态对已存在代码具有可替换性.
  • 可扩充性:增加新的子类不影响已经存在的类结构.
  • 接口性:多态是超类通过方法签名,向子类提供一个公共接口,由子类来完善或者重写它来实现的.
  • 灵活性:它在应用中体现了灵活多样的操作,提高了使用效率
  • 简化性:多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要

代码中如何实现多态

实现多态主要有以下三种方式:

  • 接口实现
  • 继承父类重写方法
  • 同一类中进行方法重载

虚拟机是如何实现多态的

动态绑定技术(dynamic binding),执行期间判断所引用对象的实际类型,根据实际类型调用对应的方法.

重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分?

方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。

  • 重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;
  • 重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。重载对返回类型没有特殊的要求。

构造器不能被继承,因此不能被重写,但可以被重载。

父类的静态方法不能被子类重写。重写只适用于实例方法,不能用于静态方法,而子类当中含有和父类相同签名的静态方法,我们一般称之为隐藏,调用的方法为定义的类所有的静态方法。

构造器(constructor)是否可被重写(override)?

构造器不能被继承,因此不能被重写,但可以被重载。

接口的意义

接口的意义用四个词就可以概括:规范,扩展,回调和安全。

抽象类的意义

抽象类的意义可以用三句话来概括:

  • 为其他子类提供一个公共的类型
  • 封装子类中重复定义的内容
  • 定义抽象方法,子类虽然有不同的实现,但是定义是一致的

抽象类和接口有什么区别

抽象类和接口都不能够实例化,但可以定义抽象类和接口类型的引用。一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法全部进行实现,否则该类仍然需要被声明为抽象类。接口比抽象类更加抽象,因为抽象类中可以定义构造器,可以有抽象方法和具体方法,而接口中不能定义构造器而且其中的方法全部都是抽象方法。抽象类中的成员可以是private、默认、protected、public的,而接口中的成员全都是public的。抽象类中可以定义成员变量,而接口中定义的成员变量实际上都是常量。有抽象方法的类必须被声明为抽象类,而抽象类未必要有抽象方法。

访问修饰符public,private,protected,以及不写(默认)时的区别

修饰符当前类同包子类其他包public√√√√protected√√√×default√√××private√×××

类的成员不写访问修饰时默认为default。默认对于同一个包中的其他类相当于公开(public),对于不是同一个包中的其他类相当于私有(private)。受保护(protected)对子类相当于公开,对不是同一包中的没有父子关系的类相当于私有。Java中,外部类的修饰符只能是public或默认,类的成员(包括内部类)的修饰符可以是以上四种。

简述一下面向对象的”六原则一法则”。

  • 单一职责原则:一个类只做它该做的事情。

单一职责原则想表达的就是”高内聚”,写代码最终极的原则只有六个字”高内聚、低耦合”。所谓的高内聚就是一个代码模块只完成一项功能,在面向对象中,如果只让一个类完成它该做的事,而不涉及与它无关的领域就是践行了高内聚的原则,这个类就只有单一职责。我们都知道一句话叫”因为专注,所以专业”,一个对象如果承担太多的职责,那么注定它什么都做不好。一个好的软件系统,它里面的每个功能模块也应该是可以轻易的拿到其他系统中使用的,这样才能实现软件复用的目标。

  • 开闭原则:软件实体应当对扩展开放,对修改关闭。

在理想的状态下,当我们需要为一个软件系统增加新功能时,只需要从原来的系统派生出一些新类就可以,不需要修改原来的任何一行代码。要做到开闭有两个要点:

1)抽象是关键,一个系统中如果没有抽象类或接口系统就没有扩展点;

2)封装可变性,将系统中的各种可变因素封装到一个继承结构中,如果多个可变因素混杂在一起,系统将变得复杂而换乱,如果不清楚如何封装可变性,可以参考《设计模式精解》一书中对桥梁模式的讲解的章节。

  • 依赖倒转原则:面向接口编程。

该原则说得直白和具体一些就是声明方法的参数类型、方法的返回类型、变量的引用类型时,尽可能使用抽象类型而不用具体类型,因为抽象类型可以被它的任何一个子类型所替代,请参考下面的里氏替换原则。

  • 里氏替换原则:任何时候都可以用子类型替换掉父类型。

关于里氏替换原则的描述,Barbara Liskov女士的描述比这个要复杂得多,但简单的说就是能用父类型的地方就一定能使用子类型。里氏替换原则可以检查继承关系是否合理,如果一个继承关系违背了里氏替换原则,那么这个继承关系一定是错误的,需要对代码进行重构。例如让猫继承狗,或者狗继承猫,又或者让正方形继承长方形都是错误的继承关系,因为你很容易找到违反里氏替换原则的场景。需要注意的是:子类一定是增加父类的能力而不是减少父类的能力,因为子类比父类的能力更多,把能力多的对象当成能力少的对象来用当然没有任何问题。

  • 接口隔离原则:接口要小而专,绝不能大而全。

臃肿的接口是对接口的污染,既然接口表示能力,那么一个接口只应该描述一种能力,接口也应该是高度内聚的。例如,琴棋书画就应该分别设计为四个接口,而不应设计成一个接口中的四个方法,因为如果设计成一个接口中的四个方法,那么这个接口很难用,毕竟琴棋书画四样都精通的人还是少数,而如果设计成四个接口,会几项就实现几个接口,这样的话每个接口被复用的可能性是很高的。Java中的接口代表能力、代表约定、代表角色,能否正确的使用接口一定是编程水平高低的重要标识。

  • 合成聚合复用原则:优先使用聚合或合成关系复用代码。

通过继承来复用代码是面向对象程序设计中被滥用得最多的东西,因为所有的教科书都无一例外的对继承进行了鼓吹从而误导了初学者,类与类之间简单的说有三种关系,Is-A关系、Has-A关系、Use-A关系,分别代表继承、关联和依赖。

其中,关联关系根据其关联的强度又可以进一步划分为关联、聚合和合成,但说白了都是Has-A关系,合成聚合复用原则想表达的是优先考虑Has-A关系而不是Is-A关系复用代码,原因嘛可以自己从百度上找到一万个理由,需要说明的是,即使在Java的API中也有不少滥用继承的例子,例如Properties类继承了Hashtable类,Stack类继承了Vector类,这些继承明显就是错误的,更好的做法是在Properties类中放置一个Hashtable类型的成员并且将其键和值都设置为字符串来存储数据,而Stack类的设计也应该是在Stack类中放一个Vector对象来存储数据。记住:任何时候都不要继承工具类,工具是可以拥有并可以使用的,而不是拿来继承的。

  • 迪米特法则:迪米特法则又叫最少知识原则,一个对象应当对其他对象有尽可能少的了解。

迪米特法则简单的说就是如何做到”低耦合”,门面模式和调停者模式就是对迪米特法则的践行。对于门面模式可以举一个简单的例子,你去一家公司洽谈业务,你不需要了解这个公司内部是如何运作的,你甚至可以对这个公司一无所知,去的时候只需要找到公司入口处的前台美女,告诉她们你要做什么,她们会找到合适的人跟你接洽,前台的美女就是公司这个系统的门面。

再复杂的系统都可以为用户提供一个简单的门面,Java Web开发中作为前端控制器的Servlet或Filter不就是一个门面吗,浏览器对服务器的运作方式一无所知,但是通过前端控制器就能够根据你的请求得到相应的服务。

调停者模式也可以举一个简单的例子来说明,例如一台计算机,CPU、内存、硬盘、显卡、声卡各种设备需要相互配合才能很好的工作,但是如果这些东西都直接连接到一起,计算机的布线将异常复杂,在这种情况下,主板作为一个调停者的身份出现,它将各个设备连接在一起而不需要每个设备之间直接交换数据,这样就减小了系统的耦合度和复杂度。

本人免费整理了Java高级资料,涵盖了Java、Redis、MongoDB、MySQL、Zookeeper、Spring Cloud、Dubbo高并发分布式等教程,一共30G,需要自己领取。
传送门:https://mp.weixin.qq.com/s/JzddfH-7yNudmkjT0IRL8Q

Java内功心法,深入解析面向对象相关推荐

  1. Java 面试知识点解析(一)——基础知识篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

  2. Java进阶学习-7 面向对象程序设计原则

    title: Java进阶学习-7 面向对象程序设计原则 date: 2020-02-02 18:02:27 tags: 以一个城堡游戏为例子谈面向对象程序设计原则 Game.java package ...

  3. Java Object 类方法解析

    本文标题大纲: 文章目录 前言 getClass hashCode equals clone 深拷贝和浅拷贝 toString wait / notify / notifyAll finalize 前 ...

  4. Java 面试全解析:核心知识点与典型面试题

    课程背景 又逢"金九银十",年轻的毕业生们满怀希望与忐忑,去寻找.竞争一个工作机会.已经在职的开发同学,也想通过社会招聘或者内推的时机争取到更好的待遇.更大的平台. 然而,面试人群 ...

  5. Java编程题_面向对象和常用API01_B级

    Java编程题_面向对象和常用API01_B级 第1题 面向对象.异常.集合.IO 题干: 请编写程序,完成键盘录入学生信息,并计算总分将学生信息与总分一同写入文本文件 需求:键盘录入3个学生信息(姓 ...

  6. java 是一种面向对象的编程语言吗_Java是一种面向对象的编程语言。

    Java是一种面向对象的编程语言. A:对 B:错 正确答案:对 解析: Java是一种面向对象的编程语言. A:对 B:错 相关问题: 稀缺资源的有效配置要求生产的产品越多越好.() A:错 B:对 ...

  7. Java爬取解析去哪儿景点信息

    前言:这两周在做 Web 课的大作业,顺便琢磨了一下如何使用 Java 从网上获取一些数据,现在写这篇博客记录一下. PS:这里仅限交流学习用,如利用代码进行恶意攻击他网站,和作者无关!!! Java ...

  8. java构造和解析json_Java构造和解析Json数据的两种方法详解一

    在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面首先介绍用json-lib构造和解析Jso ...

  9. java中http解析url,java url 编码(解析http请求汉语言地址 )

    java url 编码(解析http请求中文地址 ) 在近在做项目的过程中,由于客户那边服务器上提供的有很多中文结构目录.请求要的地址不能正常运行显示出来.下面来分享一下我对http协议处理请求中文的 ...

  10. Java构造和解析Json数据的两种方法详解一

    在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面首先介绍用json-lib构造和解析Jso ...

最新文章

  1. Sublime Text 常用插件和快捷键
  2. day3 java的运算符及其注意问题
  3. mysql char 二进制_SQL:char 和 varchar、binary 和 varbinary、二进制字符串、严格模式、汉字编码方式...
  4. 中继联通chinaunicom热点。求路由推荐。-无线路由器-中国无线论坛 -
  5. 树莓派安装DLNA实现流媒体服务器
  6. 【第七课】Smart 3D集群教程
  7. Android音视频编辑器架构图与分析
  8. 基于FPGA(cyclone IV)的NOR FLASH的应用
  9. FTPS服务器搭建流程
  10. ads1115应用电路及驱动程序
  11. 【023】水仙花数算法
  12. 智能快递柜的电气特性
  13. 【分享帖】国内主流网络信息采集和页面数据抓取工具盘点
  14. java.io.IOException: Cleartext HTTP traffic to xxx.xxx.xxx.xxx not permitted
  15. AD绘制PCB经验总结3-规则报警 Silk primitive without silk layer+Minimum Solder Mask Sliver
  16. 【题解】展翅翱翔之时 (はばたきのとき)
  17. 【运维面试】面试官: 你每天在公司都做啥?
  18. 按照日期:蓝桥杯真题、洛谷题单、力扣题单汇总
  19. 非素数模下的二次剩余
  20. 微信小程序几个空判断整理

热门文章

  1. 超甜来袭!治愈系数字藏品限时免费,速抢!
  2. windows 下 IOCP模型(完成端口)
  3. 2018年,14个网页设计师必备技能助你拿高薪!
  4. 用python函数画德国国旗代码_求一段python中用class方法绘制国旗的代码!记得不是常见的海龟做法!这个星期给我再加送财富点!...
  5. java批量上传图片案例
  6. CSM5150SG是国内第一颗做ESOP8封装大电流的40V耐压LDO
  7. FS5080E ESOP8 原厂1A电流5V升压双节锂电池开关充电IC
  8. 我的计算机学习过程与.net学习过程(一):大学之前
  9. NAS DAS SAN三种存储方式的比较
  10. 极光推送使用 IOS端