封装

文章目录

概念

在面向对象中,封装是指对于某个对象,Java隐藏对象的属性和方法的实现细节,仅对外公开接口,控制 在程序中属性的读取修改 的访问级别。适当的封装可以让程式码更 ++容易理解与维护 ++。++++

优点

  • ++良好的封装能够减少耦合。++

  • ++类内部的结构可以自由修改。++

  • ++可以对成员变量进行更精确的控制。++

  • ++隐藏信息,实现细节。++

对于想要实现的操作,一个类已经将其封装好,你只需调用方法即可,这正是面向对象中的精髓。

通过封装使一部分成员充当类与外部的接口,而将其他的成员隐藏起来,这样就达到了对成员访问权限的合理控制,使不同类之间的相互影响减少到最低限度,进而增强数据的安全性和简化程序的编写工作。

访问限定符

Java中主要通过类和访问权限来实现封装:类可以将数据以及封装数据的方法结合在一起,更符合人类对事物的认知,而访问权限用来控制方法或者字段能否直接在类外使用。Java中提供了四种访问限定符:

default是表示不写修饰符,默认,不能显示的在程序中使用default修饰。

封装的必要性

Java 复制代码
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("睡觉");
    }
}

代码块

使用 {} 定义的一段代码称为代码块。

普通代码块

  • 定义在方法中的代码块
Java 复制代码
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

构造块

定义在类中的代码块,也叫作实例代码块。构造代码块一般用于初始化实例成员变量。

Java 复制代码
 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定义的代码块称为静态代码块。一般用于初始化静态成员变量。

Java 复制代码
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加载类时开辟空间并初始化的++
  • ++如果一个类中包含多个静态代码块,在编译代码时,编译器会按照定义的先后次序依次执行(合并)++
  • ++实例代码块只有在创建对象时才会执行++
相关推荐
Q_19284999063 分钟前
基于Spring Boot的九州美食城商户一体化系统
java·spring boot·后端
张国荣家的弟弟21 分钟前
【Yonghong 企业日常问题 06】上传的文件不在白名单,修改allow.jar.digest属性添加允许上传的文件SH256值?
java·jar·bi
ZSYP-S32 分钟前
Day 15:Spring 框架基础
java·开发语言·数据结构·后端·spring
yuanbenshidiaos35 分钟前
c++------------------函数
开发语言·c++
yuanbenshidiaos39 分钟前
C++----------函数的调用机制
java·c++·算法
程序员_三木1 小时前
Three.js入门-Raycaster鼠标拾取详解与应用
开发语言·javascript·计算机外设·webgl·three.js
是小崔啊1 小时前
开源轮子 - EasyExcel01(核心api)
java·开发语言·开源·excel·阿里巴巴
tianmu_sama1 小时前
[Effective C++]条款38-39 复合和private继承
开发语言·c++
黄公子学安全1 小时前
Java的基础概念(一)
java·开发语言·python
liwulin05061 小时前
【JAVA】Tesseract-OCR截图屏幕指定区域识别0.4.2
java·开发语言·ocr