封装

  • 1 封装
  • 1.1 封装的优点
  • 1.2 实现Java封装的步骤
  • 1.3 Java 封装类的例子
  • 1.4 访问限定符
  • 2.static
  • 2.1 static修饰成员变量
  • 2.2 static修饰成员的方法
  • 2.3 static成员变量初始化
  • 3.代码块
  • 3.1 代码块概念以及分类


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 访问限定符

类可以将数据以及封装数据的方法结合在一起 而访问限制符用来控制哪些方法或者属性需要在类外直接使用。

java封装json数据类型 java类的封装代码_初始化


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); // default属性:只能被本包中类访问
 System.out.println(p.screen); // public属性: 可以任何其他类访问
 // System.out.println(p.cpu); // private属性:只能在Computer类中访问,不能被其他类访问
 }
}

一般情况下成员变量设置为 private,成员方法设置为public。

2.static

2.1 static修饰成员变量

static修饰的成员变量,称为静态成员变量,静态成员变量最大的特性:不属于某个具体的对象,是所有对象所共享的

静态成员变量特性

  1. 不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中
  2. 既可以通过对象访问,也可以通过类名访问,但一般更推荐使用类名访问
  3. 生命周期伴随类的一生

2.2 static修饰成员的方法

被static修饰的成员方法称为静态成员方法,是类的方法,不是某个对象所特有的
静态方法特性

  1. 不属于某个具体的对象,是类方法
  2. 可以通过对象调用,也可以通过类名,静态方法名(…)
  3. 静态方法没有隐藏的this引用参数
  4. 静态方法中不能调用任何非静态方法

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);
 }
}
// 执行结果
//x1 = 10
//x2 = 100

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()方法 ==> 构造代码块 ==> 构造方法 ==> 局部代码块 。