面向对象:
面向对象是向现实世界模型的自然延伸,是一种万物皆对象的编程思想,在现实生活中的任何物体都可以归为一类事物,而每一个个体都是一类事物的实例,类似于生物分类学一般,分为域、界、门、纲、科、属、种一般,面向对象就是把现实中的事物抽象为一类事物。
以事物为中心,先开发类,得到对象,通过对象之间相互通信实现功能
现有数据结构,后有算法
面向过程:
思想:由过程、步骤、函数组成,以过程为核心,现有算法,后有数据结构
面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了,面向对象是把构成问题事物分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描述某个事物在整个解决问题的步骤中的行为
面向对象的耦合度低,易维护,易复用,易扩展,是系统灵活,但类调用需要实例化,开销比较大,比较消耗资源。
面向过程的耦合度高,可维护性差,性能高
面向对象的三大特征:封装,继承,多态
封装:是将一类事物的属性和行为封装成一个类,一般是使其属性私有化,行为公开化,提高数据的隐秘性的同时,使代码模块化
原则:将不需要对外提供的内容隐藏起来,把属性都隐藏,提供公共方法对其访问
类的修饰符:private、default(默认)、protected、public
Private:类中限制为private的成员,只能被这个类本身访问,如果一个类的构造方法声明成private,则其他类不能生成该类的一个实例。
Default:类不加任何访问权限限定的成员属于缺省的(default)访问状态,可以被这个类本身和同一个包中的类锁访问。
Protected:类中限定为protected的成员,可以被这个,类本身、他的子类(包括同一个包中以及不同包中的子类)和同一个包中的所有其他类访问
Public:类中限定为public的成员可以被所有的类访问
继承:
基于已有类的定义的基础,构建新的类,已有类称为父类,新构建的类称为子类,子类能调用父类的非private修饰符访问的成员,同时还可以自己添加一些新的成员,扩充父类,甚至重写父类已有的方法
1.父类可以拥有多个子类,但是子类只能继承一个父类,称为单继承
Java中通过super来实现对父类成员的访问,super用来引用当前对象的父类。Super的使用有三种情况:
访问父类被隐藏的成员变量
调用父类中被重写的方法
调用父类的构造方法
多态:方法的重写、重载域动态连接构成多态性。
多态的一大作用就是为了解耦–为解除父类子类继承的耦合度:多态即使允许父类引用(或接口)指向子类(或实现类)对象。很多的设计模式都是基于面向对象的多态性设计的
多态性:发送消息给某个对象,让该对象自行决定响应何种行为
面向对象的五大原则:
单一职责原则:一个类只做好一件事,只有一个引起他的变化。低耦合,高内聚在面向对象的引申
1.开放封闭原则:软件实体应该使可扩展的,而不可修改的,对扩展开放,对修改封闭
2.Liskov替换原则:子类必须能够替换其基类
3.依赖倒置原则:依赖于抽象。高层模块不依赖于底层模块,二者相同依赖于抽象,抽象不依赖于具体,具体依赖于抽象
4.接口隔离原则:使用多个小的专门的接口,而不要使用一个大的总接口,接口应该是内聚的,一个类对另外一个类的依赖应该建立在最小的接口上,
SRP:就一个类而言,应该只专注于做一件事和仅有一个引起他变化的原因
LSP:如果对于类型S的每一个对象o1,都有一个类型T的对象o2,使对于任意类型T定义的程序P,将o2替代为o1,P的行为保持不变,则成S为T的一个子类。即子类型必须能够替换他的基类型
DIP:高层模块不应该依赖于底层模块,二者都应该依赖于抽象,抽象不应该依赖于细节,细节应该依赖于抽象
DIP:依赖倒置原则使细节和策略都依赖于抽象,抽象的稳定性决定了系统的稳定性
ISP:使用多个专门的接口比使用单一的总接口要好
值传递:
参数在程序语言中分为形式参数和实际参数
形式参数:在调用有参函数时,主调函数和被调函数之间有数据传递关系,在主调函数中调用一个函数时,函数后面括号的参数称为“实际参数”
实际参数是调用有参方法的时候真正传递的内容,而形式参数是用于接收实参内容的参数
值传递是指在调用函数时将实际参数复制一份传递到函数中,那么在函数中对参数所进行的修改将不会影响到实际参数
引用传递是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将会影响到实际参数
Java中都是值传递(其实都是共享传递),就算传递的是对象,其实也是把对象的地址的引用复制一份给形参,主要看形参在方法中会不会创建一个新的对象,若创建一个新的对象,此时形参指向一个新的地址,修改的是新对象的值,则原对象的值不会发生变化;若不在方法创建新的对象,则源对象的值发生变化
Java的特点:与平台无关:
Java最大的优点就是编写的软件能在所有的计算机上运行,之所以能做到这一点,是因Java可以在计算机的操作系统之上再提供一个Java运行环境(JRE),该运行环境是由Java虚拟机(JVM)、类库以及一些核心文件组成。Java虚拟机的核心是字节码指令,字节码指令不是机器指令,因此他不予特定的平台相关。而Java针对不同平台提供的Java虚拟机的字节码指令是相同的
Java程序的运行过程:
Java语言提供的编译器不针对特定的平台进行编译,而是针对Java虚拟机编译成字节码(.class文件),字节码被Java虚拟机(Java解释器是Java虚拟机的一部分)解释、运行。Java虚拟机将字节码翻译成本地计算机的机器指令,并将机器指令交给平台运行
字节码其实是一种“中间代码”