目录
2、面向过程 (OPP) 和面相对象 (OOP) 的关系和区别
一、面向对象
1、概念:
面向对象是一种思维方式、编程方式,并不只针对某一种编程语言,基本思想是从现实世界中客观存在的事物出发来构造软件系统,并在系统的构造中尽可能运用人类的自然思维方式。
2、面向过程 (OPP) 和面相对象 (OOP) 的关系和区别
面向过程:
侧重整个问题的解决步骤,着眼局部或者具体。
优点:
1.流程化使得编程任务明确,在开发之前基本考虑了实现方式和最终结果;
2.强调代码的精简实用,善于结合数据结构来开发高效率的程序;
3.流程明确,具体步骤清楚,便于节点分析。
缺点:
1.代码重用性低,扩展能力差,维护起来难度高;
2.对复杂业务来说,需要深入的思考,耗费精力,模块化难度高,耦合度高。
面向对象:
侧重具体的功能,让某个对象具有这些功能,侧重于整体。
优点:
1.结构清晰,便于模块化,抽象化,符合人类的思维方式;
2.封装性,将事务高度抽象,从而便于流程中的行为分析,也便于操作和自省;
3.容易扩展,代码重用率高,可继承,可覆盖;
4.实现简单,可有效地减少程序的维护工作。
缺点:
1.面向对象和代码底层的直接交互少,不适合底层、游戏、多媒体开发;
2.事务本身是面向过程的,过度的封装导致事务本身的复杂性提高。
知乎经典比喻:
面向过程:摇狗尾巴 = 摇(狗尾巴)
面相对象:狗摇尾巴 = 狗.摇尾巴() >>> 狗是对象,摇尾巴是狗的属性和方法
人.摇(狗尾巴) >>>多态警告
3、面向对象的三大特征
封装:
属性—描述一类事物的特征;
方法—描述一类事物的操作;
概念:封装就是把属于同一类事物的共性属性与方法归到一个类中,以方便使用。
优点:
(1)专业分工;
(2)隐藏信息;
继承:
概念:一个类继承另一个类,则称继承的类为子类,被继承的类为父类。
优点:代码复用;
注意:子类可以写自己特有的属性和方法实现功能扩展,也可以重写父类的方法,但父类私有属性和构造方法不能被继承。
多态:
概念:多态就是在抽象的层面上定义一个统一行为,到具体层面上时这个统一的行为会因具体的形态特征实施自己的特征行为,实际开发中是指程序中定义的引用变量所指向的具体类型和通过该引用变量引发的方法调用在编程时并不确定,而是在程序运行期间才确定。
举例:造汽车(对象)
抽象—首先,你要知道车要有哪些最基本的部件,如发动机、轮毂等,这一过称作抽象;
封装—因为工作量很庞大,需要找人一起造,但是不想让他知道造车的技术,可以把造车的技术隐藏起来,告诉别人只需要知道他自己要做什么就好了,这一过程称作封装;
继承—需要造很多车,想用之前造出来的某个车作为模板,进行“克隆”,用模板创出来的车具有模板的特征,就像孩子一样具有父母的性状,这一过程称作继承;
多态—很多车都是用模板“克隆”出来的,为了让品类更丰富多彩一些,对它们又进行了改变,这一过程称作多态。
4、面向对象的五大原则:
单一职责:
就一个类而言,应该仅有一个引起它变化的原因。
例如:不要将数据库的操作、文件的操作、算法的运用等都写在一个类中,应该按照功能不同各自分开,可实现代码复用。
开发封闭:
是软件实体(类、模块、函数等),可以扩展的,但是不可修改。
依赖倒置:抽象不应该依赖细节,细节应该依赖于抽象。
例如:客户端向数据库插入数据,最初保存到MySql,现在改为保存到Oracle,应该对插入业务进行抽象,使客户端依赖插入业务,而不是依赖MySql或Oracle数据库操作。
里氏替换:子类必须能够替换掉他们的父类,意思是子类必须具有父类的所有特性。
接口隔离:多个专用的接口优于一个单一的通用接口,不要把所有的方法都添加到一个接口中。
二、类和对象
1.类是对现实生活中事物的描述,对象是这类事物的一个个体。
2.类和对象在Java中的体现:
{1}. 在Java中描述事物就是用class来定义类;
{2}. 在Java中产生一个类的实体就是用new来创建类的对象。
3.描述事物和Java中类的关系:
{1}. 描述事物就是在描述事物的属性和行为;
{2}. 定义类就是在描述事物,就是在定义事物的属性和行为。
4.类的成员:类中的属性和行为共同组成了类中的成员。
三、构造函数
1.构造函数的作用
给对象进行初始化(也就是为对象的某些属性进行赋值,使得对象一产生就具备某些特征)
2.构造函数的特点
[1]. 函数名和类名相同;
[2]. 没有返回值类型(没有return语句);
[3]. 构造函数只能用 new 初始化对象,不能像普通方法那样被调用。
3.构造函数被调用的时机
对象一建立,就会调用与之对应的构造函数。
4.构造函数的小细节
一个类中没有显式定义构造函数时,OS会自动给该类加入一个空参构造函数; 如果一个类显式定义了一个构造函数,OS便不再自动加入一个空参数的构造函数。
5.构造函数和普通函数的区别
[1]. 写法不同;
[2]. 运行不同:
{1} 构造函数在对象一建立的时候,就来给对象进行初始化;
{2} 只有对象调用才执行。
[3]. 执行次数不同:
{1} 构造函数用来给对象进行初始化,仅运行一次;
{2} 普通的方法可以被对象多次调用,可以执行多次;
四、构造代码块
1.构造代码块的写法与目的
[1]. 写法:用一对{}封装起来一段代码,并把这个代码块放在类的成员的位置上。
[2]. 目的:构造代码块,顾名思义是起到构造方法的作用的代码块,即是给对象进行初始化的代码块。
2.构造代码块和构造函数的区别
[1]. 初始化对象不同:
{1}. 构造代码块:对这个类所有的对象进行共性的初始化;
{2}. 构造函数:可以指定,可以对指定对象进行个性的初始化。
[2]. 执行顺序不同:构造代码块先于构造函数执行。
例:(面试题)
请问如下代码输出结果是什么?
class Person{
private String name;
private int age;
//构造代码块
{
name ="Benjamin";
age = 18;
System.out.println("Person code run....");
}
Person(){
System.out.println("name ="+ name+", age ="+age);
}
Person(String name, int age){
this.name =name;
this.age =age;
System.out.println("name ="+ name+", age ="+age);
}
}
public class Test {
public static void main(String[] args) {
Person p1 =new Person();//调用空参数构造函数进行初始化
Person p2 =new Person("zxm", 28);//调用非参数构造函数进行初始化
/*
* 两个Person对象,分别指定用不同的构造函数进行初始化。个性的初始化
* 但是,在每一个构造函数运行之前,构造代码块都对这两个对象进行统一
*/
}
}
答案:
五、静态代码块
1、静态代码块的格式
在构造代码块的原有格式之前加上static关键字就把构造代码块变成了静态代码块。
static{
//静态代码块中的执行语句
}
2、静态代码块的特点
(1)随着类加载而执行;
(2)仅仅执行一次,用来为类进行初始化;
(3)优先于本类的main执行(静态代码块没有名字,如果不马上执行就无法再找到,main方法具有名字,可以被JVM调用)。
3、静态代码块的书写目的
类被加载进内存的时候,在没有对象的情况下,很有可能需要执行一些动作,如果这些动作写在一个静态方法中,那么只有这个静态方法被调用,相对应的动作才会被执行,无法实现随着类加载就执行的功能,这些随着类加载就执行的动作就可以写在静态代码块中。
4、静态代码块和构造代码块的关系和区别
静态代码块:给类初始化,仅执行一次,优先于main执行;
构造代码块:给对象进行公有初始化,仅执行一次,优先于指定的构造方法执行。
JAVA基础篇专栏持续更新中,更多JAVA基础知识请移步专栏垂阅,希望对您有帮助!