Access control ( or implementation hiding) is about "not getting it right the first time."

refactoring

a primary consideration in object-oriented design is to "separate the thins that change from the thing that stay the same

To solve this problem, Java provides access specifiers: public, protected, package acess( which has no keyword), and private

package bundled the components together into a cohesive library unit. The acess specifiers are affected by whether a class is in the same package or in a seperate package.

package: the library unit

  a package contains a group of classes, organized together under a single namespace.

  The reason for all this importing is to provide a mechanism to manage namespaces.

  for example: cn.ada.util.testUtils 与 cn.bbs.util.testUtils

  the "unnamed" or default package

  When you create a source-code file for Java, it's commonly called a compilation unit ( sometimes a translation unit). Each compilation unit must have a name ending in .java, and inside the compilation unit there can be a public class that must have the same name as the file (including capitalization). The can be only one public class in each compilation unit.

  If there are additional classes in that compilation unit, they are hidden from the world outside that package because they're not public, and they comprise "support" classes for the main public class.

  Code organization

  When you compile a .java file, you get an output file for each class in the .java file.

  A working program is a bunch of .class files, which can be packaged and compressed into a Java Archive (JAR) file (using Java's jar archiver). The Java interpreter is responsible for finding, loading, and interpreting these files.

  If you want to say that all the components (each in its own separate .java and .class files) belong together, that's where the package keyword comes in.

  If you use a package statement, it must appear as the first non-comment in the file.

  Note that the convention for Java package names is to use all lowercase letters, even for intermediate words.

  What the package and import keywords allow you to do is to divide up the single global namespace so you won't have clashing names.

  Creating unique package names

  Since a package never really gets "packaged" into a single file, a package can be made up of many .class files, and things could get a bit clutters.

  To prevent this, a logical thing to do is to place all the .class files for a particular package into a single directory. This is one way that Java references the problem of clutter; you'll see the other way latter when the java utility is introduced.

  Collection the package files into a single subdirectory solves two other problems:

    1. creating unique package names

    2. finding those classes

  This is accomplished by encoding the path of the location of the .class file into the name of the package.

  By convention, the first part of the package name is the reversed Internet domain name of the creator of the class. Since Internet domain names are guaranteed to be unique.

  The Java interpreter proceeds as follows. First, it finds the environment variable CLASSPATH3 (set via the operating system, and sometimes by the installation program that installs Java or a Java-based tool on your machine). CLASSPATH contains one or more directories that are used as roots in a search for .class files. Starting at that root, the interpreter will take the package name and replace each dot with a slash to generate a path name off of the CLASSPATH root (so package foo.bar.baz becomes foo\bar\baz or foo/bar/baz or possibly something else, depending on your operating system). This is then concatenated to the various entries in the CLASSPATH. That’s where it looks for the .class file with the name corresponding to the class you’re trying to create. (It also searches some standard directories relative to where the Java interpreter resides.)

  There's a variation when using JAR files, however. You must put the actual name of the JAR file in the classpath, not just the path where it's located.

  for example: CLASSPATH=.;D:\JAVA\LIB;D\JAVA\LIB\grape.jar

  Setting the CLASSPATH has been such a trial for beginning Java users (it was for me, when I started) that Sun made the JDK in later versions of Java a bit smarter. You’ll find that when you install it, even if you don’t set the CLASSPATH, you’ll be able to compile and run basic Java programs.

Collisions

  as long as you don't write the code that actually causes the collision, everything is OK--this is good, because otherwise you might end up doing a lot of typing to prevent collisions that would never happen.

  question: Vector exist in net.mindview.simple and java.util

      Vector v = new Vector(); //Collision, how to solve

  way 1: import net.mindview.simple.*;

       import java.util.*;

      java.util Vector v = new java.util.Vector(); // completely specifies the location of that Vector

  way 2: import net.mindview.simple.*;

      import java.util.Vector; //single-class import (don't use both colliding names in the same program

  A custom tool library

  static import的妙用

  import static new.mindview.util.Print.*; // 导入Print类中的static 属性和方法

  然后即可直接使用这些static属性和方法(不需要类名的限定)

  Using imports to change behavior

  You can accomplish this by changing the package that's imported in order to change the code used in your program form the debug version to the production version.

  Package caveat

  It's worth remembering that anytime you create a package, you implicitly specify a directory structure when you give the package a name.

  The package must live in the directory indicated by its name, which must be a directory that is searchable starting from the CLASSPATH.

Java access specifiers     

  Package access

  all the other classes in the current package have access to the member, but to all the classes outside of this package, the member appears to be private.

  Package access allows you to group related classes together in a package so that they can easily interact with each other.

  public: interface access

  The default package

  private: you can't touch that

  protected: inheritance access

  protected also gives package access—that is, other classes in the same package may access protected elements.

  protected: 在default package的基础,加了子类可以访问父类的属性或方法

Interface and implementation

  Wrapping data and methods within classes in combination with implementation hiding is often called encapsulation. The result is a data type with characteristics and behaviors.

  For clarity, you might prefer a style of creating classes that puts the public members at the beginning, followd by the protected, package-access, and private members. The advantage is that the user of the class can then read down from the top and see first what's important to them, and stop reading when they encounter the non-public members.

  Displaying the interface to the comsumer of a class is really the job of the class browser.

Class Access

  public and default package

  It is possible, though not typical, to have a compilation unit with no public class at all. In the case, you can name the file whatever you like.

  If a class that you're only using to accomplish the tasks performed by some public class in a package, and you think that sometime later you might want to completely change things and rip out your class altogether, subsitituting a different one. To accomplish this, you just leave the public keyword off the class, in which case it has package access (That class can be used only within that package.)

  When you create a package-access class, it still make sense to make the fields of the class private--you should always make fields as private as possible--but it's generally reasonable to give the methods the same access as the class (package access).

  Note that a class cannot to be private or protected.

  (Actually, an inner class can be private or protected, but that's a special case.)

  making all the constructors private, and create a static method that creates a new Object and return a reference to it. This can be useful:

    1. if you want to do some extra operations on the object before returning it

    2. if you want to keep count of how many objects to create. (如Singleton 单例模式)

  However, if a static member of the default package class is public, the client programmer can still access the static member even though they cannot create an object of that class.(实测,是不能访问)

Summary

  Notice that access control focuses on a relationship--and a kind of communication--between a library creator and the external clients of that library. There are many situations where this is not the case. For example, you are writing all the code yourself, or you are working in close quarters with a small team and everything goes into the same package. These situations have a different kind of communication, and rigid adherence to access rule may not be optimal. Default (package) access may be just fine.

  

最新文章

  1. 巧用 mask-image 实现简单进度加载界面
  2. Bitmap文件格式+生成一个BMP文件
  3. 【学】React的学习之旅2 - React Component的生命周期
  4. django ATOMIC_REQUESTS
  5. 使用RMAN DUPLICATE...FROM ACTIVE DATABASE创建物理standby database
  6. Hadoop - 任务调度系统比较
  7. php 三元运算符使用说明和写法
  8. 夺命雷公狗---node.js---14之DNS
  9. DE1-SOC开发板上搭建NIOS II处理器运行UCOS II
  10. COJ 3012 LZJ的问题 (有向图判环)
  11. bzoj4819 [Sdoi2017]新生舞会
  12. JavaBean编辑器的简单介绍
  13. ajax的跨域请求
  14. 将PPT文件内容转换为图片放在Email邮件正文中发送
  15. SA / SAM 题目集
  16. 微信sdk 图片上传 两种方法 上传一张显示一张 并附带微信图片放大功能和删除功能
  17. python windows环境下安装
  18. webpack打包vue文件报错,但是cnpm run dev正常,最后我只想说:是我太笨,还是webpack4.4版本太坑
  19. iOS Dev (25) 解决“The executable was signed with invalid entitlements.”问题
  20. 解决php编译报错configure: error: mcrypt.h not found. Please reinstall libmcrypt.

热门文章

  1. 部署harbor以https模式和k8s对接
  2. 动态规划-LCS-Uncrossed Lines
  3. 检测页面是否允许使用Flash
  4. 《自拍教程51》Python_adb批量生成App版本表格
  5. 从ISTIO熔断说起-轻舟网关熔断
  6. python文件调用方法
  7. HashMap中使用自定义类作为Key时,为何要重写HashCode和Equals方法
  8. [tyvj2032]升降梯上<dp&spfa>
  9. 用全站 CDN 部署 Discourse 论坛
  10. lly的数列询问(最小生成树 + 思维)