Java全面分析面向对象之封装

 更新时间:2022年04月25日 16:37:30   作者:厚积薄发ض  
或许大家都听说过java是纯面向对象语言,面向对象思想也就是我们常说的OOP,我们听说最多的思想就是继承,封装,多态,今天我们来讲一讲封装

什么是封装呢

封装就是一种将数据和操作数据的方法进行有机结合,一种函数抽象类的接口实现了对细节的封装和隐藏,使得我们只需要调用对外开放的公共接口去实现与对象的交互。我们可以把封装理解为一种保护的屏障,需要一些严格的接口进行控制,我们可以修改自己实现类的内部结构的代码,但是不可以修改那些公共接口。这就提供更好的安全性。

封装的好处意义

  • 好的封装能够减少耦合度
  • 能够对成员变量更精准的控制
  • 实现对细节的封装和隐藏,使得更具有安全性。
  • 可以修改类的内部代码,不用修改那些公共的接口

讲到封装那必然讲到关键字private也就是访问修饰限定符。

回忆一下我们见过哪些访问修饰限定符呢?有public ,还有成员变量什么也不加的默认权限英文是default,还有就是我们今天要讲解的private,下一篇文章会讲解protected。

那private到底有什么用处呢?

我们在来回忆一下上篇文章讲过的类和对象,下面我会创建一个学生类。

//创建一个学生类
class Student {
    public String name;//学生姓名
    public int age;//学生年龄
    public String sex;//学生性别
    public double score;//学生分数
   
    public void sleep() {
        System.out.println("我要睡觉了!!!");
    }
    public void eat() {
        System.out.println("我要干饭了!!!");
    }
    public void exam() {
        System.out.println("我要考试了!!!");
    }
}
public class TestDemo {
    public static void main(String[] args) {
        Student student = new Student();//利用new关键字实例化一个对象
        student.age = 19;
        student.name = "厚积薄发";
        student.score = 99.9;
        student.sex = "男";
    }
}

以上的代码我们将这个学生成员变量分别赋值。这样写会不会有什么不足呢?

想一想,如果我们每次要定义一个学生对象,每次都要这样赋值会不会有点太麻烦?今天我们讲到封装就会让它更简单一些。请看下面代码:

class Student {
    private String name;//学生姓名
    private int age;//学生年龄
    private String sex;//学生性别
    private double score;//学生分数
 
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}
public class TestDemo {
    public static void main(String[] args) {
        Student student = new Student();
        student.setName("厚积薄发");
        System.out.println(student.getName());
    }
}

根据封装的概念我是不是可以给它封装成一个公共的接口然后调用。

好接下来分析一下这个代码:

 所以,我们在成员变量前面加上private修饰使得成员变量只能在类的内部访问,不能在类的外部访问,然后我们实现了setName getName方法,调用者两个接口就可以进行初始化和返回值操作,更好地体现了封装性。

getter方法和setter方法

为了更方便的调用这些接口,IDEA会为我们提供了这些接口,我们通常情况下把这些方法叫做getter方法和setter方法。只要我们需要我们就可以调用这些共有的getter方法和setter方法。

IDEA快捷键:Alt + insert

class Student {
    private String name;//学生姓名
    private int age;//学生年龄
    private String sex;//学生性别
    private double score;//学生分数
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public double getScore() {
        return score;
    }
    public void setScore(double score) {
        this.score = score;
    }
    public void sleep() {
        System.out.println("我要睡觉了!!!");
    }
    public void eat() {
        System.out.println("我要干饭了!!!");
    }
    public void exam() {
        System.out.println("我要考试了!!!");
    }
}
public class TestDemo {
    public static void main(String[] args) {
        Student student = new Student();//利用new关键字实例化一个对象
        student.setName("厚积薄发");
        student.setAge(19);
        student.setScore(99.9);
        student.setSex("male");
        System.out.println(student.getName());
        System.out.println(student.getAge());
        System.out.println(student.getScore());
        System.out.println(student.getSex());
    }
}

toString方法

此外,我们每个成员变量都要自己实现一遍打印操作,没错IDEA编译器又为我们提供了一个方法,这个方法叫做toString方法,快捷键是 Alt +insert然后选择toString方法。

 我们直接打印对象的引用就可以调用toString方法.

有同学就会问为什么呢?

这就得需要我们看一看println的源码是怎么实现的了。

我们按住ctrl 点进println这个方法

 我们通过源码就可以发现,println会调用toString方法,如果定义了toString方法,那他就调用toString方法,如果没有调用他就会打印:

 eg:

其中IDEA还为我们提供了构造方法,为了更好地方便初始化,构造方法的文章请看这篇文章:

Java 类与对象超基础讲解

快捷键: Alt + insert  选择constructor

总结:

private关键字:利用private修饰的成员变量和方法只能在本类中访问,如果在外部访问可以调用公有的setter方法和getter方法。

封装的优点:减少代码的耦合性    , 可以自由修改自己的内部类,不用修改公有地接口 ,隐藏信息实现细节,更精准的控制成员变量。

要记住并且运用并且调用这些公共的接口:getter方法和setter方法 还有toString方法  以及 构造方法。

面向对象封装之包

包是什么呢?

包其实就是类似于文件夹,为了更好地管理。在java中引入包的概念,包的用处:如果一个包中的类不想被另外一个包中的类使用这就更好地体现了封装性,还有一个作用就是,Java中不可以在src底下创建相同的类名,这一点包就可以解决,只要在不同的包中,类的名称可以一样。

怎么进行导包呢?

还记得我们在学习数组的时候使用过Arrays这个类,我们就要导入java.util包

例如:

 当然我们还可以手动导入

 这里还需要注意一个问题:

我们可以注意到在包中有java.util包也有java.sql包,当我们同时导入这两个包,计算机就会反应不过来到底导入哪个包

所以,当同时导入util包和sql包时候,我们需要手动导入具体是导入那一个包。

自定义包

 一般包的名字都是域名倒着过来  例如 com.hjbf.TestDemo

 我们上面文章讲过访问修饰限定符,有一个是默认访问权限(default)其实也叫作包访问权限,如果成员变量前边什么也不加那就是默认访问权限也叫作包访问权限只能够在同一包中使用。

这里我们要注意一下我们创建一个包,他就会导入这个包,其中packge是声明在包中,后面的就是路径。

我们可不可以在这个包里访问其他包呢?

答案是可以的,当我们访问其他包时候,他就会在本包中导入其他的包。

包的基本规则:

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

常见的包分类:

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编程开发包

到此这篇关于Java全面分析面向对象之封装的文章就介绍到这了,更多相关Java封装内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java CountDownLatch计数器与CyclicBarrier循环屏障

    Java CountDownLatch计数器与CyclicBarrier循环屏障

    CountDownLatch是一种同步辅助,允许一个或多个线程等待其他线程中正在执行的操作的ASET完成。它允许一组线程同时等待到达一个共同的障碍点
    2023-04-04
  • Java日常练习题,每天进步一点点(2)

    Java日常练习题,每天进步一点点(2)

    下面小编就为大家带来一篇Java基础的几道练习题(分享)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望可以帮到你
    2021-07-07
  • SpringCloud微服务架构实战之微服务治理功能的实现

    SpringCloud微服务架构实战之微服务治理功能的实现

    这篇文章主要介绍了SpringCloud微服务架构实战之微服务治理,这些治理工具主要包括服务的注册与发现、负载均衡管理、动态路由、服务降级和故障转移、链路跟踪、服务监控等,需要的朋友可以参考下
    2022-02-02
  • SpringBoot项目打jar包与war包的详细步骤

    SpringBoot项目打jar包与war包的详细步骤

    SpringBoot和我们之前学习的web应用程序不一样,其本质上是一个 Java应用程序,那么又如何部署呢?这篇文章主要给大家介绍了关于SpringBoot项目打jar包与war包的详细步骤,需要的朋友可以参考下
    2023-02-02
  • Java优先队列(PriorityQueue)重写compare操作

    Java优先队列(PriorityQueue)重写compare操作

    这篇文章主要介绍了Java优先队列(PriorityQueue)重写compare操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • jmeter压力测试工具简介_动力节点Java学院整理

    jmeter压力测试工具简介_动力节点Java学院整理

    这篇文章主要为大家详细介绍了jmeter压力测试工具相关介绍资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • Java如何实现支付宝电脑支付基于servlet版本

    Java如何实现支付宝电脑支付基于servlet版本

    这篇文章主要介绍了Java如何实现支付宝电脑支付基于servlet版本,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • Idea2020.2创建JavaWeb项目(部署Tomcat)方法详解

    Idea2020.2创建JavaWeb项目(部署Tomcat)方法详解

    这篇文章主要介绍了Idea2020.2创建JavaWeb项目(部署Tomcat)方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • 使用LambdaQueryWrapper动态加过滤条件 动态Lambda

    使用LambdaQueryWrapper动态加过滤条件 动态Lambda

    这篇文章主要介绍了使用LambdaQueryWrapper动态加过滤条件 动态Lambda,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教。
    2022-01-01
  • Hystrix Turbine聚合监控的实现详解

    Hystrix Turbine聚合监控的实现详解

    微服务架构下,⼀个微服务往往部署多个实例,如果每次只能查看单个实例的监控,就需要经常切换很不⽅便,在这样的场景下,我们可以使⽤ Hystrix Turbine 进⾏聚合监控,它可以把相关微服务的监控数据聚合在⼀起,便于查看
    2022-09-09

最新评论