Java之封装与访问权限控制(二)

访问权限控制是具体实现的隐藏,是封装性的一部分体现。前面提到几个访问控制修饰符,是访问权限控制的一部分。接下来要探讨这块另一个重要的概念,包(package)

包:库单元

包解决了什么问题?

Java作为面向对象程序设计语言,"高内聚,低耦合"是设计的目标。既然这样,如何能做到高内聚,如何有效管理这些内聚的构件,包就是充当这一角色。包机制提供了类的多层命名空间(类似于C++中的命名空间namespace),很好解决了类命名冲突及类文件管理的问题。可以说,包确保了类名的唯一性

Java编译:

  • 在编译一个.java文件时,其中每个类都会有一个输出文件。
  • 输出文件名和对应类地文件名相同,只是多了个后缀名.class
  • Java的可运行程序是一组可以打包并压缩为一个Java文档文件(JAR)的.class文件。
  • Java解释器负责查找、装载和解释这些文件。

如何理解呢?类库实际就是一组类文件,每个文件中都有一个public类和若干个非public类,所以每个文件都有一个构件,package可以让这些构件从属于同一个群组。

package语句必须是除注释以外的第一句程序代码:package+包名。包名格式是一串由.分隔的小写英文单词,为了取一个独一无二的包名,一般以域名(显然独一无二)逆序作为包名。

值得注意的是,在给定包名时就已经隐含地指定了目录结构。

Java解释器的运行过程:

  • 在环境变量CLASSPATH中查找.class文件的根目录。
  • 从根目录开始,将包名中的.替换成反斜杠(依据操作系统不同而不同),得到路径。
  • 将路径与CLASSPATH中的各个不同的项相连。
  • 在这些目录中查找.class文件。

但是需要注意:编译器在编译源文件的时候不会检查目录结构,也就是说,如果源文件没有在指定的目录下,编译不会出现错误,但是无法运行程序,因为包与目录不匹配,虚拟机找不到对应的类。

  • 建议将.java源文件和.class文件分开存放,利于管理。
  • 如果没有显示指定package语句,则处在默认包下,但是不建议。
  • 同一个包下的类可以自由访问,但是假如在com再创建一个sub子包,那么这时处在两个包下的类是不能直接访问的,而需要带上类的全名(包名+类名),也就是说,嵌套的包之间毫无关系,每个都拥有独立的集合。

说实话,关于包这部分还是有些稀里糊涂,等待后续补充~

import

不同包之间的类相互访问时,为了解决每次都需要带上类的全名的繁杂难题,import应运而生。

  • import语句需要出现在package语句之后,类定义之前。
  • import可以向某个Java文件中导入指定包层次下某个类或全部类。
    • 假如现在想导入com.my.pac06包下的Overload类:import com.my.pac06.Overload;
    • 假如想导入还是这个包中的所有类(是类!不是包!):import com.my.pac06.*;
  • import导入类之后,在使用类时就可以省略包前缀(包名),直接用类名。

特殊情况:

  • 如果两个包中含有名字相同的类,且这两个包都要用到,例如java.sql中和java.util中都有Date类,我们在同时导入时,系统就不知道该怎么办了。这时就需要重新使用类的全名java.sql.Date date = new java.sql.Date(6);,没办法,import也救不了。
package com.my.pac08;

import java.sql.*;
import java.util.*; public class Tesr {
/*Reference to'Date' is ambiguous,both
* 'java.sql.Date'and'java.util.Date'match*/
// Date date = new Date();
java.sql.Date date = new java.sql.Date(6);
}
  • Java默认为所有源文件导入java.lang包下的所有类,我们常用的String和System类再用的时候就没有需要import导入的情况。

import static

静态导入,与import功能类似,不同在于import static用于导入指定类的某个静态成员变量、方法或全部的静态成员变量、方法。

package com.my.pac08;
//静态导入 java.lang.System类的静态成员变量out
import static java.lang.System.out;
//同理的,导入所有静态成员变量
//import static java.lang.System.*;
public class Test {
public static void main(String[] args) {
//静态导入之后,可以直接省略类名
out.println("Hello,World!");
}
}

Java常用包

Java的核心类位于java包及其子包下。

Java扩展的很多类位于javax包及其子包下。

以下罗列Java常用包:

  • java.lang:包含Java许多核心类,诸如String,Math,System,Thread。无需import导入,因为系统自动导入该包。

  • java.util:Java大量工具类/接口和集合框架类/接口,诸如Arrays,List,Set等。

  • java.net:包含Java网络编程相关类/接口。

  • java.io:包含Java输入输出编程相关的类/接口。

  • java.text:包含Java格式化相关的类。

  • java.sql:包含Java进行JDBC数据库编程的相关类/接口。

参考书籍:《疯狂Java讲义》、《Java编程思想》、《Java核心技术卷I》

Java之封装与访问权限控制(二)的更多相关文章

  1. Java之封装与访问权限控制(一)

    目录 Java之封装与访问权限控制(一) 封装的概念 访问控制符 属性私有化 Java之封装与访问权限控制(一) 对于封装的概念,我总觉得自己还是挺了解的,但是真要我说,还真说不出个啥来.我只能默默地 ...

  2. Java编程思想之六访问权限控制

    访问控制(或隐藏具体实现)与"最初的实现并不恰当"有关. 访问权限控制的等级,从最大权限到最小权限依次为:public,protected,包访问权限(没有关键字)和private ...

  3. java基础-类成员访问权限控制

    一 前言 这篇文章是很基础的一文,没多大深度,对于开发人员必然是熟练于心.本篇文章的主题是为什么java要设置类成员访问级别?其原因也很简单,就是为了面向对象的封装特性:将类成员使用不同的访问级别控制 ...

  4. 初读"Thinking in Java"读书笔记之第六章 --- 访问权限控制

    包:库单元 包内包含有一组类,他们在单一的名字空间下被组织在一起. 通过import ***.***.*可以将某个包下的所有类导入到当前文件中. 每个Java源文件最多只能有一个public类,且名称 ...

  5. JAVA笔记 -- 访问权限控制

    访问权限控制 没有权限控制的时候,由于所有的接口都是可以访问的.当一个类库部分代码,发现有更好的方法解决的时候,可能其他接口会发生改动.这会导致另一个地方的引用该类库的程序发生崩溃.为了解决这种问题, ...

  6. (转)浅析Java中的访问权限控制

    原文地址: http://www.cnblogs.com/dolphin0520/p/3734915.html 今天我们来一起了解一下Java语言中的访问权限控制.在讨论访问权限控制之前,先来讨论一下 ...

  7. 浅析Java中的访问权限控制

    浅析Java中的访问权限控制 今天我们来一起了解一下Java语言中的访问权限控制.在讨论访问权限控制之前,先来讨论一下为何需要访问权限控制.考虑两个场景: 场景1:工程师A编写了一个类ClassA,但 ...

  8. JAVA访问权限控制[zhuan]

    Java的访问权限控制修饰符,从最大权限到最小权限依次是:public.protected.包访问权限(默认,没有关键字)和private.对于类的访问权限只能是:public和包访问权限(但内部类可 ...

  9. Java访问权限控制

    访问权限控制           java提供了访问权限修饰词,以供类库开发人员向客户端程序员指明哪些是可用的,哪些是不可用的.访问权限控制的等级,从最大权限到最小权限依次是:public.prote ...

随机推荐

  1. 王晶:华为云OCR文字识别服务技术实践、底层框架及应用场景 | AI ProCon 2019

    演讲嘉宾 | 王晶(华为云人工智能高级算法工程师王晶) 出品 | AI科技大本营(ID:rgznai100) 近期,由 CSDN 主办的 2019 中国AI 开发者大会(AI ProCon 2019) ...

  2. eclipse m2eclipse 从Maven的本地库中读取依赖库

    在Mac pro的终端中执行命令 mvn package 后,已经把该工程所需要的依赖库(dependancies)下载到本地库,但在把该工程 import 到 eclipse中时,发现m2eclip ...

  3. 记一次Elasticsearch OOM的优化过程——基于segments force merge 和 store type 转为 niofs

    首选,说明笔者的机器环境(不结合环境谈解决方案都是耍流氓): cpu 32核,内存128G,非固态硬盘: RAID0 (4T * 6),单节点,数据量在700G到1800G,索引15亿~21亿.敖丙大 ...

  4. [FPGA]Verilog 60s秒表计时器(最大可计时间长达9min)

    [FPGA]Verilog 60s秒表计时器 1.引述 这次的实验来自于本人本科课程数电结课时的自选题目.由于这次上传是后知后觉,学校已将小脚丫板子回收,所以在这篇文章中没法贴出代码结果的效果图了,但 ...

  5. 计算机二级Python

    概述 计算机二级在近两年新加了python的选择,趁机考了一下,顺便记录一下学习的一些所获 第一章 程序设计语言概述 考纲考点: 这一部分主要是介绍计算机语言的公共常识,一些尝试我就按照自己的理解方式 ...

  6. VMware Fushion解决:与vmmon模块的版本不匹配: 需要385.0,现有330.0。

    可以按下列步骤解决: 1. 退出VMware fusion2. 打开[终端]3. 执行命令:sudo rm -rf /System/Library/Extensions/vmmon.kext ,根据提 ...

  7. 在Linux系统下制作系统启动盘(Ubuntu Linux)

    在Linux系统下制作系统启动盘有两种方法: 1.用dd命令 2.用Linux自带的图形界面工具 Startup Disk Creator 本教程使用第2种方式,用Linux自带的图形界面工具制作系统 ...

  8. 2.java三大特性

    1. 封装 方法:将属性值修饰为私有,提供get和set方法.造成所有对对象的访问都是通过方法的调用来完成(配合this的使用) 结果:用户不能直接随意改变一个对象内的属性,必须通过调用方法(验证)来 ...

  9. 聊一聊 Vue 中 watch 对象中的回调函数为什么不能是箭头函数?

    聊一聊 Vue 中 watch 对象中的回调函数为什么不能是箭头函数 本文重点知识点速览: Vue 中的 watch 对象中的回调函数不能是箭头函数. 箭头函数中的 this 指向的是函数定义时所在的 ...

  10. 解决logstash.outputs.elasticsearch[main] Could not index event to Elasticsearch status 404

    现象:lostack启动正常,logstack收集输入redis数据,输出到elasticsearch写入失败 提示:去建索引 的时候elasticsearch返回404 [2019-11-12T11 ...