一、面向对象与面向过程
面向对象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自定义类步骤:
- 定义类(考虑修饰符、类名)
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。)
匿名对象:
1.理解:我们创建的对象,没有显式的赋给一个变量名。即为匿名对象
2.特征:匿名对象只能调用一次。
3.使用:如下
public class InstanceTest {
public static void main(String[] args) {
Phone p = new Phone();
// p = null;
System.out.println(p);
p.sendEmail();
p.playGame();
//匿名对象
// new Phone().sendEmail();
// new Phone().playGame();
new Phone().price = 1999;
new Phone().showPrice();//0.0
//**********************************
PhoneMall mall = new PhoneMall();
// mall.show(p);
//匿名对象的使用
mall.show(new Phone());
}
}
class PhoneMall{
public void show(Phone phone){
phone.sendEmail();
phone.playGame();
}
}
class Phone{
double price;//价格
public void sendEmail(){
System.out.println("发送邮件");
}
public void playGame(){
System.out.println("玩游戏");
}
public void showPrice(){
System.out.println("手机价格为:" + price);
}
}
三、类的成员之一: 属性(field)
属性(成员变量) vs 局部变量
相同点:
:::tips
- 都是变量,定义变量的格式:数据类型 变量名 = 变量值
- 先声明,后使用
- 变量都有其对应的作用域 :::
不同点:
1.在类中声明的位置的不同
:::warning 属性:直接定义在类的一对{}内(就是class 类名{这个位置}) :::
局部变量:声明在方法内、方法形参、代码块内、构造器形参、构造器内部的变量
2.关于权限修饰符的不同
:::warning
属性:可以在声明属性时,指明其权限,使用权限修饰符。
常用的权限修饰符:private、public、缺省、protected —->封装性细说
目前,大家声明属性时,都使用缺省就可以了。(就是比如 int age;)
:::
局部变量:不可以使用权限修饰符。
3. 默认初始化值的情况:
:::warning
属性:类的属性,根据其类型,都有默认初始化值。
(与数组相同的默认初始化值)
整型(byte、short、int、long):0
浮点型(float、double):0.0
字符型(char):0 (或’\u0000’)
布尔型(boolean):false
引用数据类型(类、数组、接口):null
:::
局部变量:没有默认初始化值。 意味着,我们在调用局部变量之前,一定要显式赋值。 特别地:形参在调用时,我们赋值即可。
4. 在内存中加载的位置:
:::warning 属性:加载到堆空间中 (非static) :::
局部变量:加载到栈空间
四、类的成员之二: 方法(method)
什么是方法(method、函数):?描述类应该具有的功能。
- 方法是类或对象行为特征的抽象,用来完成某个功能操作。在某些语言中也称为函数或过程。
- 将功能封装为方法的目的是,可以实现代码重用,简化代码。
- Java里的方法不能独立存在,所有的方法必须定义在类里。
方法的声明:
方法的声明:权限修饰符 返回值类型 方法名([形参列表]){ 方法体 }
权限修饰符:void、public、static、final、abstract
- 注意:static、final、abstract 来修饰的方法,后面再讲
4.1 关于权限修饰符:默认方法的权限修饰符先都使用public
Java规定的4种权限修饰符:private、public、缺省、protected —>封装性再细说
4.2 返回值类型:
有返回值 vs 没有返回值
:::warning 如果方法有返回值,则必须在方法声明时,指定返回值的类型。同时,方法中,需要使用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 后面的语句就会再执行了)
五、类的构造之三:构造器(constructor)
(或构造方法、constructor)的使用。construct:建设、建造。 construction:CCB constructor:建设者
定义构造器的格式:
语法格式: 权限修饰符 类名 (参数列表) { 初始化语句; }
5.1 构造器的特征
- 它具有与类相同的名称
- 它不声明返回值类型。(与声明为void不同)
不能被static、final、synchronized、abstract、native修饰,不能有 return语句返回值
5.2 构造器的作用:
1.创建对象 //创建类的对象:new + 构造器(如:Person p1 = new Person())
2.初始化对象的信息5.3 说明:
根据参数不同,构造器可以分为如下两类: :::tips
隐式无参构造器(系统默认提供)
- 显式定义一个或多个构造器(无参、有参) ::: 注 意: :::tips
- Java语言中,每个类都至少有一个构造器
- 默认构造器的修饰符与所属类的修饰符一致
- 一旦显式定义了构造器,则系统不再提供默认构造器
- 一个类可以创建多个重载的构造器
- 父类的构造器不可被子类继承
:::
5.4 构造器重载
- 构造器一般用来创建对象的同时初始化对象。 如:
- 构造器重载使得对象的创建更加灵活,方便创建各种不同的对象。如:
- 构造器重载,参数列表必须不同
总结:属性赋值过程
赋值的位置:
① 默认初始化
② 显式初始化
③ 构造器中初始化
④ 通过“对象.属性“或“对象.方法”的方式赋值
赋值的先后顺序: ① - ② - ③ - ④
“万事万物皆对象” 的理解:
理解一:https://www.bilibili.com/video/BV1Kb411W75N?p=201