Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【Java】面向对象程序三板斧——如何优雅设计包、封装数据与优化代码块?

【Java】面向对象程序三板斧——如何优雅设计包、封装数据与优化代码块?

作者头像
User_芊芊君子
发布于 2025-04-16 05:26:47
发布于 2025-04-16 05:26:47
17100
代码可运行
举报
运行总次数:0
代码可运行

【前言】

Java编程中,类和对象是面向对象编程的核心概念。而包(Package)、封装(Encapsulation)以及代码块(Code Block)作为重要的语言特性,在组织代码结构、保障数据安全和控制代码执行流程等方面发挥着关键作用。本文将通过详细的代码示例和图解,带大家深入理解这些特性。

一、包(Package)——代码的“收纳盒”

1.定义

  • (Package)是Java中⼀个组织类的⽅式,⽤于防⽌类名冲突和提⾼代码的可读性。包允许将类组织在⼀个层次结构中,类似于⽂件系统中的⽬录。
  • 包是对类、接⼝等的封装机制的体现,是⼀种对类或者接⼝等的很好的组织⽅式。类似于文件夹

2.导入包中的类

Java 中已经提供了很多现成的类供我们使⽤,例如Date类:可以使⽤java.util.Date导⼊java.util 这个包中的 Date 类. 方法一:写全路径导入

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Test {
    public static void main(String[] args) {
       java.util.Date date = new java.util.Date();
        System.out.println(date.getTime());
    }
}

方法二:使用import导入

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 java.util.Date date = new java.util.Date();

上面的写法就比较麻烦了,我们可以直接使用import导入包

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.util.Date;

public class Test {
    public static void main(String[] args) {
      // java.util.Date date = new java.util.Date();
        Date date = new Date();
        System.out.println(date.getTime());
    }
}

快捷方式:输入Date,回车即可

方法三:使用 import java.util.*导入,就可以使用java.util中的其他类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.util.*;

public class Test {
    public static void main(String[] args) {
      // java.util.Date date = new java.util.Date();
        Date date = new Date();
        System.out.println(date.getTime());
    }
}

建议显示的指定要导入的类名,否则容易出现冲突,如下图:当有两个包都有Date类时,编译器就不知道该引入哪个包中的类了

3.自定义包

3.1 基本规则
  • 在⽂件的最上⽅加上⼀个 package 语句指定该代码在哪个包中.
  • 包名需要尽量指定成唯⼀的名字, 通常会⽤公司的域名的颠倒形式(例如 com.bit.demo1 ).
  • 包名要和代码路径相匹配. 例如创建com.bit.demo1 的包, 那么会存在⼀个对应的路径com/bit/demo1 来存储代码.
  • 如果⼀个类没有 package 语句, 则该类被放到⼀个默认包中.
3.2 使用 IDEA 创建包过程
  • 在 IDEA 中先新建⼀个包: 右键 src -> 新建 -> 包 注意:包名要小写
  • 输入包名
  • 出现 Package 语句
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.bit.demo1;

public class TestDame {
}
3.3 常见的包

  • java.lang:系统常⽤基础类(String、Object),此包从JDK1.1后⾃动导⼊。
  • java.lang.reflect:java 反射编程包;
  • java.net:进⾏⽹络编程开发包。
  • java.sql:进⾏数据库开发的⽀持包。
  • java.util:是java提供的⼯具程序包。(集合类等) ⾮常重要
  • java.io:I/O编程开发包。
3.4 包访问权限

如果我们在定⼀个类的时候,如果没有指定成员变量/成员⽅法的访问权限,此时默认的访问权限就是包访问权限

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.bit.demo1;

public class Computer {
    private String cpu;   //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("上网~~~");
    }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.bit.dame2;

import com.bit.demo1.Computer;

import javax.swing.*;

public class Tes {
    public static void main(String[] args) {
        Computer computer = new Computer("华为","英特尔","8G","三星");
        System.out.println(computer.brand);
        System.out.println(computer.screen);
        System.out.println(computer.cpu);
        System.out.println(computer.memory);

    }
}
  • public 修饰符

public修饰的成员在哪里都能访问,它的权限是最大的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 public String screen; //屏幕
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 System.out.println(computer.screen);
  • private 修饰符

只能在当前类中使用

  • 默认修饰符

只能在dema1包中使用

二、封装

1. 什么是封装

  • ⾯向对象程序三⼤特性:封装、继承、多态。⽽类和对象阶段,主要研究的就是封装特性。何为封装呢?简单来说就是套壳屏蔽细节。
  • 封装就像是把东西放在⼀个盒⼦⾥,并且控制谁可以打开这个盒⼦,以及如何使⽤盒⼦⾥的东西。在编程中,它指的是将数据(属性)和操作这些数据的⽅法(函数)包装在⼀个单元(通常是类)内。
  • ⽐如:对于电脑这样⼀个复杂的设备,提供给⽤⼾的就只是:开关机、通过键盘输⼊,显⽰器,USB插孔等,让⽤⼾来和计算机进⾏交互,完成⽇常事务。
  • 对于计算机使⽤者⽽⾔,不⽤关⼼内部核⼼部件,⽐如主板上线路是如何布局的,CPU内部是如何设计的等,⽤⼾只需要知道,怎么开机、怎么通过键盘和⿏标与计算机进⾏交互即可。因此计算机⼚商在出⼚时,在外部套上壳⼦,将内部实现细节隐藏起来,仅仅对外提供开关机、⿏标以及键盘插孔等,让⽤⼾可以与计算机进⾏交互即可。
  • 封装:将数据和操作数据的⽅法进⾏有机结合,隐藏对象的属性和实现细节,仅对外公开接⼝来和对象进⾏交互

2. 代码演示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.bit.demo1;

public class Computer {
    private String cpu;   //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 String getCpu() {
        return cpu;
    }

    public void setCpu(String cpu) {
        this.cpu = cpu;
    }

    public String getMemory() {
        return memory;
    }

    public void setMemory(String memory) {
        this.memory = memory;
    }

    public void Boot(){
        System.out.println("开机~~~");
    }
    public void PowerOff(){
        System.out.println("关机~~~");
    }
    public void SurfInternet(){
        System.out.println("上网~~~");
    }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.bit.dame2;

import com.bit.demo1.Computer;

import javax.swing.*;

public class Tes {
    public static void main(String[] args) {
        Computer computer = new Computer("华为","英特尔","8G","三星");
        System.out.println(computer.getCpu());
        System.out.println(computer.screen);
        System.out.println(computer.getMemory());

    }
}

通过private对Computer中的成员变量进行隐藏,但是可以提供get或者set方法,让内外进行交互(这里编译器也可以自动生成),方法如下:

3. 封装的好处:

  1. 降低代码的耦合性 封装可以降低对象和对象之间的耦合度,当对象内部发⽣变化时,只需要修改对象内部即可,不会影 响到外部程序,因为公开的接⼝是不会发⽣改变的
  2. 降低代码的复杂性 封装是隐藏了对象内部的实现细节,只提供了公开的接⼝给外部,使⽤起来更加简单
  3. 提⾼安全性 封装可以隐藏对象的具体实现细节,阻⽌外部程序直接访问对象的内部状态,从⽽保护数据不被意外 修改或破坏

4. 访问限定符详解

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

• public修饰的成员变量,在所指定情况下均是可以正常访问的 • private修饰的成员变量,只能在当前类中来使⽤ • default表⽰什么修饰符都不加,此时只能在包当中才能被访问

三、static 关键字

1. static 修饰成员变量

在Java中,被static修饰的成员,称之为静态成员,也可以称为类成员,其不属于某个具体的对象,是所有对象所共享的

创建一个Student 类,其中包含两名学生的姓名,年龄和班级(一样),这时就可以用static修饰班级,如下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package demo;

public class Student {
    public String name;
    public int age;
    public static String classRoom;//静态

}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package demo;

public class Test {
    public static void main(String[] args) {
        Student.classRoom = "1";
        Student student1 = new Student();
        student1.name = "lisa";
        student1.age  = 18;


        Student student2 = new Student();
        student2.name = "baby";
        student2.age = 20;
        System.out.println(Student.classRoom);
    }
}

执行结果:

【静态成员变量特性】

  1. 不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中
  2. 既可以通过对象访问,也可以通过类名访问,但⼀般更推荐使⽤类名访问
  3. 类变量存储在⽅法区当中
  4. ⽣命周期伴随类的⼀⽣(即:随类的加载⽽创建,随类的卸载⽽销毁)

2. 静态成员变量的访问

类名.静态成员变量的⽅式进⾏访问

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 System.out.println(Student.classRoom);

3. static 修饰成员方法

Java中,被static修饰的成员⽅法称为静态成员⽅法,是类的⽅法,不是某个对象所特有的。静态成员⼀般是通过静态⽅法来访问的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static String getClassRoom(){
        return classRoom;
    }
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
System.out.println(Student.getClassRoom());

【静态⽅法特性】

  1. 不属于某个具体的对象,是类⽅法
  2. 可以通过对象调⽤,也可以通过类名.静态⽅法名(…)⽅式调⽤,更推荐使⽤后者
  3. 不能在静态⽅法中访问任何⾮静态成员变量
  4. 静态⽅法中不能调⽤任何⾮静态⽅法,因为⾮静态⽅法有this参数,在静态⽅法中调⽤时候⽆法传 递this引⽤
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 public  void doClass(){
        System.out.println("学习");
    }
    public static String getClassRoom(){
        doClass();
    }

4.static 成员变量的初始化

就地初始化 在定义时直接给出初始值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pubilc class Student{
     private String name;
     private static String classRoom = "1"

四、代码块

使⽤ {} 定义的⼀段代码称为代码块

• 普通代码块 • 构造块(实例代码块) • 静态块 • 同步代码块(

1.普通代码块

普通代码块就是定义在方法中的代码块

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static void main(String[] args) {
        int a = 0;
        System.out.println(a);
    }

2.构造代码块

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Student {
    //实例代码块
    {
        this.name = "lisi";
        this.age = 18;
        System.out.println("实例代码块执行");

    }
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Test {
    public static void main(String[] args) {
        Student student1 = new Student();
        System.out.println(student1.name);
        System.out.println(student1.age);
    }

执行结果

【执行顺序】

  • 先执行实例代码块,再执行对应的构造方法
  • 实例成员变量与实例代码块,谁在前先执行谁
  • 当有静态代码块时,先执行静态代码块,再执行实例代码块

3.静态代码块

使⽤static定义的代码块称为静态代码块。⼀般⽤于初始化静态成员变量。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Student {
    //实例代码块
    {
        this.name = "lisi";
        this.age = 18;
        System.out.println("实例代码块执行");
    }
    //静态代码块
    static {
        System.out.println("静态代码块被执行");
    }
    public class Test {
    public static void main(String[] args) {
        Student student1 = new Student();
        System.out.println(student1.name);
        System.out.println(student1.age);
    }

执行结果

注意事项 • 静态代码块不管⽣成多少个对象,其只会执⾏⼀次 • 静态成员变量是类的属性,因此是在JVM加载类时开辟空间并初始化的 • 如果⼀个类中包含多个静态代码块,在编译代码时,编译器会按照定义的先后次序依次执⾏(合并) • 实例代码块只有在创建对象时才会执⾏

【总结】

  • 包管理:遵循反向域名命名,合理划分模块
  • 封装设计:属性私有,方法公开,增加数据校验
  • 代码块使用:静态代码块用于类级初始化,实例代码块简化构造逻辑 通过掌握这些特性,开发者能够编写出结构清晰、安全可靠的Java程序。希望本文的示例和解析能帮助你更好地理解和应用这些核心概念! 如果对某个知识点有疑问,欢迎在评论区留言交流! 🚀
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-04-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
知识改变命运 第八集(下):Java中的类和对象
面向对象程序三大特性:封装、继承、多态。而类和对象阶段,主要研究的就是封装特性。何为封装呢?简单来说 就是套壳屏蔽细节。 比如:对于电脑这样一个复杂的设备,提供给用户的就只是:开关机、通过键盘输入,显示器,USB插孔等,让用 户来和计算机进行交互,完成日常事务。但实际上:电脑真正工作的却是CPU、显卡、内存等一些硬件元件。 对于计算机使用者而言,不用关心内部核心部件,比如主板上线路是如何布局的,CPU内部是如何设计的等,用户 只需要知道,怎么开机、怎么通过键盘和鼠标与计算机进行交互即可。因此计算机厂商在出厂时,在外部套上壳 子,将内部实现细节隐藏起来,仅仅对外提供开关机、鼠标以及键盘插孔等,让用户可以与计算机进行交互即可。 封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行 交互
用户11319080
2024/10/17
1190
知识改变命运 第八集(下):Java中的类和对象
【JavaSE】Java入门四(面向对象 1——四千五百字详解)
面向对象有三大特征:封装,继承,多态。Java就是依靠类和对象来依次实现这三大特征的 ,我会在接下来的文章中详细介绍这三大特征。
小皮侠
2024/04/08
2950
【JavaSE】Java入门四(面向对象 1——四千五百字详解)
【Java SE】类和对象(下)
1. 在 IDEA 中先新建一个包: 右键 src -> New -> Package
用户11369558
2024/11/20
1020
【Java SE】类和对象(下)
【Javase-9.类和对象】
java是一门纯面向对象的语言,在面向对象的世界里,一切皆为对象.面向对象是解决问题的一种思想,主要依靠对象之间的交互来完成一件事.
用户11369350
2024/11/19
710
【Javase-9.类和对象】
【Java 基础】类和对象(构造&this&封装&static&代码块)
类:把具有相同属性和行为的一类对象抽象为类。类是抽象概念,如人类、犬类等,无法具体到每个实体。
IsLand1314
2024/10/15
1920
【Java 基础】类和对象(构造&this&封装&static&代码块)
【Java篇】一气化三清:类的实例化与封装的智慧之道
通过前面知识点的学习我们知道,在Java方法内部定义一个局部变量时,必须要初始化,否则会编译失败。
半截诗
2025/03/20
1120
【Java篇】一气化三清:类的实例化与封装的智慧之道
【Java面向对象三大特征——封装】
封装:不仅仅是将public变成private,而是通过将类的属性和实现细节隐藏起来,只暴露必要的部分(对外只提供一些开放的接口)。这可通过设置属性为private,protected来实现,防止外部直接修改或访问对象的状态(属性)。
ImAileen
2024/10/24
1780
【Java面向对象三大特征——封装】
第十三天 面向对象-final static 匿名对象内部类包代码块【悟空教程】
第13天 面向对象 第1章 面向对象其他知识点 1.1 final与static关键字 1.1.1 final关键字 1.1.1.1 final概念 继承的出现提高了代码的复用性,并方便开发。但随之也有问题,有些类在描述完之后,不想被继承,或者有些类中的部分方法功能是固定的,不想让子类重写。可是当子类继承了这些特殊类之后,就可以对其中的方法进行重写,那怎么解决呢? 要解决上述的这些问题,需要使用到一个关键字final,final的意思为最终,不可变。final是个修饰符,它可以用来修饰类,类的成员,以及局
Java帮帮
2018/06/11
4240
Java学习【类与对象—封装】
封装是指将数据(属性)和相关的操作(方法)绑定在一起,形成一个独立的单元(即类)。封装后,对象的内部状态(属性)对外界是不可见的,只能通过对象提供的方法来访问和修改内部状态。这样可以保护对象的状态不被随意修改,提高数据的安全性。 也就类似于手机,产家把手机的各种零件都封装起来,只留下接口被外界使用,这样就很好的保护了手机的零件。
2的n次方
2024/10/15
1380
Java学习【类与对象—封装】
【Java探索之旅】静态关键字static与代码块的奥秘
假设现在有5名同学,他们的性别、年龄可能各不一样,但是上课的教室一样的,你会怎么去定义这个类呢?这里面有一个共同点,教室是一样的,你如果把教室设置成对象的成员变量,那么每new一个对象,都会包含这个成员变量,造成空间上的浪费和不必要的麻烦。我们的本意是想要共享,而不是每个对象都存一份。
屿小夏
2024/05/06
1130
java从入门到精通四(面向对象上,类与对象的实现,代码块的执行顺序)
面向对象的方法主要是把事物对象化,包括属性和行为。而面向对象编程则比较贴近生活的实际,也就说,在程序中的编程,力图对描述的事物在现实中的形态保持一致。为了做到这一点,我们java中也就有类和对象的概念。类是对一类事物的抽象,类下就有若干对象,对象用于描述类中事物的个体。说来光看定义还是比较抽象,不容易理解。我们在下面的编程实践中可以大致理解这种思维模式。
兰舟千帆
2022/07/16
8510
java从入门到精通四(面向对象上,类与对象的实现,代码块的执行顺序)
类和对象(2)
 Java中主要通过类和访问权限来实现封装:类可以将数据以及封装数据的方法结合在一起,更符合人类对事物的认知,而访问权限用来控制方法或者字段能否直接在类外使用。Java中提供了四种访问限定符:
E绵绵
2024/04/08
970
类和对象(2)
《JavaSE》---13.<面向对象系列之(附:static关键字及final关键字)>
static 修饰的成员变量,称为静态成员变量 ,静态成员变量最大的特性: 不属于某个具体的对象,是所有对象所共 享的 。
用户11288958
2024/09/24
1480
《JavaSE》---13.<面向对象系列之(附:static关键字及final关键字)>
JAVA中类和对象(二)
1.一般类中的数据成员都设置为 private ,而成员方法设置为 public , 问:那设置之后,Student类中,被Student修饰,的属性(classRoom)如何在类外访问呢?
用户11305962
2024/10/09
1550
JAVA中类和对象(二)
《JavaSE-第八章》-代码块与内部类
前言 本章介绍static成员,使用代码块初始化对象以及内部类。 博客主页:KC老衲爱尼姑的博客主页 博主的github,平常所写代码皆在于此 共勉:talk is cheap, show m
用户10517932
2023/10/07
1760
《JavaSE-第八章》-代码块与内部类
【Java继承】——面向对象编程的基石
举个例子吧,相信大家都看过西虹市首富吧,沈腾演的王多鱼通过他二爷的考验,最终继承了他二爷的财产。
User_芊芊君子
2025/05/13
760
【Java继承】——面向对象编程的基石
Java:面向对象
1、子类的构造方法必须先调用父类的构造方法,再执行后面的代码。 即子类构造方法的第一句默认为 super(); 目的是让父类比子类先初始化。 如果显式的调用 super(), 默认的就无效了。 所以上面例子会报错,因该改为:
程序猿川子
2025/05/19
920
Java:面向对象
构造方法、封装、关键字(this、static)和代码块的介绍
构造方法在初始化一个类的对象时进行调用,它没有返回值,方法名与类名相同,而成员方法是则是由对象主动调用,它有返回值,表现为对象的操作行为。
java架构师
2019/05/08
4450
构造方法、封装、关键字(this、static)和代码块的介绍
【面向对象编程】继承
在编程中,继承可以实现代码的复用,减少重复编写代码的工作量。通过继承,子类可以继承父类的属性和方法,并且可以根据需要进行扩展和修改,提高了代码的可维护性和可扩展性。再例如现实世界的复杂性,但事物之间存在某种共性,那么程序设计就需要考虑
用户11288949
2024/09/24
1230
【面向对象编程】继承
Java—面向对象高级(第十天)
前面我们说过面向对象最核心的套路是:设计对象来处理数据,解决问题。 如果你把面向对象高级这一部分课程学好,你设计出来的对象将更加好用。
用户4396583
2024/10/10
1140
推荐阅读
相关推荐
知识改变命运 第八集(下):Java中的类和对象
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验