什么是封装?
- 通过该类提供的方法来实现对隐藏信息的操作和访问
- 隐藏对象的信息
- 留出访问的接口
封装的优点
- 良好的封装能减少耦合
- 类内部的结构可以自由修改
- 可以对成员变量进行更精确的控制
- 隐藏信息,实现细节
实现Java封装的步骤
隐藏对象
修改属性的可见性——设置为 private
1
2
3
4public class Person{
private String name;
private int age;
}这段代码中,将 name 和 age 属性设置为私有的,只有本类才能访问,其他类都访问不了,如此就对信息进行了隐藏。
留出接口
创建 getter / setter 方法——设置为 public 用于属性的读写
在 getter / setter 方法中加入属性控制语句——对属性值的合法性进行判断
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20public class Person{
private String name;
private int age;
public int getAge(){
return age;
}
public String getName(){
return name;
}
public void setAge(int age){
this.age = age;
}
public void setName(String name){
this.name = name;
}
}采用 this 关键字是为了解决实例变量(private String name)和局部变量(setName(String name)中的name)之间发生的同名的冲突。
包
作用
- 管理 Java 文件
- 解决同名文件冲突
定义包
语法:package 包名;
注意:
1.必须放在 Java 源文件中的第一行
2.一个 Java 源文件中只能有一个 package 语句
3.包名全部英文小写
4.命名方式:域名倒序 + 模块 + 功能
eg:package com.nuc.zigbee;
导入包
语法:
import 包名.类名;
eg:
import com.nuc.*;
import com.nuc.zigbee;
常用系统包
java.lang 包含 Java 语言基础的类
java.util 包含 Java 语言中的各种工具类
java.io 包含输入、输出相关功能的类
static 关键字
static 翻译为静态,从面向对象的角度讲,当一个类中的变量或方法用 static 修饰时,这些变量和方法就成了类本身的,他们和对象的关系并不大。但是从直观的角度讲,这些被修饰的量确实被该类所有对象所拥有,并且被这个类的所有对象所共享,求其是当使用该类对象进行引用他们时。其实当使用对象进行引用 static 修饰成员时,在底层代码的实现中,其实还是转换为类名进行引用,这表明这个成员属于类。
- static + 属性——静态属性、类属性
- static + 方法——静态方法、类方法
- static + 类——不存在,不能加载类前
- static + 方法内局部变量——不能加载局部变量前
- static + 代码块——静态代码块
代码块
- 通过{}可以形成代码块
- 方法内的代码块称为:普通代码块
- 类内的代码块称为:构造代码块
- 构造代码块前 + static:静态代码块
注意
- 初学这个关键字时,书上有个重点,那就是一个类中, static 修饰的成员不能访问势力成员,只能访问静态成员。这个很好理解,static 修饰的成员叫做类成员,属于类本身的属性,随着类的编译进行初始化,而此时实例成员未必进行初始化,这就会带来很多错误,所以类成员访问实例成员是不能通过编译的。
- 静态方法中不可以定义 this,super 关键字,因为静态元素优先于对象存在。
静态成员的声明周期
静态成员随着类的加载而产生,销毁时释放,生命周期伴随着类的整个的生命周期,生命周期长,这就意味着对内存资源的占用也会相对比较长。
静态方法中的成员调用
- 可以直接调用同类中的静态成员。
- 不可以直接调用同类中的非静态成员。
- 只能通过对象实例化后,对象.成员方法 的方式访问非静态成员。
各种代码块的执行顺序
无论实例产生多少对象,静态代码块只执行一次。
构造代码块在每次对象构造的时候调用。
方法中的普通代码块则是在每次调用方法的时候顺序调用。
什么时候定义静态变量
当对象中出现共享数据时,该数据被修饰成静态,对象中的特有数据,修饰为非静态,存在于堆内存中。
什么时候定义静态方法
当功能内部没有访问到非静态数据(对象中特有的数据),该函数可以定义为静态的。