Java学习-访问权限控制

Java学习-访问权限控制

1、为什么要有访问权限控制?

2、包:库单元

3、Java访问权限修饰词


1、为什么要有访问权限控制?

访问控制(或隐藏具体实现)与“最初的实现并不恰当”有关。
       所有优秀的作者,包括那些编写软件的程序员,都清楚其著作的某些部分直至重新创作的时候才变得完美,有时甚至要反复重写多次。如果你把一个代码段放到了某个位置,等过一会儿回头再看时,有可能会发现有更好的方式去实现相同的功能。这正是重构的原动力之一,重构即重写代码,以使得它更可读、更易理解,并因此而更具可维护性。但是,在这种修改和完善代码的愿望之下,也存在着巨大的压力。通常总是会有一些消费者(客户端程序员)需要你的代码在某些方面保持不变。因此你想改变代码,而他们却想让代码保持不变。由此而产生了在面向对象设计中需要考虑的一一个基本问题:“如何把变动的事物与保持不变的事物区分开来”。
       这对类库(library) 而言尤为重要。该类库的消费者必须依赖他所使用的那部分类库,并且能够知道如果类库出现了新版本,他们并不需要改写代码。从另一个方面来说,类库的开发者必须有权限进行修改和改进,并确保客户代码不会因为这些改动而受到影响。 这一目标可以通过约定来达到。例如,类库开发者必须同意在改动类库中的类时不得删除任何现有方法,因为那样会破坏客户端程序员的代码。但是,与之相反的情况会更加棘手。在有域(即数据成员)存在的情况下,类库开发者要怎样才能知道究竟都有哪些域已经被客户端程序员所调用了呢?这对于方法仅为类的实现的一部分,因此并不想让客户端程序员直接使用的情况来说同样如此。如果程序开发者想要移除旧的实现而要添加新的实现时,结果将会怎样呢?改动任何一个成员都有可能破坏客户端程序员的代码。于是类库开发者会手脚被缚,无法对任何事物进行改动。
      为了解决这一问题,Java提供了访问权限修饰词,以供类库开发人员向客户端程序员指明
哪些是可用的,哪些是不可用的。访向权限控制的等级,从最大权限到最小权限依次为:

public、protected、包访问权限(没有关键词称为"缺省")和private

构件类库的概念以及对于谁有权取用该类库构件的控制问题都还是不完善的。其中仍旧存在着如何将构件捆绑到一个内聚的类库单元中的问题。对于这一点,Java用关键字package加以控制,而访问权限修饰词会因类是存在于一个相同的包,还是存在于一个单独的包而受到影响。

2、包:库单元

包内包含有一组类,它们在单一的名字空间之下被组织到一起。

      例如,在Java的标准发布中有一个工具库,它被组织在java.util名字空间下。java.util中有一个叫做ArrayList的类,使用ArrayList的一种方式是用其全名java.util.ArrayList来指定。

public class F{
    public static void main(String[] args)
    {
        java.util.ArrayList list = new java.util.ArrayList();
    }
}

这样就使得程序变得很冗长,因此可以转而用import关键字,如果想要导入单个的类,可以在import语句中命名该类:

import java.util.ArrayList;
public class F{
    public static void main(String[] args)
    {
        ArrayList list = new java.util.ArrayList();
    }
}

现在,就可以不用限定地使用ArrayList了。但是,这样做java.util中的其他类仍旧是都不可以使用的。要想导入其中的所有类,只需要使用"*"

import java.util.*

Java常用的类库:

注意:
     当编写一个.Java源代码文件时,此文件通常被称为编译单元(有时也被称为转译单元)。每个编译单元都必须有一个后缀名.java,而在编译单元内则可以有一个public类,该类的名称必须与文件的名称相同(包括大小写,但不包括文件的后缀名.java)。每个编译单元只能有一一个public类,否则编译器就不会接受。如果在该编译单元之中还有额外的类的话,那么在包之外
的世界是无法看见这些类的,这是因为它们不是public类,而且它们主要用来为主publice类提供
支持。

比如在test包下的test.java文件(编译单元)里面只能有一个和文件名称相同的public 类也就是里面的test类Person类就不能加public限定符了。

同一个test包名下的类test02可以调用Person类

在另一个test03包名下的类test03就不能调用Person类了即使导入了包也不能,

因为它不是public类型的

3、Java访问权限修饰词

  • public:接口访问权限(无论是谁,无论在哪都可以访问

使用关键字public,就意味着public之后紧跟着的成员声明自己对每个人都是有用的,尤其是使用类库的客户程序员更是如此。

  • protected:继承访问权限(子类可以访问父类的public成员和protected成员,但不可以访问父类的private成员
  • (缺省):包访问权限(类内部和同一个包里面的类可以访问(缺省)成员

因为(缺省)没有修饰词,形式如int age ,也就是前面没有任何修饰词

  • private:你无法访问(除了包含该类成员的类之外,其他任何类都无法访问这个成员

为了方便理解和比较准备了以下两张图片

猜你喜欢

转载自blog.csdn.net/weixin_44279178/article/details/107886232