一、面向对象的理解与类的实例化
1.面向对象内容的三条主线:
-
Java类及类的成员:(重点)属性、方法、构造器;(熟悉)代码块、内部类
-
面向对象的特征:封装、继承、多态、(抽象)
-
其他关键字的使用:this、super、package、import、static、final、interface、abstract等
2.面向过程编程(POP) vs 面向对象编程(OOP)
2.1 简单的语言描述二者的区别
面向过程:
-
以
函数
为组织单位。 一种“执行者思维
”,适合解决简单问题。扩展能力差、后期维护难度较大。
面向对象:
-
以
类
为组织单位。每种事物都具备自己的属性
和行为/功能
。 种“设计者思维
”,适合解决复杂问题。代码扩展性强、可维护性高。
2.2 二者关系:
我们千万不要把面向过程和面向对象对立起来。他们是相辅相成的。面向对象离不开面向过程!
3.面向对象核心概念
面向对象编程的两个核心概念:类(Class)、对象(Object) 谈谈对这两个概念的理解? 类:具有相同特征的事物的抽象描述,是抽象的
、概念上的定义。 对象:实际存在的该类事物的每个个体
,是具体的
,因而也称为实例(instance)
。
4.类的声明与使用
4.1 体会:设计类,其实就是设计类的成员
class Person{
}
4.2 类的内部成员一、二:
成员之一:属性、成员变量、field(字段、域) 成员之二:(成员)方法、函数、method
4.3 类的实例化
等价描述:类的实例化 <=> 创建类的对象 <=> 创建类的实例 格式:类类型 对象名 = 通过new创建的对象实体 举例: Phone p1 = new Phone(); Scanner scan = new Scanner(System.in); String str = new String();
5.面向对象完成具体功能的操作的三步流程(非常重要)
步骤1:创建类,并设计类的内部成员(属性、方法) 步骤2:创建类的对象。比如:Phone p1 = new Phone(); 步骤3:通过对象,调用其内部声明的属性或方法,完成相关的功能
二、类的实例化剖析、内存解析
1.对象在内存中的分配涉及到的内存结构(理论)
-
栈(stack): 方法内定义的变量,存储在栈中。
-
堆(heap) : new 出来的结构(比如:数组实体、对象的实体)。包括对象中的属性
-
方法区(method area) : 存放类的模板。比如:Person类的模板
2.类中对象的内存解析
2.1 创建类的一个对象
2.2 创建类的多个对象
强调1:创建了Person类的两个对象 Person p1 = new Person(); Person p2 = new Person();
说明:创建类的多个对象时,每个对象在堆空间中有一个对象实体。每个对象实体中保存着一份类的属性。 如果修改某一个对象的某属性值时,不会影响其他对象此属性的值。 p1.age = 10;
p2.age = 20;
p1.age = 30; System.out.println(p2.age);//20
强调2:声明类的两个变量 Person p1 = new Person(); Person p3 = p1;
说明:此时的p1,p3 两个变量指向了堆空间中的同一个对象实体。(或p1,p3保存的地址值相同) 如果通过其中某一个对象变量修改对象的属性时,会影响另一个对象变量此属性的值。
p1.age = 10; p3.age = 20; System.out.println(p1.age);//20
三、类的成员
类的成员之一:属性
1.变量的分类:
-
角度一:按照数据类型来分:基本数据类型(8种)、引用数据类型(数组、类、接口、枚举、注解、记录)
-
角度二:按照变量在类中声明的位置的不同:成员变量(或属性)、局部变量(方法内、方法形参、构造器内、构造器形参、代码块内等)
2.属性的几个称谓:成员变量、属性、field(字段、域)
3.区分成员变量 vs 局部变量
3.1 相同点:
变量声明的格式相同:数据类型 变量名 = 变量值 变量都有其有效的作用域。出了作用域,就失效了。 变量必须先声明,后赋值,再使用。
3.2 不同点: ① 类中声明的位置的不同: 属性:声明在类内,方法外的变量 局部变量:声明方法、构造器内部的变量
② 在内存中分配的位置不同(难): 属性:随着对象的创建,存储在堆空间中。 局部变量:存储在栈空间中
③ 生命周期: 属性:随着对象的创建而创建,随着对象的消亡而消亡。 局部变量:随着方法对应的栈帧入栈,局部变量会在栈中分配;随着方法对应的栈帧出栈,局部变量消亡。
④ 作用域: 属性:在整个类的内部都是有效的 局部变量:仅限于声明此局部变量所在的方法(或构造器、代码块)中
⑤ 是否可以有权限修饰符进行修饰:(难) 都有哪些权限修饰符:public、protected、缺省、private。(用于表明所修饰的结构可调用的范围的大小)
属性,是可以使用权限修饰符进行修饰的。而局部变量,不能使用任何权限修饰符进行修饰的。
⑥ 是否有默认值:(重点) 属性:都有默认初始化值 意味着,如果没有给属性进行显式初始化赋值,则会有默认初始化值。
局部变量:都没有默认初始化值。 意味着,在使用局部变量之前,必须要显式的赋值,否则报错。
注意:对于方法的形参而言,在调用方法时,给此形参赋值即可。
类的成员之二:方法(method)
1.使用方法的好处
方法的理解:方法
是类或对象行为特征的抽象,用来完成某个功能操作。 方法的好处:实现代码重用,减少冗余,简化代码
2.使用举例
-
Math.random()的random()方法
-
Math.sqrt(x)的sqrt(x)方法
-
System.out.println(x)的println(x)方法
-
new Scanner(System.in).nextInt()的nextInt()方法
-
Arrays类中的binarySearch()方法、sort()方法、equals()方法
3.声明举例
public void eat() public void sleep(int hour) public String interests(String hobby) public int getAge()
4.方法声明的格式 (重要)
权限修饰符 [其它修饰符] 返回值类型 方法名(形参列表) [throws 异常类型]{ //方法头 //方法体 }
5.具体的方法声明的细节
5.1 权限修饰符 ① Java规定了哪些权限修饰符呢?
有四种:private \ 缺省 \ protected \ public
5.2 返回值类型:描述当调用完此方法时,是否需要返回一个结果。 分类: > 无返回值类型:使用void表示即可。比如:System.out.println(x)的println(x)方法、Arrays的sort() > 有具体的返回值类型:需要指明返回的数据的类型。可以是基本数据类型,也可以引用数据类型 > 需要在方法内部配合使用"return + 返回值类型的变量或常量" 比如:Math.random()、new Scanner(System.in).nextInt()等 [经验]我们在声明方法时,要不要提供返回值类型呢? > 根据方法具体实现的功能来决定。换句话说,具体问题具体分析 > 根据题目要求
5.3 方法名:属于标识符。需要满足标识符的规定和规范。“见名知意”
5.4 形参列表:形参,属于局部变量,且可以声明多个。 格式:(形参类型1 形参1,形参类型2 形参2,...) 分类:无形参列表 、 有形参列表 > 无形参列表:不能省略一对()。比如:Math.random()、new Scanner(System.in).nextInt() > 有形参列表:根据方法调用时,需要的不确定的变量的类型和个数,确定形参的类型和个数。 比如:Arrays类中的binarySearch()方法、sort()方法、equals()方法
[经验]我们在声明方法时,是否需要形参列表呢? > 根据方法具体实现的功能来决定。换句话说,具体问题具体分析 > 根据题目要求
5.5 方法体: 当我们调用一个方法时,真正执行的代码。体现了此方法的功能。
6.注意点
Java里的方法不能独立存在
,所有的方法必须定义在类里。 Java中的方法不调用,不执行。每调用一次,就执行一次。 方法内可以调用本类中的(其它)方法或属性 方法内不能定义方法。
7.关键字:return
7.1 return的作用
-
作用1:结束一个方法
-
作用2:结束一个方法的同时,可以返回数据给方法的调用者 (方法声明中如果有返回值类型,则方法内需要搭配return使用)
7.2 使用注意点: return后面不能声明执行语句。
8.形参实参:
-
形参:方法在声明时,一对()内声明的一个或多个形式参数,简称为形参。
-
实参:方法在被调用时,实际传递给形参的变量或常量,就称为实际参数,简称实参。
四、对象数组
1.何为对象数组?如何理解? 数组的元素可以是基本数据类型,也可以是引用数据类型。当元素是引用类型中的类时,我们称为对象数组。
2.举例: String[],Person[],Student[],Customer[]等