JAVA面向对象编程三大特性之封装

本文介绍了面向对象编程中的封装概念,如何通过访问限定符如private和public实现封装,以及包的作用,包括包的定义、类的导入、自定义包和包访问权限。通过实例和注意事项,阐述了封装在提高代码可读性和维护性方面的关键作用。
摘要由CSDN通过智能技术生成

        面向对象程序三大特性:封装、继承、多态。而类和对象阶段,主要研究的就是封装特性。何为封装呢?就由小编来带大家梳理一下吧👊

目录

一、封装的概念

二、封装的实现

1、实现方法

2、访问限定符

三、包

1、什么是包

2、包中类的导入

3、自定义包

4、包访问权限

总结


一、封装的概念

        比如:对于电脑这样一个复杂的设备,提供给用户的就只是:开关机、通过键盘输入,显示器,USB插孔等,让用 户来和计算机进行交互,完成日常事务。但实际上:电脑真正工作的却是CPU、显卡、内存等一些硬件元件。

434a29c4d38648d3b19e4baffd70d9be.png

        对于计算机使用者而言,不用关心内部核心部件,比如主板上线路是如何布局的,CPU内部是如何设计的等,用户 只需要知道,怎么开机、怎么通过键盘和鼠标与计算机进行交互即可。因此计算机厂商在出厂时,在外部套上壳 子,将内部实现细节隐藏起来,仅仅对外提供开关机、鼠标以及键盘插孔等,让用户可以与计算机进行交互即可。

封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行 交互

二、封装的实现

1、实现方法

0b6592ff68a3454ba0d624ca7f99f9f6.png

        像这样就是通过private把成员变量name给封装了起来,这时就无法在类Student外调用name变量了,而这样又该如何使用这个成员变量呢?可以通过构建相应的方法:

 public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

        这样就能通过公有的getName方法获取name的值,通关setName方法设置name的值。像这样使用封装后,对于外部代码来说,只需要关注Student类的公有方法,而不需要了解其内部实现细节。这样可以提高代码的可读性和可维护性,并且可以防止外部代码直接修改对象的状态。

2、访问限定符

上文提到的private就是java的访问限定符之一,Java中主要通过访问权限来实现封装:

类可以将数据以及封装数据的方法结合在一起,更符合人类对事物的认 知,而访问权限用来控制方法或者字段能否直接在类外使用

Java中提供了四种访问限定符:

12b53053edc24c5ea698a835123d513d.png

说明:

  • protected主要是用在继承中,继承部分详细介绍
  • default权限指:什么都不写时的默认权限
  • 访问权限除了可以限定类中成员的可见性,也可以控制类的可见性
  • 一般情况下成员变量设置为private,成员方法设置为public

三、包

那么上文中提到的包是什么呢?接着往下看

1、什么是包

        在面向对象体系中,提出了一个软件包的概念,即:

为了更好的管理类,把多个类收集在一起成为一组,称为软件 包。

        简单来说,包其实就是一个文件夹。比如假设你的U盘有更多歌曲要进行分类,那么你怎么去进行分类?肯定是创建文件夹去分类:

1a77a41921e8417fb84f7b4f8b2cc242.png

        在Java中也引入了,包是对接口等的封装机制的体现,是一种对类或者接口等的很好的组织方式。

换句话说,现在你有很多java文件,那么你该怎么去划分这些文件?肯定会分类划分,具体操作是不是就是建立各种分类的文件夹

注意:

  • 1、包名:全是小写
  • 2、包还有一个重要的作用:在同一个工程中允许存在相同名称的类,只要处在不同的包中即可。

2、包中类的导入

        Java 中已经提供了很多现成的类供我们使用. 例如Date类:可以使用 java.util.Date 导入 java.util 这个包中的 Date 类:

public class Test {
     public static void main(String[] args) {
          java.util.Date date = new java.util.Date();
          // 得到一个毫秒级别的时间戳
          System.out.println(date.getTime());
     }
}

但是这种写法比较麻烦一些, 可以使用 import语句导入包:

import java.util.Date;
public class Test {
     public static void main(String[] args) {
          Date date = new Date();
          // 得到一个毫秒级别的时间戳
          System.out.println(date.getTime());
     }
}

如果需要使用 java.util 中的其他类, 可以使用 import java.util.*,这样就可以直接使用java.util中的所有类。

注意:不建议总这样笼统地导包,容易出现冲突的情况,最好显式的指定要导入的类名

不然容易出现如下情况:

import java.util.*;
import java.sql.*;
public class Test {
    public static void main(String[] args) {
        // util 和 sql 中都存在一个 Date 这样的类, 此时就会出现歧义, 编译出错
        Date date = new Date();
        System.out.println(date.getTime());
    }
}
 
// 编译出错
Error:(5, 9) java: 对Date的引用不明确
  java.sql 中的类 java.sql.Date 和 java.util 中的类 java.util.Date 都匹配

        因为上文中提到过包的一个重要作用:在同一个工程中允许存在相同名称的类,只要处在不同的包中即可,导入的两个包中出现了相同的名字,调用时就会产生歧义,导致编译报错

可以使用import static导入包中静态的方法和字段:

import static java.lang.Math.*;
public class Test {
    public static void main(String[] args) {
        double x = 30;
        double y = 40;
        
        // 静态导入的方式写起来更方便一些.
        // double result = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));
        double result = sqrt(pow(x, 2) + pow(y, 2));
        System.out.println(result);
    }
}

注意:

import 和 C++ 的 #include 差别很大. C++ 必须 #include 来引入其他文件内容, 但是 Java 不需要. import 只是为了写代码的时候更方便. import 更类似于 C++ 的 namespace 和 using

3、自定义包

注意:

  • 在文件的最上方加上一个 package 语句指定该代码在哪个包中.
  • 包名需要尽量指定成唯一的名字, 通常会用公司的域名的颠倒形式(例如 com.baidu.www).
  • 包名要和代码路径相匹配. 例如创建com.baidu.www的包, 那么会存在一个对应的路径com/baidu/www来存储代码.
  • 如果一个类没有 package 语句, 则该类被放到一个默认包中.

步骤:

1. 在 IDEA 中先新建一个包: 右键 src -> 新建 -> 包

2861b5cf73a74d7fbd69111dc954b10e.png

2. 在弹出的对话框中输入包名, 例如:com.baidu.www

e5b5250aeaf14a9a87f7685aeaf88e67.png

3. 在包中创建类, 右键包名 -> 新建 -> 类, 然后输入类名即可

1778817320e74be7adcf3c785358e8be.png

4. 此时可以看到我们的磁盘上的目录结构已经被 IDEA 自动创建出来了

f7f85649eccc4107a57da7ba66a63210.png

5. 同时我们也看到了, 在新创建的 Test.java 文件的最上方, 就出现了一个 package 语句

a0316ec057ed445ab90857dc81ff05e3.png

注意:有些人创建的包会是下面这样连在一起的

b36a6e918cbb48dfbdf5c0057fba570e.png

是因为勾选了下面的选项导致的

74e03b443cc1444789dffd101c740f76.png

单击一下取消勾选即可。

4、包访问权限

前文提到的访问限定符private和默认与protected和public的一大区别就是包访问权限不同,就是指被private和默认的修饰下的类,跨包后就无法调用了


常见的包:

  • 1. java.lang:系统常用基础类(String、Object),此包从JDK1.1后自动导入。
  • 2. java.lang.reflect:java 反射编程包;
  • 3. java.net:进行网络编程开发包。
  • 4. java.sql:进行数据库开发的支持包。
  • 5. java.util:是java提供的工具程序包。(集合类等) 非常重要
  • 6. java.io:I/O编程开发包。

总结

那么本篇文章就到此为止了,如果觉得这篇文章对你有帮助的话,可以点一下关注和点赞来支持作者哦。作者还是一个萌新,如果有什么讲的不对的地方欢迎在评论区指出,希望能够和你们一起进步✊

7139c88a47004df4b7c7bab684c7afc9.jpeg

  • 14
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值