Java基础学习笔记整理了我从零开始学习Java时所学习到的内容。
以下内容参考尚硅谷Java教程。
五.面向对象(上)
1 类与对象
1.1 面向对象内容
①Java类及类的成员:属性、方法、构造器;代码块、内部类;
②面向对象的特征:封装、多态、继承;(抽象);
③其他关键字:this、super、static、final、abstract、interface、package、import等。
1.2 面向对象与面向过程
面向过程:强调的是功能行为,以函数为最小单位,考虑怎么做。
面向对象:强调了具备具体功能的对象,以类/对象为最小单位,考虑谁来做。
1.3 设计思路
- 根据问题需要,选择问题所针对的现实世界中的实体;
- 从实体寻找解决问题的相关属性和功能,这些属性和功能形成了概念世界中的类;
- 把抽象的实体用计算机语言描述,形成计算机的类的定义;
- 将类实例化成计算机中的对象,对象是处理问题的最终工具。
1.4 面向对象的重要概念
类(class):对一类事物的描述,是抽象的、概念上的定义。
对象(abstract):是实际存在的该类事物的个体,因此也被称为实例。
面向对象程序设计重点是类的设计
设计类,就是设计类的成员
1.5 面向对象编程基本规则
- 创建类,设计类的成员;
- 创建类的对象;
- 通过“对象.属性”或“对象.方法”调用对象的结构。
补充:
属性=成员变量=field=域
方法=成员方法=函数=method
创建类的对象=对象实例化=实例化类
1.6 对象的创建与对象的内存解析
代码:
Person p1 = new Person();
Person p3 =p1;//共用一个对象实体
说明:
如果创建了一个类的多个对象,则每个对象都有一套独立的类的属性(非static)。这意味着我们更改对象一的属性时,不会影响到另一个对象的属性。
1.7 内存解析
创建一个类的对象=在栈中放入一个指针,指向堆空间中的一块区域
该区域中包含属性、方法。
1.8 匿名对象
我们创建的对象,没显式的赋给一个变量名,即为匿名对象。
特点:匿名对象只能调用一次。
应用场景:
PhoneMall mall = new PhoneMall;
mall.show(new Phone());
class PhoneMall{
public void show(Phone phone){
phone.sendEmail();
phone.playGame();
}
}
番外:JVM的内存解析
编译.java文件后,生成一个或多个字节码文件。
JVM的类加载器与解释器对生成的字节码文件进行解释运行。
虚拟机栈,即为平时提到的栈结构。我们将局部变量存储在栈结构中。
堆,我们将new出来的结构(比如:数组、对象)加载在堆空间中。补充:对象的属性(非static的)加载在堆空间中。
方法区:类的加载信息、常量池、静态域。
2 属性
属性(成员变量) vs 局部变量
相同点
1.定义变量的格式:数据类型 变量名 = 变量值
2.先声明,后使用
3.变量都有其作用域
不同点
- 在类中声明的位置不同
属性:直接定义在类的{ }内
局部变量:声明在方法内、方法形参、代码块内、 构造器形参、构造器内部的变量
- 关于权限的修饰符不同
属性:可以在声明属性时,指明其权限,使用权限修饰符
常用private、public、缺省、protected
局部变量:不可以使用权限修饰符
- 默认初始化值
属性:根据其类型自动装填默认值
局部变量:无初始化值。即我们调用局部变量之前必须先给它赋值
- 在内存中加载的位置
属性:加载到堆空间中(非static)
局部变量:加载到栈空间
3 方法
描述应该具有的功能。
比如:Math类:sqrt() \ random() \ …
Scanner类:nextXxx() \ …
Arrays类:sort() \ binarySearch() \ toString() \ equals() \ …
3.1 声明格式
权限修饰符 返回值类型 方法名(形参列表){
方法体
}
举例
public void eat(){}
public void sleep(int hour){}
public String getName(){}
public String getNation(String nation){}
3.2 说明
- 关于权限修饰符:默认一般使用public。
- 返回值类型:有返回值 vs 无返回值
如果方法有返回值,则必须在方法声明时,指定返回值的类型。同时,方法中需要使用return关键字来返回指定类型的变量或常量“return 返回值;”。
如果方法无返回值,则方法声明时,使用void来表示,且不需要return。若要强行使用,只能用“return;”来表明结束此方法。 - 方法名:属于标识符,遵循标识符的规则与规范。
- 形参列表:方法可以声明0个、1个或多个形参。
格式:数据类型1 形参1,数据类型2 形参2,… - 方法体:方法功能的体现。
- 方法的使用中,可以调用当前类的属性或方法。
特殊的:方法A又调用了方法A:递归方法。
方法中不可以定义方法。
3.3 return关键字的使用
- 使用范围:使用在方法体中。
- 作用:
①结束方法;
②针对于有返回值的方法,使用“return 返回值”方法返回所需要的数据。 - return关键字后面不可以声明执行语句。
3.4 方法的重载
定义:在同一个类中,允许存在一个以上的同名方法,只要它们的形参个数类型不同即可。
举例:
public void eat(int n){}
public void eat(int n,int m){}
public void eat(String n){}
以上三种方法互为重载。
如何确定类中的某一个方法的调用:
依照方法名—>参数列表
3.5 可变个数形参的方法
- 格式:数据类型 … 变量名;
- 当调用可变个数形参的方法时,传入的参数可以是:0个、1个、n个;
- 可变个数形参的方法与方法名相同,形参类型不同的方法构成重载;
- 形参类型相同则不构成重载;
- 可变个数形参的方法必须声明在末尾,即优先级最低;
- 可变个数形参只能声明一个。
举例:
public void show(int ... strs){
//使用数组遍历的方式调用每个strs。
for(int i = 0;i<strs.length;i++){
System.out.println(strs[i]);
}
}
3.6 Java的值传递机制
形参:方法定义时,声明的小括号里的参数
实参:方法调用时,实际传递给形参的数据
规则:
如果变量是基本数据类型,此时实参赋给形参的是实参真实存储的数据值;
如果变量是引用数据类型,此时实参赋给形参的是实参存储数据的地址值
3.7 递归方法
定义:一个方法体内调用它自身。
如何理解递归方法:
方法递归包含了一种隐式的循环,它会重复执行某段代码,但这种重复执行无需循环控制。
递归一定要朝已知方向递归,否则就变成了无穷递归。
举例:
//计算1-n的和
public int getSum(int n){
if(n==1){
return 1;
}else{
return n + getSum(n-1);
}
}
4 面向对象的特征一:封装与隐藏
4.1 为什么要引入封装性
程序设计追求“高内聚、低耦合”。隐藏对象内部的复杂性,只对外公开简单的接口,这就是封装性的设计思想。
4.2 封装性的体现
体现一:
将类的属性xxx私有化(private),同时,提供公共(public)的方法来获取(getXxx)和设置(setXxx)属性值
体现二:不对外展示的方法
体现三:单例模式(将构造器私有化)
体现四:如果不希望类在包外被调用,可以将类设为缺省的。
4.2 Java规定的四种权限修饰符
1.权限修饰符的排序(从小到大):
private < 缺省 < protected < public
2.具体的修饰范围
修饰符 | 类内部 | 同一个包 | 不同包的子类 | 同一个工程 |
---|---|---|---|---|
private | Yes | |||
(缺省) | Yes | Yes | ||
protected | Yes | Yes | Yes | |
public | Yes | Yes | Yes | Yes |
3.说明:
4种权限都可以用来修饰类的内部结构:属性、方法、构造器、内部类。
修饰类的话,只能用:缺省、public
5 类的结构:构造器
5.1 构造器的作用
1.创建对象
2.初始化对象的信息
5.2 使用说明
- 如果没有显式的定义类的构造器的话,系统默认提供一个空参构造器;
- 定义构造器格式:权限修饰符 类名(形参列表){};
- 一个类定义多个构造器,彼此构成重载;
- 一旦我们显式的定义了类的构造器之后,系统不再提供默认的空参构造器;
- 一个类中,至少有一个构造器。
5.3 举例
public class Student {
String name;
int age;
String school;
String major;
public Student(){}
public Student(String n,int a){
name = n;
age = a;
}
public Student(String n,int a,String s){
name = n;
age = a;
school = s;
}
public Student(String n,int a,String s,String m){
name = n;
age = a;
school = s;
major = m;
}
}
6 属性赋值的顺序
- 默认初始化
- 显式初始化
- 构造器初始化
- 通过 对象.方法 或 对象.属性 的方式赋值
以上的先后顺序为:1 - 2 - 3 - 4
7 JavaBean
所谓JavaBean,是指符合如下标准的Java类:
- 类是公共的
- 一个无参的公共的构造器
- 属性,且有对应的get、set方法
8 关键字:this
范围:属性、方法;构造器
理解:this意为当前对象 或 当前正在创建的对象
通常情况下省略"this",当形参与类的属性同名时,则需要使用this.变量的方式声明该变量是属性
8.1 this调用构造器
- 在类的构造器中可以显式的使用 this(形参列表) 方式,调用本类中指定的其他构造器
- 构造器不能用这种方式调用自己
- 如果一个类中有n个构造器,则最多有n-1个构造器使用了该港式
- 规定: **this(形参列表)**必须声明在当前构造器的首行
- 构造器内部,最多只能声明一个 this(形参列表),用来调用其他构造器。
9 关键字:package/import
9.1 package的使用
9.1.1 使用说明
- 为了更好的实现项目中类的管理,提供包的概念
- 使用package声明类或接口所属的包,声明在源文件的首行
- 包,属于标识符,遵循标识符的命名规则、规范
- 每" . "一次就代表一层文件目录。
9.1.2 举例
MVC设计模式: