Java基础第四篇 封装与接口

 更新时间:2021年09月10日 15:05:35   作者:Vamei  
本文将对介绍Java 的封装与接口进行介绍,将要封装(encapsulation)对象的成员(成员包括数据成员和方法),从而只允许从外部调用部分的成员。利用封装,我们可以提高对象的易用性和安全性。想具体了解的小伙伴请参考下面文章的内容

前言:

总结之前的内容,对象(object)指代某一事物,类(class)指代象的类型。对象可以有状态和动作,即数据成员和方法。

到现在为止,数据成员和方法都是同时开放给内部和外部的。在对象内部,我们利用this来调用对象的数据成员和方法。在对象外部,比如当我们在另一个类中调用对象的时,可以使用 对象.数据成员对象.方法() 来调用对象的数据成员和方法。

1、封装与接口

封装(encapsulation)是计算机常见的术语,即保留有限的外部接口(interface),隐藏具体实施细节。比如在Linux架构,就可以看到Linux操作系统封装了底层硬件的具体细节,只保留了系统调用这一套接口。用户处在封装的外部,只能通过接口,进行所需的操作。

封装在生活中很常见。比如下面是一个充电电筒:

一个用户即使不看说明书,也可以猜到这个电筒的操作: 开关和充电。这个电筒用一个塑料壳将用户不需要接触的内部细节隐藏起来,只保留了两个接口,开关和电插头。使用这两个接口,用户足以使用该产品在设计中想要实现的功能。如果所有的细节都同时暴露给用户,那么用户会对产品感到不知所措 (比如下面不加壳的遥控器)。因此,封装提高了产品的易用性

 

如果产品不封装,电筒或者遥控器的许多细节会暴露在用户面前: 电池、电路、密封的橡胶等等。尽管这可以让用户更自由的对产品实施操作,比如直接给电池放电,取出一个LED灯等等。然而,用户往往要承担更大的损坏产品的风险。因此,封装提高了产品的安全性

 

一个Java软件产品与一个日常产品相同。一个对象内部可以有许多成员(数据成员和方法)。有一些数据成员和方法只是内部使用。这时,我们会希望有一个给对象“加壳”的机制,从而封装对象。这样,用户可以比较容易学习和使用外部的接口,而不必接触内部成员。

2、对象成员的封装

Java通过三个关键字来控制对象的成员的外部可见性(visibility): public, private, protected

  • public: 该成员外部可见,即该成员为接口的一部分
  • private: 该成员外部不可见,只能用于内部使用,无法从外部访问。

(protected涉及继承的概念,放在以后说)

我们先来封装以前定义的Human类:

public class Test
{
    public static void main(String[] args)
    {
        Human aPerson = new Human(160);
        System.out.println(aPerson.getHeight());
        aPerson.growHeight(170);
        System.out.println(aPerson.getHeight());
        aPerson.repeatBreath(100);
    }

}

class Human
{
    /**
     * constructor
     */
    public Human(int h)
    {
        this.height = h;
        System.out.println("I'm born");
    }

    /**
     * accessor
     */
    public int getHeight()
    {
       return this.height;
    }

    /**
     * mutator
     */
    public void growHeight(int h)
    {
        this.height = this.height + h;
    }

     /**
      * encapsulated, for internal use
      */
    private void breath()
    {
        System.out.println("hu...hu...");
    }


   /**
    * call breath()
    */
    public void repeatBreath(int rep)
    {
        int i;
        for(i = 0; i < rep; i++) {
            this.breath();
        }
    }

    private int height; // encapsulated, for internal use
}


内部方法并不受封装的影响。Human的内部方法可以调用任意成员,即使是设置为privateheightbreath()

外部方法只能调用public成员。当我们在Human外部时,比如Test中,我们只能调用Human中规定为public的成员,而不能调用规定为private的成员。

通过封装,Human类就只保留了下面几个方法作为接口:

  • getHeight()
  • growHeight()
  • repBreath()

我们可以将Human类及其接口表示为如下图的形式:

上图就如“加了壳的遥控器”

如果我们从main中强行调用height:

System.out.println(aPerson.height);

将会有如下错误提示:

Test.java:6: height has private access in Human
        System.out.println(aPerson.height);
                                  ^
1 error

Beep, 你触电了! 一个被说明为private的成员,不能被外部调用。

在Java的通常规范中,表达状态的数据成员(比如height)要设置成private。对数据成员的修改要通过接口提供的方法进行(比如getHeight()和growHeight())。这个规范起到了保护数据的作用。用户不能直接修改数据,必须通过相应的方法才能读取和写入数据。类的设计者可以在接口方法中加入数据的使用规范。

3、类的封装

在一个.java文件中,有且只能有一个类带有public关键字,比如上面的Test类。所以,从任意其他类中,我们都可以直接调用该类。Human类没有关键字。更早之前,我们对象的成员也没有关键字。这种没有关键字的情况也代表了一种可见性,我将在包(package)的讲解中深入。

4、总结

封装,接口

private, public

到此这篇关于Java基础 第四篇 封装与接口的文章就介绍到这了,更多相关Java 的封装与接口内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java实现任意矩阵Strassen算法

    java实现任意矩阵Strassen算法

    这篇文章主要介绍了java实现任意矩阵Strassen算法的相关资料,需要的朋友可以参考下
    2016-02-02
  • java并发访问重复请求过滤问题

    java并发访问重复请求过滤问题

    本篇文章给大家分享了关于java并发访问重复请求过滤的相关问题以及解决方法,对此有需要的朋友参考学习下。
    2018-05-05
  • 如何使用Java调用Spark集群

    如何使用Java调用Spark集群

    这篇文章主要介绍了如何使用Java调用Spark集群,我搭建的Spark集群的版本是2.4.4,本文结合示例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-02-02
  • Java指令重排序在多线程环境下的处理方法

    Java指令重排序在多线程环境下的处理方法

    指令重排在单线程环境下有利于提高程序的执行效率,不会对程序产生负面影响,本文对多线程指令重排问题进行复原,并针对指令重排给出相应的解决方案,需要的朋友参考下吧
    2022-04-04
  • SpringBoot学习篇之@Valid与@Validated的区别

    SpringBoot学习篇之@Valid与@Validated的区别

    @Valid是使用Hibernate validation的时候使用,@Validated是只用Spring Validator校验机制使用,下面这篇文章主要给大家介绍了关于SpringBoot学习篇之@Valid与@Validated区别的相关资料,需要的朋友可以参考下
    2022-11-11
  • Java使用HttpUtils实现发送HTTP请求

    Java使用HttpUtils实现发送HTTP请求

    这篇文章主要介绍了Java使用HttpUtils实现发送HTTP请求,HTTP请求,在日常开发中,还是比较常见的,今天给大家分享HttpUtils如何使用,需要的朋友可以参考下
    2023-05-05
  • 详解Spring框架之基于Restful风格实现的SpringMVC

    详解Spring框架之基于Restful风格实现的SpringMVC

    这篇文章主要介绍了详解Spring框架之基于Restful风格实现的SpringMVC,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • SpringBoot项目网页加载出现Whitelabel Error Page的解决

    SpringBoot项目网页加载出现Whitelabel Error Page的解决

    这篇文章主要介绍了SpringBoot项目网页加载出现Whitelabel Error Page的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • springboot整合flowable框架入门步骤

    springboot整合flowable框架入门步骤

    最近工作中有用到工作流的开发,引入了flowable工作流框架,在此记录一下springboot整合flowable工作流框架的过程,感兴趣的朋友一起看看吧
    2022-04-04
  • Java中BigDecimal的加减乘除、比较大小与使用注意事项

    Java中BigDecimal的加减乘除、比较大小与使用注意事项

    对于不需要任何准确计算精度的数字可以直接使用float或double,但是如果需要精确计算的结果,则必须使用BigDecimal类,而且使用BigDecimal类也可以进行大数的操作,下面这篇文章给大家介绍了Java中BigDecimal的加减乘除、比较大小与使用注意事项,需要的朋友可以参考下。
    2017-11-11

最新评论