【Java基础篇】封装(Encapsulation)
1. 封装含义
是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
- 好处:
- 将变化隔离。
- 便于使用。
- 提高重用性。
- 提高安全性。
- 封装原则:
- 将不需要对外提供的内容都隐藏起来。
- 把属性都隐藏,提供公共方法对其访问。
2. private(私有)关键字
- private关键字:
- 是一个权限修饰符。
- 用于修饰成员(成员变量和成员函数)
- 被私有化的成员只在本类中有效。
- 常用之一:
- 将成员变量私有化,对外提供对应的set ,get 方法对其进行访问。
- 提高对数据访问的安全性。
注意: 私有仅仅是封装的一种表现形式。之所以对外提供访问方式,就因为可以在访问方式中加入逻辑判断等语句。对访问的数据进行操作。提高代码健壮性
3. 构造函数
3.1 什么是构造函数
- 构造函数(Constructor)是一个特殊的函数。
- 函数名和类名相同
- 没有返回值类型。注意:没有返回值类型不等同于
void
,void
也是一种返回值类型。不能使用return
关键字返回任何值。 - 在使用
new
关键字创建对象之后自动调用
3.2 构造函数的重载
构造函数的重载和普通函数相同,函数名相同,参数列表不同即可。
3.3 构造函数的调用
- 构造函数在
new
关键字创建对象时调用 - 构造函数可以在该类其他构造函数的第一个语句使用
this
关键字调用。
3.4 构造函数的访问权限
- 在定义构造函数时,如无特殊需要,应使用public关键字修饰构造函数。
- 在一些特定情况下,我们不想让别人创建该类对象,那么可以使用
private
修饰构造函数,例如单例设计模式。
3.4 构造函数的作用
可以用于给对象进行初始化。
3.5 构造函数的小细节
1、当一个类中没有定义构造函数时,那么系统会默认给该类加入一个空参数的构造函数。当在类中自定义了构造函数后,默认的构造函数就没有了。
2、构造函数和一般函数在写法上有不同。在运行上也有不同。构造函数是在对象一建立就运行。给对象初始化。而一般方法是对象调用才执行,是给对象添加对象具备的功能。一个对象建立,构造函数只运行一次。而一般方法可以被该对象调用多次。
3、什么时候定义构造函数呢?
- 当分析事物时,该事物存在具备一些特性或者行为,那么将这些内容定义在构造函数中。
4 构造代码块{ }
A. 作用:
1、 给对象进行初始化。对象一建立就运行,而且优先于构造函数执行。
2、和构造函数的区别:
- 构造代码块是给所有对象进行统一初始化,而构造函数是给对应的对象初始化。
- 构造代码块的作用:它的作用就是将所有构造方法中公共的信息进行抽取。
B. 构造代码块要注意的细节:
1、构造函数的代码是位于成员变量的显式初始化语句、构造代码块语句之后执行的。更符合
2、成员变量的显式初始化语句与构造代码块的语句的先后执行顺序是按照当前代码的顺序执行的。
3、成员变量的初始化语句和构造代码块的代码其实是在构造函数中完成的。
5 this关键字
特点:this关键字代表的是所属函数的调用者对象
问题: 存在着同名的成员变量与局部变量时,在方法内部默认是访问局部变量的数据,如何才能访问成员变量呢?
this关键字的作用:
-
一个类存在着同名的成员变量与局部变量时,在方法内部默认是访问局部变量的数据,我们可以通过this关键字指定访问成员变量的数据。
-
this关键字可以在构造函数中调用其他的构造函数初始化对象使用。
this关键字要注意的细节:
- 如果在一个函数中访问一个成员变量,而且没有存在同名的局部变量时,那么java编译器会默认在变量的前面加上this关键字的。
- this关键字调用其他的构造函数时,this语句必须 位于构造函数中的第一个语句。
- this关键字调用构造函数的时候不准出现相互调用的情况,因为是一个死循环的调用方式。
6 super关键字
super关键字代表的是父类的引用空间。
super关键字的作用:
- 如果子父类存在着同名的成员时,在子类中默认是访问子类的成员,可以通过super关键字指定访问父类的成员。
- 创建子类对象时,默认会先调用父类无参的构造函数, 通过super关键字可以在子类的构造函数中指定调用父类的构造函数。
super调用父类的构造函数要注意的细节:
- super关键字调用构造函数的时候,必须是构造函数中的第一个语句。
- super、this关键字调用调用构造函数的时候,不能同时出现在同一个构造函数。(因为两个都需要是第一个语句)
7. static关键字
注意: 静态函数不能出现this以及super关键字。
原因: 因为静态函数可以使用类名直接调用,而这时候可能还没有对象存在,this又要代表当前对象
1、static特点
- 随着类的加载而加载,静态会随着类的加载而加载,随着类的消失而消失。说明它的生命周期很长。
- 优先于对象存在。静态是先存在,对象是后存在。
- 被所有实例(对象)所共享。
- 可以直接被类名调用
2、静态变量(类变量)和实例变量的区别:
- 存放位置
- 类变量随着类的加载而加载存在于方法区中.
- 实例变量随着对象的建立而存在于堆内存中.
- 生命周期
- 类变量生命周期最长,随着类的消失而消失
- 实例变量生命周期随着对象的消失而消失.
3、静态优缺点
- 优点:对对象的共享数据进行单独空间的存储,节省空间 例如Person 都有国籍。该数据可以共享可以被类名调
- 缺点:生命周期过长访问出现局限性。(静态只能访问静态)
4、什么时候定义静态变量:
静态变量(类变量)当对象中出现共享数据;例如:学生的学校名称。学校名称可以共享。对象的数据要定义为非静态的存放在对内存中(学生的姓名,学生的年龄)
5、 什么时候定义静态函数:如果功能内部没有访问到非静态数据(对象的特有数据。那么该功能就可以定义为静态)
6、非静态的成员变量与静态成员变量的区别
- 数量上的区别:
- (n份)非静态成员变量是在每个对象中都维护一份数据
- (1份)静态成员变量只会在方法中维护一份数据。
- 访问方式上的区别:
- 非静态的成员变量只能使用对象进行访问.
- 静态成员变量可以使用对象、类名进行访问。
- 存储位置上的区别;
- 非静态成员变量是存储在堆内存中。
- 静态成员变量是存储在方法区中。
- 命周期的区别:
- 非静态成员变量是随着对象的创建而存在,随着对象的消失而消失。
- 静态成员变量是随着类文件的加载而存在,随着类文件(字节码文件)的消失而消失。
- 作用上的区别:
- 非静态成员变量的作用是用于描述一类事物的属性。
- 静态成员变量的作用是提供一个共享数据给所有对象使用的。
8. 类的执行顺序(对象初始化过程)
- 类内容(静态变量,静态初始化块) => 实例内容(变量,初始化块,构造器)
- 父类的(静态变量,静态初始化块) => 子类的(静态变量,静态初始化块) => 父类的(变量,初始化块,构造器) => 子类(变量,初始化块,构造器)
9. main方法是静态的
public static void main(String[] args)
public
保证该类在任何情况下,jvm都对其方法可见static
被jvm
调用,不用创建对象,直接类名访问。void
被jvm
调用,不需要给jvm返回值。main
一个通用名称,虽然不是关键字,但是被jvm识别String[] args
以前用于接收键盘录入的
10. instanceof关键字
- 作用:判断一个对象是否属于指定的类型。(什么实例属于什么)
- instanceof关键字的使用前提: 判断的对象与指定的类型必须存在继承的关系,或者是实现的关系。
- instanceof关键字的使用格式:对象 instanceof 类名
11. final(最终)
1、final关键字要注意的细节 :
- final关键字修饰一个基本类型变量时, 该变量不能重新赋值。
- final关键字修饰一个引用类型变量时,其引用重新指向新的对象。
- final修饰一个方法时,该方法不能被重写。
- final修饰一个类的时候,该类不能被继承。
2、 常量的修饰符: public static final.
3、常量命名规范: 所有字母大写,单词与单词之间使用下划线分隔 。