面向对象之封装
定义:影藏事物的属性和实现的细节,仅对外提供公共的访问方式
封装的好处:
1.隐藏了事物的细节
2.提高了代码的复用性
3.提高了安全性
封装的实现:
使用private关键字进行修饰,被private修饰的成员只能在本类中使用
Setter和Getter
封装需要搭配set和get方法
set(设置器)没有返回值,但有参数
get(获取器)需要返回值,但没有参数
例 封装一个学生类
//学生类
public class Student{
//封装姓名
private String name;
//封装成绩
private int score;
//通过构造方法设置值
public Student(String name, int score) {
this.name = name;
this.score = score;
}
//通过获取器获得姓名
public String getName() {
return name;
}
//通过设置器设置姓名
public void setName(String name) {
this.name = name;
}
//通过获取器获得成绩
public int getScore() {
return score;
}
//通过设置器设置成绩
public void setScore(int score) {
this.score = score;
}
}
//测试类
public class test {
public static void main(String[] args) {
//创建学生对象,并设置初始值
Student s=new Student("张三",100);
//获取属性
//未封装的获取方式,这里因为进行过封装所以不能直接获取到值
同样也不能通过这种方式设置值
//String str=s.name;
//需要通过获取器获取
String str=s.getName();
}
属性的初始化顺序
1.将类加载到方法区
2.在堆内存中开辟空间,放入新建对象
3.在栈内存中开辟空间,放对象的引入
4.对象中的属性执行默认初始化
5.对象中的属性进行显示初始化
6.构造方法初始化
7.将对象地址赋值给对象引用
静态
静态属性的特点和作用
1.静态属性是本类所有对象公用的,静态属性只会初始化一次
2.不需要有对象,可以直接通过类名调用
注:静态属性在类被加载的时候,进行初始化
静态属性或静态方法,都可以通过类名调用,也可以通过对象名调用,建议直接通过类名调用
在静态方法或者静态代码块中不可以使用非静态属性,或非静态方法
非静态属性和非静态方法都可通过this调用,所以静态方法中不允许出现this关键词
静态属性和非静态属性的区别
1.修饰符不同
静态属性使用static修饰
非静态不使用static修饰
2.所属不同
静态属性属于类
非静态属于对象
3.存储内存空间不一样
静态属性存储在方法区中的静态区域
非静态属性和对象一起存储在堆内存
4.初始化时间不一样
静态属性在类被加载的时候初始化一次
非静态属性每创建一个对象就会进行初始化(默认,显示,构造方法)
5.访问方式不同
静态属性可以通过类名和对象名访问
非静态属性只能通过对象名访问
代码块
使用大括号包裹的一段代码就是代码块
种类:局部代码块 构造代码块 静态代码块 同步代码块
1.局部代码块
位置:写在方法中
作用:主要用于限定变量的生命周期
2.构造代码块
位置:类中,方法之外
作用:为属性赋值
注 :和属性的显示初始化时间一样,谁在前就先执行谁
3.静态代码块
位置:类中,方法之外
作用:给类中的静态属性初始化,用于只需要执行一次的代码
注 :静态代码块和静态属性一样,都是在类被加载的时候执行,而且只执行一次
静态代码块中不可以使用非静态成员
和静态属性初始化执行时间相同,谁在前就先执行谁