浅谈Java三大特性之封装
2020/01/14 10:27:57 来源:cnblogs.com/yhycoder 作者:yhycoder

三大特性之浅谈封装

前言

英语:Encapsulation——封装,包装。

面向对象的封装与真实世界的目的是一样的。封装能够使外部访问者不能随意存取对象的内部数据,隐藏了对象的内部细节,只保留有限的对外接口。外部访问者不用关心对象的内部细节,使得操作对象变得简单。

好处

先通过阅读下面的文字,再回来理解可能会更好一点

  1. 减少了耦合(物理学上类似相互影响的概念)
  2. 便于维护和修改
  3. 可以隐藏信息,一些具体实现代码,安全性
  4. 对成员变量精准控制

介绍(实现方式)

  1. Java 面向对象的封装性是通过对成员变量和方法进行访问控制实现的。这里就涉及到了访问控制的四个关键字了。

    类别\不同地方同一个类同一个包不同包的子类不同包非子类
    私有的(private) Yes No No No
    默认 Yes Yes No No
    保护的(protected) Yes Yes Yes No
    公有的(public) Yes Yes Yes Yes
  2. 封装是一种保护作用,将其变量以及方法保护起来,防止被随机访问,所以一定程度上增强了代码的安全性。

示例

image.png

  private还可以防止直接访问特定的构造器(或全部的构造器)
    package music.daima.ebook;
class TestClass{
    private TestClass(){}
    static TestClass make(){
        return new TestClass();
    }
}


public class PrivateDaiMa {
    public static void main(String args[]){
//        TestClass x = new TestClass();
        TestClass x = TestClass.make();
//        不能通过构造器来创建TestClass,要通过调用make方法才可以
    }
}

报错信息说明TestClass的private将其构造器给私有化了,不能直接访问。

image.png

在其它包访问,就会报错,因为在Music里面这个BaoHu的方法用的是protected修饰的。

image2.png

其实在Idea写代码时候,定义的属性之类可以在左下角有个概览,可以查看是什么类型的

image.png

import music.Music;//导入了music包的Music类


class test{
    test(int i){

        i = i + 1;

    }
    private String name;//将其变为public String name;的话下面就可以访问
    public int num=2;//公有的可以被访问
    double i = 2.2;//默认的定义,也可以被访问,在本包里面

}
public class FengZhuang {
    public static void  main(String args[]){
       test a = new test(6);
        System.out.println(a.num);
        //a.name就会报错,因为在上面的name是私有的
        Music ceshi = new Music();//导入了不同的包中的类

//        ceshi.BaoHu();报错,是在其它包里的protected方法

    }
}

小结

访问成员有两种方式:一种是调用,即通过类或对象调用它的成员,如p.printX()语句;另一种是继承,即子类继承父类的成员变量和方法。在开发使用的时候,应该尽量限制类中成员的可见性

  1. 公有访问级别任何情况下两种方式都可以;(public)

  2. 默认访问级别在同一包中两种访问方式都可以,不能在包之外访问;()

  3. 保护访问级别在同一包中与默认访问级别一样,两种访问方式都可以。但是在不同包之

    外只能继承访问;(protected)

  4. 私有访问级别只能在本类中通过调用方法访问,不能继承访问。(private)

感谢阅读!


6

本栏最新