一、面向过程和面向对象的比较
以“把大象装进冰箱为例”
面向过程:强调的是功能行为,以函数为最小单位,考虑怎么去做
- 打开冰箱;
- 把冰箱装进去;
- 关闭冰箱;
面向对象:强调具备了功能的对象,以类/对象为最小单位,考虑谁来做
有三个主体:大象、冰箱、人
大象{
进入(冰箱){
}
}
冰箱{
开开();
闭合();
}
人{
打开(冰箱){
冰箱.开开();
}
关闭(冰箱){
冰箱.闭合();
}
}
面向对象分析方法分析问题的思路和步骤:
- 根据问题的需要,选择问题所针对的现实的实体;
- 从实体中寻找解决问题相关的属性和功能,这些属性和功能就形成了概念世界中的类;
- 把抽象的实体用计算机语言进行描述,形成计算机世界中的类,即借助某种程序语言,把类构造成计算机能够识别和处理的数据结构;
- 将类实例化成计算机世界中的对象,对象是计算机世界中解决问题的最终工具。
二、类和对象
1.类和对象的定义
类:对一类事物的描述,是抽象的、概念上的定义;
对象:是实际存在的该类的具体个体,因为也称为实例
2.设计类
面向对象程序设计的重点就是类的设计;
类的设计,其实就是类的成员的设计。
属性:成员变量=field(域、字段)
方法:成员方法=method(函数)
构造器
创建类的对象=类的实例化=实例化类
3.类的使用
(1)创建类,设计类的成员;
(2)创建类的对象;
(3)通过“对象.属性”或“对象.方法”调用对象的结构
4.如果创建了一个类的多个对象,则每个对象都独立的拥有一套类的属性(非static的)
这句话有一个需要注意的点:
- 如果我们修改一个对象的属性,则其他对象互不影响;
5.对象的内存解析
6.类中的属性
成员变量 vs 局部变量
相同点:
- 定义变量的格式相同,数据类型 变量名=变量值
- 先声明,后使用
- 变量都有作用域
不同点:
- 在类中声明的位置不同
成员变量:直接声明在类的{}中
局部变量:声明在方法内、方法形参、代码块内、构造器形参、构造器内2.
2.权限修饰符的不同
属性:可以指明其权限修饰符
局部变量:不可以使用权限修饰符
3.默认初始化值
成员变量:根据其类型,都有默认初始化值
整型(byte、short、int、long):0
浮点型(float、double):0.0
字符型(char):0(或’\u0000’)
布尔型(boolean):false
引用数据类型:null
局部变量:没有默认初始化值,意味着我们在调用局部变量时,必须初始化值
特别的:形参调用时,赋值即可
4.在内存中加载的位置也是不一样的
成员变量:加载到堆空间中(非static)
局部变量:栈中
7.类中方法的使用
7.1方法定义:类中具有的功能,比如:Math类中的sqrt()、random()
Scanner类中的nextXXX()
Arrays类中的sort()
7.2方法的声明:权限修饰符 返回值类型 方法名(参数列表){方法体}
以上几个部分每个方法都带有,除此之外还有一些关键字:
static、final、abstract来修饰方法
7.2.1、权限修饰符
private public 缺省 protected
7.2.2、返回值类型: 有返回值 VS 无返回值
如果有返回值时,必须在方法声明时,定义返回值类型。同时在方法中,需要使用return关键字来指定返回 的变量或常量。
如果方法没有返回值时,使用void来表示。通常就不写return,但是如果使用的话,表示结束此方法的意思。
7.2.3、方法名——标识符
首单词首字母小写、其余字母首字母大写;见名知意
7.2.4、形参列表
格式:形参1、形参2、...
7.2.5、方法体
方法功能的体现
7.2.6、return关键字的使用
使用范围:在方法体中
作用: (1)结束方法
(2)针对于有返回值类型的方法,返回所要数据;
注意点:return关键字后不可以声明执行语句
7.3 方法的使用
可以调用当前类的属性或方法
方法中不可以定义方法
三、JVM内存结构
编译完源程序后,生成一个或多个字节码文件
我们使用JVM中的类加载器和解释器对生成的字节码文件进行解释和运行。意味着,需要将字节码文件对应的类加载到内存中,涉及到内存解析
四、万事万物皆对象
怎么理解?
- 在Java语言范畴中,我们都将功能、结构等封装到类中,通过类的实例化,来调用具体的功能结构;
>文件:File
>网络资源:URL
2.涉及到Java语言与前端的语言HTML、CSS、JS,后端的数据库交互时,前后端的结构,在Java层面交互时,都体现为类、对象
四、匿名对象
理解:创建的对象没有显式的赋给一个变量名,即为匿名对象。
特征:只能调用一次
使用:new Person()
五、方法扩展
5.1方法的重载
概念:在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数类型不同即可
注意:
跟方法的权限修饰符、返回值类型、形参变量名、方法体都没有关系
5.2可变个数的形参
- 可变个数形参的格式:数据类型...变量名;
- 当调用可变个数形参的方法时,传入的参数个数可以是:0、1、2、n个
- 可变个数形参的方法与本类中方法名相同时,形参不同的方法之间构成重载
- 可变个数形参的方法与本类中方法名相同时,形参类型也相同的数组之间不构成重载,(可变个数形参就相当于数组)
- 可变个数形参在方法的形参中,必须声明在末尾 ,且只能声明一个
5.3方法参数的值传递机制
1.形参和实参的定义
形参:方法定义时,声明在小括号内的参数
实参:方法调用时,实际传递给形参的数据
2.值传递机制
如果参数是基本数据类型,此时实参给形参的是真实存储的数据值
如果参数是引用数据类型,此时实参给形参的是数据的地址值。
5.4方法的递归
定义:一个方法体内调用方法它自身
例子:
public int getSum(n){
if(n==1){
return 1;
}else{
return n+getSum(n-1);
}
}
六、构造器(构造方法)
1.作用
(1)创建对象;
(2)创建对象的同时可以对成员变量进行初始化
2.格式
权限修饰符 类名(){}
3.注意
- 构造器和方法是不一样的,对象可以调方法,但是构造器是用来创建对象的;
- 一旦我们显示的定义了构造器后,系统就不会默认给我们定义构造器;
- 一个类中,至少会有一个构造器