概念
在面向对象中,封装是指对于某个对象,Java隐藏对象的属性和方法的实现细节,仅对外公开接口,控制在程序中属性的读取和修改的访问级别。适当的封装可以让程式码更 容易理解与维护。
优点
-
良好的封装能够减少耦合。
-
类内部的结构可以自由修改。
-
可以对成员变量进行更精确的控制。
-
隐藏信息,实现细节。
对于想要实现的操作,一个类已经将其封装好,你只需调用方法即可,这正是面向对象中的精髓。
通过封装使一部分成员充当类与外部的接口,而将其他的成员隐藏起来,这样就达到了对成员访问权限的合理控制,使不同类之间的相互影响减少到最低限度,进而增强数据的安全性和简化程序的编写工作。
访问限定符
Java中主要通过类和访问权限来实现封装:类可以将数据以及封装数据的方法结合在一起,更符合人类对事物的认知,而访问权限用来控制方法或者字段能否直接在类外使用。Java中提供了四种访问限定符:
default是表示不写修饰符,默认,不能显示的在程序中使用default修饰。
封装的必要性
public class TestPrivate2 {
public static void main(String[] args) {
Student s = new Student();
s.sno = 1;
System.out.println(s.sno);
s.study();
s.eat();
s.sleep();
s.setName("张三");
s.setSubject("Java");
System.out.println(s.getName());
System.out.println(s.getSubject());
}
}
//1.定义类描述学生这一类型Student
class Student {
int sno;// 学号
// 将name 和 subject 属性进行隐藏,不让外部访问
private String name;// 姓名
private String subject;// 科目
// 提供getter 和 setter 接口给外部访问
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public void study() {
System.out.println("学习");
}
public void eat() {
System.out.println("吃饭");
}
public void sleep() {
System.out.println("睡觉");
}
}
代码块
使用 {} 定义的一段代码称为代码块。
普通代码块
- 定义在方法中的代码块
public class Main {
public static void main(String[] args) {
{
int x = 10;
System.out.println("x1 = " + x);
}
int x = 100;
System.out.println("x2 = " + x);
}
}
// 执行结果
// x1 = 10
// x2 = 100
构造块
定义在类中的代码块,也叫作实例代码块。构造代码块一般用于初始化实例成员变量。
class Student {
//实例成员变量
private String name;
private String gender;
private int age;
private double score;
public Student() {
System.out.println("I am Student init()!");
}
//实例代码块
{
this.name = "zhangsan";
this.age = 12;
this.gender = "man";
System.out.println("I am instance init()!");
}
public void show() {
System.out.println("name: " + name + " age: " + age + " sex: " + gender);
}
}
public class Main {
public static void main(String[] args) {
Student stu = new Student();
stu.show();
}
}
/*
执行结果
I am instance init()!
I am Student init()!
name: zhangsan age: 12 sex: man
*/
静态块
使用static定义的代码块称为静态代码块。一般用于初始化静态成员变量。
public class Student {
private String name;
private String gender;
private int age;
private double score;
private static String classRoom;
//实例代码块
{
this.name = "bit";
this.age = 12;
this.gender = "man";
System.out.println("I am instance init()!");
}
// 静态代码块
static {
classRoom = "bit306";
System.out.println("I am static init()!");
}
public Student() {
System.out.println("I am Student init()!");
}
public static void main(String[] args) {
Student s1 = new Student();
Student s2 = new Student();
}
}
/*
执行结果
I am static init()!
I am instance init()!
I am Student init()!
I am instance init()!
I am Student init()!
*/
注:
- 静态代码块不管生成多少个对象,其只会执行一次
- 静态成员变量是类的属性,因此是在JVM加载类时开辟空间并初始化的
- 如果一个类中包含多个静态代码块,在编译代码时,编译器会按照定义的先后次序依次执行(合并)
- 实例代码块只有在创建对象时才会执行