面向对象
什么是面向对象(OOP:Object Oriented Programing 面向对象的编程)
- 对象:一切事物皆对象,将现实中的事物抽象出来,把现实生活的事物以及关系,抽象成类,通过继承,实现, 组合的方式把事物融合起来,实现了对现实世界的抽象和数字建模
- 面向对象 和 面向过程:吃蛋糕的例子
-
- 面向对象:去蛋糕店,买一个蛋糕
-
- 面向过程:自己去买材料:面包,鸡蛋,牛奶,烤箱,自己烤
-
- 面向对象降低了耦合,提高了维护性
- 面向过程是具体化,流程化,解决问题需要一步一步的分析,一步一步的实现
- 面向对象是模型化,只需要抽象出一个类,封装一些功能,需要什么功能直接使用,面向对象底层其实还是面向过程,把面向过程抽象成类,然后封装。
- 面向过程
-
- 优点:性能比面向对象好,因为类调用时需要实例化,开销大,比较消耗资源
-
- 缺点:不易维护、不易复用,扩展
- 面向对象
-
- 优点:易维护,易复用
-
- 缺点:性能比面向过程差
面向对象的三大特性:
-
- 封装:隐藏对象的属性和实现细节,仅对外提供公共访问方式,将变化隔离,便于使用,提高复用性和安全性。
-
- 继承:提高代码的复用性;继承是多态的前提
-
- 多态:父类或接口定义的引用变量可以指向子类或具体实现类的实例对象。提高了程序的扩展性
五大原则
- 单一职责原则SRP:类的功能要单一,不能包罗万象,跟杂货店一样
- 开放封闭原则OCP:一个模块对于扩展是开放的,对于修改是封闭的,想要增加功能热列欢迎,想要修改可不行
- 里氏替换原则LSP:子类可以替换父类出现在父类能够出现的任何地方
- 依赖倒置原则DIP:高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。抽象不应该依赖于具体实现,具体实现应该依赖于抽象。
- 接口分离原则:设计时采用多个与特定客户类有关的接口比采用一个通用的接口要好。
总结
-
抽象会使复杂的问题更加简单化
-
从以前面向过程的执行者,变成了动动嘴的指挥者
-
面向对象更符合人类的思维,面向过程则是机器的思想
-
https://www.jianshu.com/u/a00b505c83fb
封装、继承、多态
什么是多态
-
- 父类引用指向子类对象;同一操作作用于不同的对象,可以产生不同的效果
-
- 封装:是把过程和数据包围起来,对于数据的访问只能通过已定义的界面,他把实现的细节隐藏起来了
-
- 继承可以扩展已存在的代码模块,而目的就是为了代码重用
多态的好处
- 应用程序不必为每一个派生类编写功能调用,只需要对抽象基类进行处理即可,大大提高程序的可复用性-- 继承
- 派生类的功能可以被基类的方法或者引用变量调用,这叫向后兼容,可以提高可扩充性和可维护性。–多态的真正作用
多态在什么地方用
- 可以用在方法的参数中和方法的返回类型中
- https://www.jianshu.com/p/68ddb5484ca2
方法重写,重载
Java的继承与实现
- 继承:如果多个类的某个部分的功能相同,那么可以抽象出一个类出来,把他们相同部分都放到父类里,让他们都继承这个类
- 实现:如果多个类处理的目标都是一样的,但是处理的方法方式不同,那么就定义一个接口,也就是一个标准,让他们实现这个接口,各自实现自己具体的处理方法来处理那个目标
联系
- 继承和接口都能实现代码的复用,提高开发效率,提高事物的传递性,继承关系达到复用的目的
区别
- 修饰不同:实现:implements, 继承:extends
- 数量不同:单继承,多实现
- 属性不同:在接口中只能定义全局常量和无实现的方法
- 调用不同:某个接口被类实现时,在类中一定要实现接口中的抽象方法
构造函数与默认构造函数
- 构造函数:是创建对象时候给对分配完内存,调用的方法,主要用来初始化数据,子类的构造函数规定必须调用父类构造来初始化数据,而且调用父类构造方法必须在第一行
- 默认构造函数:Java中如果在一个类中没有写明任何构造函数,那么系统会自动编译一个无参的构造函数,但如果声明了一个有参的构造函数,编译器就不会往里面插入无参的构造函数了
类变量、成员变量和局部变量
- 成员变量定义在类中,在整个类中都可以被访问
- 成员变量随着对象的建立而建立,随着对象的消失而消失,存在于对象所在的堆内存中
- 成员变量有默认初始化值
- 局部变量只定义在局部范围内,如函数内,语句内,只在所属的区域内有效
- 局部变量存在于栈内存中,作用的范围结束,变量空间会自动释放
- 局部变量没有默认初始化值
- 类变量(静态变量):对象的共享数据
- 成员变量和类变量的区别
-
- 两个变量的声明周期不同
-
- 调用方式不同
-
- 别名不同
-
- 数据存储位置不同
- 静态随着类的加载而加载,而且优先于对象存在
- https://www.cnblogs.com/cy19/p/7587002.html
平台无关性
- 什么是平台无关性
-
- 平台无关性就是一种语言在计算机上运行不受平台的约束,一次编译,到处运行(Write once, run anywhere)
- 平台无关性好处:Java程序可以运行在各种各样的设备上,减少了开发和部署到多个平台的成本和时间
- 平台无关性的实现
-
- 对于Java的平台关性的支持,其中扮演重要角色的就是:Java语言规范、Class文件,Java虚拟机
-
- Java文件编译成二进制文件,需要经历两步编译:前端编译和后端编译
-
- Java虚拟机: Java之所以能够做到跨平台,是因为Java虚拟机充当了桥梁,他扮演了运行时Java程序与其下的硬件和操作系统之间的缓冲
-
- Class文件(字节码):各种不同的平台的虚拟机都使用统一的程序存储格式–字节码是构成平台无关性的另一个基石,Java虚拟机只与由字节码组成的Class文件进行交互
-
- Java语言规范:Java中的基本数据类型的值域和行为都是由其自定义的
- Java的平台无关性是建立在Java虚拟机的平台有关性上面,向外扩展一下,Java还具有语言无关性
- https://www.cnblogs.com/helloworld2048/p/10916296.html
- JVM还支持的语言:Kotlin,Groovy, JRuby, Jython, Scala
值传递
-
- 值传递和引用传递区别:区别是传递的内容,如果传递的是值,就是值传递,如果传递的是引用,就是引用传递
-
- 传递参数如果是普通的数据类型,就是值传递。如果是对象,就是引用数据类型
- 实参:在调用方法时,传入的参数
- 形参:函数声明时定义的参数
- Java中的值传递
-
- 在调用函数时,将实际参数赋值一份传递到函数中,这样在函数中如果对参数进行操作,将不会影响到实际参数
-
- 引用传递:将实际参数的参数地址直接传到函数
Java中只有值传递
- 值传递:会创建副本,函数中无法改变原始对象
- 引用传递:不创建副本,函数中可以直接改变原始对象
- https://blog.csdn.net/bjweimengshu/article/details/79799485