1 封装
定义:将数据和操作数据有机的结合 隐藏对象的属性和实现细节,反对对外公开接口和对象进行交互 封装最主要的功能就是我们能修改自己的实现代码,而不用修改那些调用我们代码的程序片段。 适当的封装可以让程序码更容易理解和维护,也加强了程序码的安全性
1.1 封装的优点
- 良好的封装能减少耦合
- 内部结构可以自主修改
- 可以对成员变量进行更精确的控制
- 颖仓信息,实现细节
1.2 实现Java封装的步骤
1.修改属性的可见性来限制对属性的访问 对每个值属性提供对外的公共方法访问。用于对私有属性的访问
public 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关键字是为了解决实例变量和局部变量制碱法生同名的冲突
1.3 Java 封装类的例子
public class EncapTest{
private String name;
private String idNum;
private int age;
public int getAge(){
return age;
}
public String getName(){
return name;
}
public String getIdNum(){
return idNum;
}
public void setAge( int newAge){
age = newAge;
}
public void setName(String newName){
name = newName;
}
public void setIdNum( String newId){
idNum = newId;
}
}
以上实例中public方法是外部类访问该类成员变量的入口。
通常情况下,这些方法被称为getter和setter方法。
因此,任何要访问类中私有成员变量的类都要通过这些getter和setter方法。
在Java中,getter和setter是两种常规方法,用于检索和更新变量的值。 以下代码是带有私有变量和几个getter / setter方法的简单类的示例: 该类声明一个私有变量number。 由于number是私有的,因此此类外部的代码无法直接访问该变量。
1.4 访问限定符
类可以将数据以及封装数据的方法结合在一起 而访问限制符用来控制哪些方法或者属性需要在类外直接使用。 pubic:理解为公共 default:理解为 “家丑” private:只有自己知道 protected: 主要用于继承
public class computer{
private String cpu;
private String memory;
public String screen;
String brand;
public Computer(String brand, String cpu, String memory, String screen) {
this.brand = brand;
this.cpu = cpu;
this.memory = memory;
this.screen = screen;
}
public void Boot(){
System.out.println("开机~~~");
}
public void PowerOff(){
System.out.println("关机~~~");
}
public void SurfInternet(){
System.out.println("上网~~~");
}
}
public class TestComputer {
public static void main(String[] args) {
Computer p = new Computer("HW", "i7", "8G", "13*14");
System.out.println(p.brand);
System.out.println(p.screen);
}
}
一般情况下成员变量设置为 private,成员方法设置为public。
2.static
2.1 static修饰成员变量
static修饰的成员变量,称为静态成员变量,静态成员变量最大的特性:不属于某个具体的对象,是所有对象所共享的
静态成员变量特性
- 不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中
- 既可以通过对象访问,也可以通过类名访问,但一般更推荐使用类名访问
- 生命周期伴随类的一生
2.2 static修饰成员的方法
被static修饰的成员方法称为静态成员方法,是类的方法,不是某个对象所特有的 静态方法特性
- 不属于某个具体的对象,是类方法
- 可以通过对象调用,也可以通过类名,静态方法名(…)
- 静态方法没有隐藏的this引用参数
- 静态方法中不能调用任何非静态方法
2.3 static成员变量初始化
** 分为就地初始化和静态代码块初始化** 1.就地初始化 就地初始化指的是:在定义直接给出初始值
private static String classRoom = "Bit306";
2.静态代码块初始化
3.代码块
3.1 代码块概念以及分类
使用{}定义的一段代码称为代码块
- 普通代码块
- 构造块
- 静态块
- 同步代码块
3.2普通代码块 定义在方法中的代码块
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);
}
}
3.3 构造代码块 实例代码块 构造代码块一般用于初始化实例成员变量
class CodeBlock {
{
int number1 = 10;
System.out.println("number1: " + number1);
}
public CodeBlock() {
System.out.println("这是构造方法");
}
{
int number2 = 100;
System.out.println("number2: " + number2);
}
}
3.4 静态代码块 使用static定义的代码块称为静态代码块,一般用于初始化静态成员变量
static {
classRoom = "bit306";
System.out.println("I am static init()!");
}
1.静态代码块不管生成多少个对象,其只会执行一次 2.静态成员变量是类的属性,因此是在JVM加载类时开辟空间并初始化的 3.如果一个类中包含多个静态代码块,在编译代码时,编译器会按照定义的先后次序依次合并,最终放在生成的<>方法中,该方法在类加载时调用,并且只调用一次。 4.实例代码块只有在创建对象时才会执行。
构造代码块与构造函数的区别:构造代码块是给所有对象进行统一初始化,而构造函数是给对应的对象初始化,因为构造函数是可以多个的,运行哪个构造函数就会建立什么样的对象,但无论建立哪个对象,都会先执行相同的构造代码块。 也就是说,构造代码块中定义的是不同对 共性的初始化内容
代码块初始化时机:构造代码块在实例对象创建时进行初始化;静态代码块在类加载时进行初始化。
代码块执行顺序:静态代码块 ==> main()方法 ==> 构造代码块 ==> 构造方法 ==> 局部代码块 。
|