文章目录
1.基本概念
1、学习面向对象内容的三条主线(贯穿456章):
- Java类及类的成员:属性、方法、构造器;代码块,内部类
- 面向对象的三大特征:封装性、继承性、多态性
- 其他关键字:this super static final abstract interface package import等
2、何谓“面向对象”的编程思想?
做人有做人的原则,编程有编程的原则,这些编程的原则,就是编程思想。
3、面向过程(POP)与面向对象(OOP)
二者都是一种思想,面向对象是相对于面向过程而言的,面向过程,强调的是功能行为,以函数为最小单位,考虑怎么做。面向对象,将功能封装进对象,强调具备了功能的对象,以类/对象为最小单位,考虑谁来做。
面向对象 | 面向过程 | |
---|---|---|
最小单位 | 函数 | 类/对象 |
人把大象放进冰箱?
- 面向过程:强调的是功能行为,以函数为最小单位,考虑怎么做
- 把冰箱门打开
- 抬起大象,塞进冰箱
- 把冰箱门关闭
- 面向对象:强调具备了功能的对象,以类/对象为最小单位,考虑谁来做。
对象:人、大象、冰箱,一般用类来刻画。
人{
打开(冰箱){
冰箱,开开();
}
抬起(大象){
大象.进入(冰箱);
}
关闭(冰箱){
冰箱.闭合();
}
}
冰箱{
开开(){
}
闭合(){
}
}
大象{
进入(冰箱);{
进入细节;
}
}
2.面向对象两个要素——类和对象
类(Class)和对象(Object)是面向对象的核心概念。
- 类是对一类事物的描述,是抽象的、概念上的定义
- 对象是实际存在的该类事物的每个个体,因而也称为实例
理解:
- 类 = 抽象概念的人;对象 = 实实在在的某个人
- 面向对象程序设计的重点是类的设计
- 类的设计,其实就是类的成员的设计
2.1 类的结构:属性和方法
设计类,其实就是类的成员的设计
现实世界的生物体,大到鲸鱼,小到蚂蚁,都是由最基本的细胞构成的。同理,Java代码世界是由许多功能不同的类构成的。
现实生物世界中的细胞又是由什么构成的?细胞核、细胞质、…那么,Java中用类class来描述事物也是如此,常见的类成员(内部结构)有:
- 属性:对应类中的成员变量。属性也称为:成员变量、域、字段、field
- 行为:对应类中的成员方法。方法也称为:成员方法、函数、method
生活中描述事物无非就是描述事物的属性和行为。如:人有身高、体重等属性,有说话、打球等行为
class Person{
//属性
String name;
int age;
boolean isMarried;
//方法(或函数)
public void talk(){
System.out.println("人讲话");
}
}
实际上,类比较完整的成员有:属性、构造器、方法、代码块、内部类
2.2类和对象的创建
类和对象的创建是面向对象思想落地的实现
- 创建类、设计类的成员
- 创建类的对象(即类的实例化,通过new的方式)
- 通过“对象.属性”或“对象.方法”调用对象的结构
如果创建了一个类的多个对象,则每个对象都独立地拥有一套类的属性(非static的),意味着,如果修改一个对象的属性a,则不影响另外一个对象该属性a的值。
//测试类
public class PersonTest{
public static void main(String[] args){
//创建Person类的对象,即类的实例化
Person p1 = new Person();
//调用对象的结构:属性、方法
//调用属性:“对象.属性”
p1.name = "Tom";
p1.age = 10;
p1.isMarried = true;
System.out.println(p1.name);
//调用方法:“对象.方法”
p1.talk();
//***如果创建了一个类的多个对象,则每个对象都独立地拥有一套类的属性***
Person p2 = new Person();
System.out.println(p2.name);//结果输出null,而不是Tom
//将p1变量保存的对象地址值赋给p3,此时p1和p3指向了堆空间中的同一个对象实体。
Person p3 = p1;
System.out.println(p3.name);//Tom
p3.age = 20;
System.out.println(p1.age);//20
}
}
class Person{
//属性
String name;
int age;
boolean isMarried;
//方法(或函数)
public void talk(){
System.out.println("人可以讲话");
}
}
2.3 对象的内存解析
3.类中属性的使用
1、属性(成员变量) VS 局部变量
相同点:
- 定义变量的格式:数据类型 变量名 = 变量值
- 先声明,后使用
- 变量都有其对应的作用域
不同点:
- 在类中声明的位置不同
属性:直接定义在类的一对{}内
局部变量:声明在方法内、方法形参、代码块内、构造器形参、构造器内部的变量 - 关于权限修饰符的不同
属性:可以在声明属性时,指明其权限,使用权限修饰符。
常用的权限修饰符:private、public、缺省、protected。
目前,声明属性时,使用缺省就可以了。
局部变量:不可以使用权限修饰符。 - 默认初始化值的不同
数据类型 变量名 = 变量值
变量值会牵扯到默认初始化值的情况
属性:根据其类型,都有默认初始化值,和一维数组的初始化值情况相同
整型(byte short int long):0
浮点型(float double):0.0
字符型(char):0(或’\u0000’)
布尔型(boolean):false
引用数据类型(类、数组、接口):null
局部变量:没有默认初始化值。
意味着,我们在调用局部变量之前,一定要显式赋值。
特别地,形参在调用时赋值即可。 - 二者在内存中加载的位置不同
属性(非static的):加载到堆空间中
局部变量:加载到栈空间中
class User{
//属性(或成员变量)
String name;
int age;
boolean isMale;
public void talk(String language){
//language:形参,也是局部变量
System.out.println("我们使用" + language + "进行交流");
public void eat(){
String food = "烙饼";//局部变量
System.out.println("北方人爱吃" + food);
}
}
}
4.类中方法的声明和使用
方法:描述类该具有的功能。
比如:Math类:sqrt()、random()…
Scanner类:nextXxx()…
Array类:sort()、binarySearch()、toString()、equals()…
1、举例:
public void eat(){}
public void sleep(int hour){}
public String getName(){}
public String getNation(String nation){}
2、方法的声明
方法的声明:权限修饰符 返回值类型 方法名(形参列表){
方法体;
}
class Customer{
//属性
String name;
int age;
boolean isMale;
//方法
public void eat(){
System.out.println("客户吃饭");
}
public void sleep(int hour){
System.out.println("休息了" + hour + "个小时");
}
public String getName(){
return name;
}
public String getNation(String nation){
String info = "我的国籍是:" + nation;
return info;
}
4.1方法声明的说明
方法的声明:权限修饰符 返回值类型 方法名(形参列表){
方法体;
}
1、 关于权限修饰符:
Java规定的4种权限修饰符:private、public、缺省、protected
2、返回值类型:有返回值 VS 没有返回值
- 如果方法有返回值,则必须在方法声明时,指定返回值类型,同时,方法中,需要使用return关键字来返回指定类型的变量或常量,“return 数据”。
- 如果方法没有返回值,则方法声明时,使用void来表示。通常,没有返回值的方法中,就不使用return。但是,如果使用的话,只能“return;”表示结束此方法的意思。注意,此时return的作用是结束此方法,return后面的语句将无法执行。
3、方法名:属于标识符,起名时注意标识符的规则和规范。“见名知意”
4、形参列表:方法可以声明0个,1个,或多个形参。
格式: 数据类型1 形参1,数据类型2 形参2,…
5、方法体:方法功能的实现
注意1:return关键字的使用:
- 使用范围:使用在方法体中
- 作用:a.结束方法;b.针对有返回值类型的方法,使用"return 数据"方法返回所要的数据。
- 注意点:return关键字后面不可以声明执行语句。
注意2:
- 方法的使用中,可以调用当前类的属性或方法;
特殊的:方法A 中又调用了方法A:递归方法。 - 方法中:不可以定义方法。
5. 理解“万事万物皆对象”
- 在Java语言范畴中,我们都将功能、结构等封装到类中,通过类的实例化,来调用具体的功能结构
- 涉及到Java语言与前端HTML、后端的数据库交互时,前后端的结构在Java层面交互时,都体现为类、对象。
6. 匿名对象
- 理解:我们创建的对象没有显式的赋给一个变量名,即为匿名对象
- 特征:匿名对象只能调用一次