Java学习(六)面向对象概述、封装
我们来回想一下,这几天我们完成一个需求的步骤:首先是搞清楚我们要做什么,然后在分析怎么做,最后我们再代码体现。一步一步去实现,而具体的每一步都需要我们去实现和操作。这些步骤相互调用和协作,完成我们的需求。在上面的每一个具体步骤中我们都是参与者,并且需要面对具体的每一个步骤和过程,这就是面向过程最直接的体现。
那么什么是面向过程开发呢? 面向过程开发,其实就是面向着具体的每一个步骤和过程,把每一个步骤和过程完成,然后由这些功能方法相互调用,完成需求。
文章目录
一、类和对象概述
概述
- 面向对象特征
封装(encapsulation)
继承(inheritance)
多态(polymorphism) - 举例
举例: 描述学生事物
姓名 , 年龄 , 性别 …
学习 , 吃饭 , 睡觉 …
属性: 就是该事物的描述信息
行为: 就是该事物能够做什么
现实中的事物和类的对应关系
事物 类
属性 ----------------- 成员变量
行为 ----------------- 成员方法
- 定义类的成员(成员变量和成员方法)
a:成员变量 和以前定义变量是一样的,只不过位置发生了改变。在类中,方法外。
b:成员方法 和以前定义方法是一样的,只不过把static去掉,后面在详细讲解static的作用。
- 如何使用类
创建对象使用
格式:类名 对象名 = new 类名();
如何使用成员变量
格式:对象名.变量名
如何使用成员方法
格式:对象名.方法名(...)
成员变量和局部变量的区别
A:在类中的位置不同
成员变量:在类中方法外
局部变量:在方法定义中或者方法声明上
B:在内存中的位置不同
成员变量:在堆内存
局部变量:在栈内存
C:生命周期不同
成员变量:随着对象的创建而存在,随着对象的消失而消失
局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
D:初始化值不同
成员变量:有默认初始化值
局部变量:没有默认初始化值,必须定义,赋值,然后才能使用。
注意事项:: 局部变量名称可以和成员变量名称一样,在方法中使用的时候,采用的是就近原则。
方法的形式参数是类名的时候如何调用
A:Java中参数传递问题
形式参数
基本类型:形式参数的改变不影响实际参数
引用类型:形式参数的改变直接影响实际参数
B:方法的参数是类名
如果你看到了一个方法的形式参数是一个类 类型(引用类型),这里其实需要的是该类的对象。
基本数据类型作为参数传递,属于值传递,传递的是这个变量的值,形参的改变,不影响实参。
引用数据类型作为参数传递,属于引用传递,传递的是地址值,形参的改变,会影响实参。
匿名对象
- 什么是匿名对象
就是没有名字的对象 - 匿名对象的应用场景
a:调用方法,仅仅只调用一次的时候。
b:匿名对象可以作为实际参数传递
二、封装
封装的概述
- 是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
优点
隐藏实现细节,提供公共的访问方式
提高了代码的复用性
提高安全性。
原则:
将不需要对外提供的内容都隐藏起来。
把属性隐藏,提供公共方法对其访问
private关键字
- 特点
a:是一个权限修饰符
b:可以修饰成员变量和成员方法
c:被其修饰的成员只能在本类中被访问 - 应用
(1):把成员变量用private修饰
(2):提供对应的getXxx()和setXxx()方法
this关键字
-
为什么要有this
当我们的局部变量和成员变量相同的时候,如果我们不使用this关键字,那么会导致一个问题:就是局部变量隐藏了成员变量的问题 -
this关键字特点
是当前类的对象引用。
简单的记,它就代表当前类的一个对象。谁调用这个方法,那么该方法的内部的this就代表谁 -
this的应用场景
解决局部变量隐藏成员变量
构造方法
- 构造方法概述和作用
创建对象,给对象中的成员进行初始化 - 构造方法格式特点
a:方法名与类名相同
b:没有返回值类型,连void都没有
c:没有具体的返回值 - 注意事项
a:如果我们没有给出构造方法,系统将自动提供一个无参构造方法。
b:如果我们给出了有参数构造方法,系统将不再提供默认的无参构造方法。
注意:这个时候,如果我们还想使用无参构造方法,就必须自己给出。建议永远自己给出无参构造方法
创建一个对象的步骤
(1):加载Student.class文件进内存
(2):在栈内存为s开辟空间
(3):在堆内存为学生对象开辟空间
(4):对学生对象的成员变量进行默认初始化
(5):对学生对象的成员变量进行显示初始化
(6):通过构造方法对学生对象的成员变量赋值
(7):学生对象初始化完毕,把对象地址赋值给s变量
创建一个对象的内存图
static关键字
- static关键字的特点
a:随着类的加载而加载
b:优先于对象存在
c:被类的所有对象共享
举例:咱们班级的学生应该共用同一个班级编号。
其实这个特点也是在告诉我们什么时候使用静态?
如果某个成员变量是被所有对象共享的,那么它就应该定义为静态的。
举例:
饮水机(用静态修饰)
水杯(不能用静态修饰)
d:可以通过类名调用
其实它本身也可以通过对象名调用。
推荐使用类名调用。
静态修饰的内容一般我们称其为:与类相关的,类成员
- static注意事项
a:在静态方法中是没有this关键字的
如何理解呢?
静态是随着类的加载而加载,this是随着对象的创建而存在。
静态比对象先存在。
b:静态方法只能访问静态的成员变量和静态的成员方法
简单记:静态只能访问静态,非静态可以访问静态的也可以访问非静态的
静态变量和成员变量的区别
A:所属不同
静态变量属于类,所以也称为类变量
成员变量属于对象,所以也称为实例变量(对象变量)
B:内存中位置不同
静态变量存储于方法区的静态区,JDK1.7之后静态变量存储在堆内存中
成员变量存储于堆内存
C:内存出现时间不同
静态变量随着类的加载而加载,随着类的消失而消失
成员变量随着对象的创建而存在,随着对象的消失而消失
D:调用不同
静态变量可以通过类名调用,也可以通过对象调用,推荐使用类名调用
成员变量只能通过对象名调用
静态变量内存图
总结
面向对象概念很多,不要混淆概念,理解记忆,最好结合代码和内存图。