一、面向对象与面向过程
面向对象OOP和面向过程POP的区别:
- 面向过程:强调的是功能行为,以函数为最小单位,考虑谁来做。
- 面向对象:强调具备了功能的对象,以类/对象为最小单位,考虑谁来做。
- 【我的理解:以一盘鱼香肉丝炒饭开始。面向过程就是自己去超市买材料:肉丝、木耳、肉丝,准备调料,自己回家动手做鱼香肉丝。面向对象就是去饭店直接点一盘鱼香肉丝炒饭,坐着等就可以吃到了,不用自己动手去做。】
面向过程:Procedure Oriented Programming
面向对象:Object Oriented Programming
面向对象的三大特征:封装性、继承性、多态性
面向对象的思想概述:
- 程序员从面向过程的执行者转化成了面向对象的指挥者
- 面向对象分析方法分析问题的思路和步骤:
-
- 根据问题需要,选择问题所针对的现实世界中的实体。
- 从实体中寻找解决问题相关的属性和功能,这些属性和功能就形成了概念世界中的类。
- 把抽象的实体用计算机语言进行描述,形成计算机世界中类的定义。即借助某种程序语言,把类构造成计算机能够识别和处理的数据结构。
- 将类实例化成计算机世界中的对象。对象是计算机世界中解决问题的最终工具。
二、 类和对象
2.1 类和对象的定义:
- 类(Class)和对象(Object)是面向对象的核心概念。
-
- 类是对一类事物的描述,是抽象的、概念上的定义。
- 对象是实际存在的该类事物的每个个体,因而也称为实例(instance)。
- “万事万物皆对象”
可以理解为:类 = 抽象概念的人=明星;对象 = 实实在在的某个人 =蔡徐坤
面向对象程序设计的重点是类的设计。
类的设计,其实就是类的成员的设计。
2.2 Java类及类的成员
设计类,其实就是设计类的成员。
类和类的成员组成:属性、方法(常见)
- 现实世界的生物体,大到鲸鱼,小到蚂蚁,都是由最基本的细胞构成的。同 理,Java代码世界是由诸多个不同功能的类构成的。
- 现实生物世界中的细胞又是由什么构成的呢?细胞核、细胞质、… 那么, Java中用类class来描述事物也是如此。常见的类的成员有:
-
- 属 性:对应类中的成员变量
- 行 为:对应类中的成员方法
方法和属性的多种叫法,本质都是同一个。
属性 = 成员变量 = field = 域、字段
方法 = 成员方法 = 函数 = method
创建类的对象 = 类的实例化 = 实例化类
类的成员构造:
class Person { //属性,或成员变量 String name; int age; boolean isMarried; //构造器 public Person(){} public Person(String n, blooean im){ name = n; isMarried = im; } //方法,或函数 public void eat(){ System.out.println("人会吃饭。"); } public String display(){ return "名字是:" + name + ",年龄为:"+"," 是否娶嫁" + isMarried; } //代码块 { name = "CXK"; age = 20; isMarried = false; } //内部类 class pet{ String name; float weight; } }
类的语法格式:
修饰符 class 类名 {
属性声明;
方法声明;
}
说明:修饰符public:类可以被任意访问。
类的正文要用{ }括起来。
创建Java自定义类步骤:
1. 定义类(考虑修饰符、类名)
2. 编写类的属性(考虑修饰符、属性类型、属性名、初始化值)
3. 编写类的方法(考虑修饰符、返回值类型、方法名、形参等)
2.3 类和对象的使用(面向对象思想落地的实现):
* 1.创建类,设计类的成员(重心)
* 2.创建类的对象
* 3.通过“对象.属性”或“对象.方法”调用对象的结构
创建对象语法: 类名 对象名 = new 类名();
使用“对象名.对象成员”的方式访问对象成员(包括属性和方法)
- 包名:都小写xxyyzz
- 类名、接口名:XxxYyyZzz
- 变量名、方法名:xxxYyyZzz
- 常量名:XXX_YYY_ZZZ
说明:
如果创建了一个类的多个对象,则每个对象都独立的拥有一套类的属性。(非static的)
意味着:如果我们修改一个对象的属性a,则不影响另外一个对象属性a的值。
【我的理解:就是一个独立的对象,也就是 new 出来的对象,可以自己改变原来类的属性(这个属性(=成员变量)就是指的是:类里面的,如 int age =10; 啊等等的这些属性)】
对象的内存解析:
- 第一句:先在栈中声明一个 Person类的对象 p1,new 一个Person类的对象 p1 在堆中开辟一个空间里面会存放 Person类的内容,栈中 p1 存放 p1 在堆中的空间的地址;
- 第二句:把 p1 指向的堆中的空间里面的name = null 替换为name = Tom;
- 第三句:把 p1 指向的堆中的空间里面的isMale = false 替换为isMale = true;
- 第四句:先在栈中声明一个 Person类的对象 p2,new 一个Person类的对象 p2 在堆中开辟一个空间里面会存放 Person类的内容,栈中 p2 存放 p2 在堆中的空间的地址;
- 第五句:输出 p2.name,输出结果为 null;
- 第六句:在栈中声明一个 Person类的对象 p3 ,p3 存放 p1 在堆中的空间的地址。(可以理解为 p3 为 p1 的打开快捷方式,p3 和 p1 指向的内容相同。)
- 第七句:把 p3 指向的堆中的空间里面的 age = 1 替换为 age = 10;(这里要注意,因为 p1 和 p3 指向的堆空间是相同的,所以 p1 的 age也是等于 10。)
匿名对象:
三、类的成员之一: 属性(field)
属性(成员变量) vs 局部变量
相同点:
- 都是变量,定义变量的格式:数据类型 变量名 = 变量值
- 先声明,后使用
- 变量都有其对应的作用域
不同点:
1.在类中声明的位置的不同
属性:直接定义在类的一对{}内(就是class 类名{这个位置})
局部变量:声明在方法内、方法形参、代码块内、构造器形参、构造器内部的变量
2.关于权限修饰符的不同
属性:可以在声明属性时,指明其权限,使用权限修饰符。
常用的权限修饰符:private、public、缺省、protected --->封装性细说
目前,大家声明属性时,都使用缺省就可以了。(就是比如 int age;)
局部变量:不可以使用权限修饰符。
3. 默认初始化值的情况:
属性:类的属性,根据其类型,都有默认初始化值。
(与数组相同的默认初始化值)
整型(byte、short、int、long):0
浮点型(float、double):0.0
字符型(char):0 (或'\u0000')
布尔型(boolean):false
引用数据类型(类、数组、接口):null
局部变量:没有默认初始化值。
意味着,我们在调用局部变量之前,一定要显式赋值。
特别地:形参在调用时,我们赋值即可。
4. 在内存中加载的位置:
属性:加载到堆空间中 (非static)
局部变量:加载到栈空间
四、类的成员之二: 方法(method)
什么是方法(method、函数):?描述类应该具有的功能。
- 方法是类或对象行为特征的抽象,用来完成某个功能操作。在某些语言中也称为函数或过程。
- 将功能封装为方法的目的是,可以实现代码重用,简化代码。
- Java里的方法不能独立存在,所有的方法必须定义在类里。
方法的声明:
方法的声明:权限修饰符 返回值类型 方法名([形参列表]){
方法体
}
权限修饰符:void、public、static、final、abstract
* 注意:static、final、abstract 来修饰的方法,后面再讲
4.1 关于权限修饰符:默认方法的权限修饰符先都使用public
Java规定的4种权限修饰符:private、public、缺省、protected -->封装性再细说
4.2 返回值类型:
有返回值 vs 没有返回值
如果方法有返回值,则必须在方法声明时,指定返回值的类型。同时,方法中,需要使用return关键字来返回指定类型的变量或常量:“return 数据”。
如果方法没有返回值,则方法声明时,使用void来表示。通常,没有返回值的方法中,就不需要使用return.但是,如果使用的话,只能“return;”表示结束此方法的意思。
我们定义方法该不该有返回值?
① 题目要求
② 凭经验:具体问题具体分析
4.3 方法名:属于标识符,遵循标识符的规则和规范,“见名知意”
4.4 形参列表: 方法可以声明0个,1个,或多个形参。
格式:数据类型1 形参1,数据类型2 形参2,...
我们定义方法时,该不该定义形参?
① 题目要求
② 凭经验:具体问题具体分析
4.5 方法体:方法功能的体现。
方法的使用中,可以调用当前类的属性或方法
特殊的:方法A中又调用了方法A:递归方法。(比如快速排序)
方法中,不可以定义方法。
return关键字的使用:
- 1.使用范围:使用在方法体中
- 2.作用:① 结束方法
② 针对于有返回值类型的方法,使用"return 数据"方法返回所要的数据。
- 3.注意点:return关键字后面不可以声明执行语句。(就是执行到return 后面的语句就会再执行了)