1. 类与对象
1.1面向对象的三条主线
- Java类及类成员: 属性、构造器、方法、代码块、内部类
- 面向对象的三大特征: 封装、继承、多态(抽象)
- 与面向对象相关关键字: this、super、extends、implements、static、final、abstract、interface、package、import
1.2 面向对象与面向过程的理解
面向过程: 强调的是功能行为,以函数为最小单位,考虑怎么做 面向对象: 强调的是具备功能的对象,以类、对象作为最小单位,考虑谁做
1.3 面向对象的两个重要概念
- 类: 对一类事物的描述, 是抽象的、概念上的定义
- 对象: 是实际上存在的该类事物的每个个体, 因而也称为实例
- 面向对象最重要的就是设计类
- 设计类, 就是设计类的成员
1.4 二者的关系
对象: 是类 new出来的,是类的派生 类: 是根据一类事物的描述设计出来的
- 创建类, 设计类的成员
- 创建类的对象
- 通过对象调用类的属性、类的方法
1.5 对象的创建与内存解析
1.6匿名对象的理解
匿名对象: 实际上就是创建类的对象后并没有显示的赋值给一个变量名 特点: 是一次性的,每次创建一个匿名对象就在内存中开辟了一块空间
new Phone().sendEmail();
new Phone().playGame();
new Phone().price = 1999;
new Phone().showPrice();
1.7 理解万事万物皆对象
- 在Java语言中,我们都将功能封装到类中,通过类创建对象,调用类中的功能。
- 涉及到Java语言与前端Html、后端的数据库交互时,前后端的结构在Java层面交互时,都体现为类、对象。
2. 属性
类的设计中,两个重要结构之一: 属性
2.1 属性是什么?
- 属性的结构拆分: 数据类型、变量名、变量值
- 属性的数据类型: 基本数据类型、引用数据类型
- 属性的变量名: 遵守驼峰命名规范、用于给同类型进行赋值、运算
- 属性的变量值: 填充的变量值要与数据类型相匹配
- 按定义位置分类: 成员变量、局部变量
2.2 属性 vs 局部变量
-
相同点:
- 定义格式: 数据类型 变量名 = 变量值
- 先声明,后使用
- 变量都对应其作用域
-
不同点:
- 按类中定义的位置不同:
- 属性: 是在类中的{ }进行定义,作用的范围里自然是在类中都能使用
- 局部变量: 是在类中的方法的{ }定义的,作用范围之内在方法里
- 关于权限修饰符的不同:
- 属性: 能被public、private、缺省、protect进行修饰
- 局部变量: 不能被权限修饰符进行修饰
- 默认初始化值的情况:
- 属性: 定义时可以不用显示初始化值,默认的初始化值为基本数据类型或引用类型的初始化值
- 局部变量: 没有默认初始化值,意味着我们必须显示的初始化变量
- 在内存中加载的位置:
- 属性:加载到堆空间中(非static)
- 局部变量:加载到栈空间
属性分为: 实例变量、类变量
3. 方法
类的设计中,两个重要结构之二: 方法
3.1 什么是方法?
- 方法是类具体要实现功能的体现
- 就像是一个人的类, 具有走路、呼吸、吃饭等功能,这些是用方法进行定义
3.2 创建方法的格式
权限修饰符 修饰符 返回值类型 方法名(参数类型 参数名...){
方法体
return 返回值名
}
3.3 关于权限修饰符:默认方法的权限修饰符先都使用public
- Java规定的4种权限修饰符:private、public、缺省、protected -->封装性再细说
3.4 返回值类型: 返回值 vs 没返回值
- 3.4.1 如果方法返回值,则必须在方法声明时,指定返回值的类型。同时,方法中,需要使用return关键字来返回指定类型的变量或常量:“return 数据”。
- 如果方法没返回值,则方法声明时,使用void来表示。通常,没返回值的方法中,就不需要使用return 但是,如果使用的话,只能“return;”表示结束此方法的意思。
- 3.4.2 我们定义方法该不该返回值?
3.5 方法名:属于标识符,遵循标识符的规则和规范,“见名知意”
- 3.5.1 形参列表: 方法可以声明0个,1个,或多个形参。
- 3.5.2 格式:数据类型1 形参1,数据类型2 形参2,…
- 3.5.3 我们定义方法时,该不该定义形参?
3.6 方法体:方法功能的体现
3.6.1 方法的使用中,可以调用当前类的属性或方法
- 特殊的:方法A中又调用了方法A:递归方法。
- 方法中,不可以定义方法。
3.7 return 关键字
使用范围: 使用在方法体中 作用: ①、针对返回值类型的方法,返回所需要的**类型数据;**②、结束当前方法
4. 方法的重载
4.1 方法重载的概念
- 方法重载: Override
- 即为相同的方法名在同一个类中参数类型不同就构成了重载
- 两同一不同: 相同(方法名、类), 不同(参数类型)
4.2 构成方法的重载的举例
public class MethodOverride {
public void getInfo(int age) {
System.out.println("我的岁数: " + age);
}
public void getInfo(int age, String name) {
System.out.println("我的岁数: " + age);
System.out.println("我的名字: " + name);
}
public void getInfo(String name, int age) {
System.out.println("我的名字: " + name);
System.out.println("我的岁数: " + age);
}
public void getInfo(String name, char gender) {
System.out.println("我的名字: " + name);
System.out.println("我的性别: " + gender);
}
public void getInfo(String name, char gender, int age, double height) {
System.out.println("我的名字: " + name);
System.out.println("我的性别: " + gender);
System.out.println("我的岁数: " + age);
System.out.println("我的身高: " + height);
}
}
public void getInfo(String name, char gender,Object ... obj) {
System.out.println("我的名字: " + name);
System.out.println("我的性别: " + gender);
}
public void getInfo(String name, char gender,Object obj) {
System.out.println("我的名字: " + name);
System.out.println("我的性别: " + gender);
}
4.3 以下是不构成重载的修改:
4.4 如何判断构成方法重载
把握好"两同一不同"的规定,能够清晰的分别重载方法
4.5 如何确定类中某一个方法调用
- 关键点: 方法名、方法名的参数类型
- 通过以上两点确定方法的调用
5. 可变个数形参的方法
5.1 可变个数形参的理解
- 可变个数形参的格式: 参数类型 … 变量名
- 当调用可变个数形参的方法时,传入的参数可以是0个、1个、2个…n个
- 可变个数形参的方法与本类中方法名相同,形参不同的方法之间构成重载
- 可变个数形参的方法与本类中方法名相同,形参类型也相同的数组之间不构成重载。换句话说,二者不能共存。
- 可变个数形参在方法的形参中,必须声明在末尾
- 可变个数形参在方法的形参中,最多只能声明一个可变形参。
5.2 举例说明可变形参
public void show(int i){
}
public void show(String s){
System.out.println("show(String)");
}
public void show(String ... strs){
System.out.println("show(String ... strs)");
for(int i = 0;i < strs.length;i++){
System.out.println(strs[i]);
}
}
6. Java的值传递机制
- 如果变量是基本数据类型,此时赋值的是变量所保存的数据值。
- 如果变量是引用数据类型,此时赋值的是变量所保存的数据的地址值。
6.1 针对于方法的参数概念
形参:方法定义时,声明的小括号内的参数 实参:方法调用时,实际传递给形参的数据
6.3 针对值传递的举例
System.out.println("***********基本数据类型:****************");
int m = 10;
int n = m;
System.out.println("m = " + m + ", n = " + n);
n = 20;
System.out.println("m = " + m + ", n = " + n);
System.out.println("***********引用数据类型:****************");
Order o1 = new Order();
o1.orderId = 1001;
Order o2 = o1;
System.out.println("o1.orderId = " + o1.orderId + ",o2.orderId = " +o2.orderId);
o2.orderId = 1002;
System.out.println("o1.orderId = " + o1.orderId + ",o2.orderId = " +o2.orderId);
7. 封装性
7.1 为什么要引入封装性
引入: 我们程序设计最求"高内聚,低耦合"
-
高内聚: 类的内操作数据有自身完成,不允许有外部干涉 -
低耦合: 进对外暴露少量的方法用于使用 隐藏类内部的复杂性,仅对外暴露少量的接口,从而提高程序的可扩展性、可维护性 这就是对封装性的体现,把该隐藏的隐藏起来,把该暴露的暴露出去 -
封装性问题: 当我们创建一个类的时候,在通过对象调用该类的属性时,除了类型限制之外,并没有任何其他的限制,当然我们是需要对一个类的属性赋值时进行限制,但仅在类声明的属性中是做不到的 -
所以就有了使用方法对属性进行调用,从而在方法体内进行一些限制 -
而我们有必要让用户不能直接在外部调用属性,使用private修饰符对属性进行修饰,这里就体现了权限修饰符的好处
7.2 封装性具体代码的体现
- 体现一: 通过私有化(private)对属性进行修饰,同时,提供对属性的获取(get)和设置(set)的共有(public)方法
- 体现二: 不对外暴露私有的方法,仅对类内部使用
- 体现三:单例模式(将构造器私有化)
- 体现四:如果不希望类在包外被调用,可以将类设置为缺省的。
7.3 Java规定的4种权限修饰符
权限又大到小: public < protect < 缺省 < private
具体的使用范围: 权限修饰符可用来修饰的结构说明:
- 4种权限都可以用来修饰类的内部结构:属性、方法、构造器、内部类修饰类的话,只能使用:缺省、public
8. 构造器
8.1 什么是构造器
- 在实例对象时,调用的相当于是构造器里面的参数
- 构造器是类中独有的方法,它没有返回值类型
- 构造器能够被重载
8.2 构造器的作用
- 创建对象
- 初始化对象的属性
说明:
- 如果没有显示的定义构造器的话,那么隐式的构造器为空参构造器
- 定义构造器的格式: 权限修饰符 类名(参数类型 变量名){};
- 一个类中定义多个构造器,彼此构成重载
- 如果显示的定义的带参构造器,系统的不会在提供空参构造器
- 一个类中至少有一个构造器
8.3 构造器举例
public class ConstructorTest {
String name;
int age;
char gender;
public ConstructorTest(){
}
public ConstructorTest(String name,int age,char gender){
this.name = name;
this.age = age;
this.gender = gender;
}
public ConstructorTest(String name,int age){
this.name = name;
this.age = age;
}
}
8.4 属性赋值的先后顺序
①默认初始化、②显示初始化、③构造器初始化、④通过对象.属性与对象.方法赋值 排序在最后的赋值输出在控制台上
8.5 JavaBean的概念
所谓JavaBean是符合标准的Java类:
- 类是公共的
- 提供对应属性的get/set方法
- 一个空参构造器
- 实现了序列化、声明了独有序列化UID的常量
9. 关键字 this
- 可以调用的结构:属性、方法;构造器
- this调用属性、方法:
- this理解为:当前对象 或 当前正在创建的对象
在类的方法中,我们可以使用"this.属性"或"this.方法"的方式,调用当前对象属性或方法。但是,通常情况下,我们都择省略"this."。特殊情况下,如果方法的形参和类的属性同名时,我们必须显式的使用"this.变量"的方式,表明此变量是属性,而非形参
this调用构造器:
- 我们在类的构造器中,可以显式的使用"this(形参列表)"方式,调用本类中指定的其他构造器
- 构造器中不能通过"this(形参列表)"方式调用自己
- 如果一个类中有n个构造器,则最多有 n - 1构造器中使用了"this(形参列表)"
- 规定:"this(形参列表)"必须声明在当前构造器的首行
- 构造器内部,最多只能声明一个"this(形参列表)",用来调用其他的构造器
|