面向对象有三大特征:封装、继承、多态。
封装
何为封装呢?
顾名思义,就是把一堆的东西封起来装到一个东西里面。
封装的优点
为什么要封装呢?
打比如我们的电脑,你觉得我们的电脑零件是暴露在外面好呢,还是装到一个盒子里面好呢。那当然是装到里面好,这样可以避免不必要的损坏。
那我们的程序当然也是封装到一个地方更好。这样更能够避免里面的属性或者方法被频繁的修改。
封装可以被认为是一个保护屏障,防止该类的代码和数据被其他类随意访问。适当的封装可以让代码更容易理解与维护,也加强了代码的安全性。
简而言之,言而简之:封装可以体现出:
- 高内聚:类的内部数据操作细节自己完成,不允许外部干涉。
- 低耦合:仅对外暴露少量的方法和属性用于使用
封装
封装的意义:
- 让使用者只能通过事先预定的方法来访问数据,从而可以在该方法里面加入控制逻辑,限制对成员变量的不合理访问。还可以进行数据检查,从而有利于保证对象信息的完整性。
- 便于修改,提高代码的可维护性。主要说的是隐藏的部分,在内部修改了,如果其对外可以的访问方式不变的话,外部根本感觉不到它的修改。例如:Java8->Java9,String从char[]转为byte[]内部实现,而对外的方法不变,我们使用者根本感觉不到它内部的修改。
private关键字
关键字private,表示私有的。用它修饰的成员(属性或方法)都不能直接在外界访问,只能够在本类中进行访问。
语法格式:
private 变量类型 变量名;
private 方法返回值 方法名(){
}
封装的步骤
想要封装必须防止类的属性或方法被外界直接访问,又根据需要提供一个可以让外界访问的通道。
步骤:
- 变量或者方法的私有化,使用private修饰
- 使用(get、set)方法,给外界一个可以访问的通道
例如:
//属性
private int a;
//方法
public void setA(int a) {
age = a;
}
public int getA() {
return age;
}
提示:当变量比较多的时候,写get/set方法难免比较多,这时可以使用IDEA的话可以使用快捷键Alt+Insert找到getAndset进行创建
this关键字
this解决局部变量与成员变量同名问题
当局部变量与实例变量(非静态成员变量)同名时,在实例变量前面加“this.”
this代表当前对象的引用,即当前被创建的对象
构造器(Constructor)
方法在调用的时候可以往里面传递参数,那么创建一个类的时候可不可以也往里面进行传参呢?
答案是 :当然可以了
我们可以在类中添加一个构造器,new一个对象就相当于在调用new这个类的构造方法。往构造方法里面进行参数的声明,就相当于需要在new对象时传递0个或多个属性的值。
6.6.1 构造器的作用
new对象,并在new对象的时候为实例变量赋值。
6.6.2 构造器的语法格式
语法格式:
【修饰符】 class 类名{
【修饰符】 构造器名(){
// 实例初始化代码
}
【修饰符】 构造器名(参数列表){
// 实例初始化代码
}
}
格式说明:
构造器又称为构造方法,那是因为它长的很像方法。但是和方法还是有所区别的。
- 构造器名必须与它所在的类名必须相同。
- 它没有返回值,所以不需要返回值类型,甚至不需要void
- 构造器的修饰符只能是权限修饰符,不能被其他任何修饰
示例代码:
package com.atguigu.constructor;
public class Student {
private String name;
private int age;
// 无参构造
public Student() {}
// 有参构造
public Student(String name,int age) {
this.name = name;
this.age = age;
}
}
6.6.3 构造器使用注意事项
- 如果你不提供构造器,系统会给出隐藏的无参数构造器,并且该构造器的修饰符默认与类的修饰符相同
- 如果你提供了构造器,系统将不再提供无参数构造器,除非你自己再显示定义。
- 构造器是可以重载的,既可以定义参数,也可以不定义参数。
package com.atguigu.constructor;
public class TestStudent {
public static void main(String[] args) {
//调用无参构造创建学生对象
Student s1 = new Student();
//调用有参构造创建学生对象
Student s2 = new Student("张三",23);
}
}
6.6.4 this调用本类其他构造器
同一个类中,使用this(【实参列表】)
可以实现构造器之间的相互调用。
-
this():调用本类的无参构造
-
this(实参列表):调用本类的有参构造
-
this(【实参列表】)只能出现在构造器内首行
注意:不能出现构造器递归调用