【0】README

0.1)本文转自 core java volume 1, 旨在理清 包和类导入的相关知识;


【1】 包

1.1) java 允许使用包将类组织起来,包可以方便组织代码,并将自己的代码与别人提供的代码库分开管理;
1.2) 标准的java 类库分别在多个包中, 包括 java.lang、java.util 和java.net;所有标准的 java 包都处于java 和 javax 包层次中;
1.3) 使用包的主要原因是确保类名的唯一性;且为了保证包名的绝对唯一,Sun 公司建议将公司的因特网域名以逆序的形式作为包名;


【2】 类的导入

2.1)一个类可以使用所属包中的所有类,以及其他包中的共有类;
2.2)我们可以采用两种方式访问另一个包中的公有类:

  • 第一种方式是: 在类名之前添加完整的包名; java.util.Date today = new java.util.Date();
  • 第二种方式是:更简单的方式是 使用import 语句;

Attention)需要注意的是, 只能使用星号(*)导入一个包, 而不能使用 import java.* 或 import java.*.* 导入以 java为前缀的所有包;
2.3)出现的问题+解决方法:当类名发生命名冲突的时候,就要注意包名, 看个荔枝:
如,java.util 和 java.sql 都有日期类Date, 如果导入了两个包:

import java.util.* ;
import java.sql.*;
  • 2.3.1)问题: 那么在程序中使用的Date类的时候,就会出现编译错误;
  • 2.3.1)解决方法: 此时编译器无法确定程序使用的是哪一个Date 类;可以增加一个 import语句来解决这个问题:
import java.util.* ;
import java.sql.*;
import java.util.Date ;
  • 2.3.2)问题: 如果这两个 Date 类都需要使用;
  • 2.3.2)解决方法: 在每个类名的前面加上完整的包名:
java.util.Date today = new java.util.Date();
java.sql.Date today = new java.sql.Date();

在包中定位类是编译器的工作, 类文件中的字节码肯定使用完整的包名来引用其他类;


【3】 静态导入

3.1) import语句不仅可以导入类,还增加了导入静态方法和静态域的功能;
3.2)看个荔枝(导入静态域 和 静态方法):
如,添加一条指令, import static java.lang.System.*; 就可以使用 System类的静态方法和静态域, 而不必加类名前缀:

out.println("hello, world");
exit(0);

3.3)看个荔枝(导入特定的方法和域):

import static java.lang.Math.sqrt;
import static java.lang.Math.pow;
import static java.lang.System.out;public static void main(String[] args){double aDouble;aDouble = sqrt(4);out.printf("%4f", pow(aDouble, 2));}


我们还可以看到 sqrt(pow(x, 2) + pow(y, 2)) 看起来要比 Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)) 清晰多了;


【4】 将类放入包中

4.1)要想将类放入包中, 就必须将包的名字放在源文件的开头, 包中定义类的代码之前;
4.2)默认包:如果没有在 源文件中放置 package 语句, 这个源文件的类就被放置在默认包中;
4.3)将包中的文件放到与完整包名匹配的子目录中, 如, com.horstmann.corejava 包中的所有源文件应该被放置在 子目录 com/hosrtman/corejava 中;编译器将类文件也放在相同的目录结构中;
4.4)需要注意: 编译器对文件(带有文件分隔符 和 扩展名.java 的文件)进行操作, 而java 解释器加载类(带有点(.)分隔符), 如(.号 和 /号 的区别)

javac com/mycompany/Pay.java
java com.mycompany.Pay.java

Alert)编译器在编译源文件的时候不检查目录结构(但该程序却无法运行):
如, 假定有一个源文件开头有下列语句: package com.mycompany;即使这个源文件没有在子目录 com/mycompany 下,也可以进行编译;如果它不依赖于其他包, 就不会出现编译错误。但是,最终的出程序将无法运行,因为虚拟机找不到类文件;


【5】包的作用域

1)如果没有指定 public 或 private, 那么这个部分(类、方法或变量)可以被同一个包中的所有方法访问;
Attention)

  • A1) JDK 的实现者修改了类加载器, 明确禁止加载用户自定义的、包名以“java.” 开始的类!
  • A2)可以通过 包密封机制 来解决将各种包混杂在一起的问题, 如果将一个包密封起来,就不能再向这个包添加类了;( 制作包含密封包的 JAR 文件的方法)

包+类导入+静态导入+类放入包中+包作用域相关推荐

  1. war包放入tomcat中无法自动解压

    war包放入tomcat中无法自动解压 最近想重温下tomcat的部署流程,就写了个springMVC项目,打包后放到tomcat 的webapps目录,访问失败,发现启动tomcat后无法自动解压. ...

  2. 如何评估数据适不适合放入Redis中?

    当项目中引入了 Redis 做分布式缓存,那么就会面临这样的问题: 哪些数据应该放到缓存中?依据是什么? 缓存数据是采用主动刷新还是过期自动失效? 如果采用过期自动失效,那么失效时间如何制定? 正好这 ...

  3. 练习---爬取薄荷网所有食物卡路里,并分类放入excel中

    首先薄荷网里有11种大的食物分类,每种大的食物分类里有10页,每页10个食物及热量记录.本来想把这一共110个url都放入queue队列中,然后爬取,但是这样会打乱食物的分类,所以就只把每个食物大类的 ...

  4. python列表、字典text:用户输入整数n,生成长度为n的列表,将n个随机数放入列表中

    1.用户输入整数n,生成长度为N的列表,将n个随机的奇数放入列表中 #导入随机数模块 import random #input录入str 需转为int enter = int(input('请输入一个 ...

  5. set是无序集合,放入set中的元素通过iterator输出时候是无序的

    set是无序集合,放入set中的元素通过iterator输出时候是无序的 HashMap<String , String> hashMap = new HashMap<String ...

  6. 【Qt】QStackedWidget:将多个窗口控件放入堆中,每次只显示一个窗口控件

    1.简介 QStackedWidget可以容纳多个窗口控件,每次只显示其中一个.例如:登录页面.各种功能页面等不同时显示的窗口,可以放入QStackedWidget中. 2.demo // 创建三个页 ...

  7. OC--有这么一个 整数 123456789,如何将这个整数的每一位数,从末位开始依次放入数组中,并遍历 倒序输出字符串...

    有这么一个 整数 123456789,如何将这个整数的每一位数,从末位开始依次放入数组中,并遍历 1 NSInteger num=123456789; 2 NSString *str=[[NSStri ...

  8. java jsp js xml_jsp实现将信息放入xml中的方法

    本文实例讲述了jsp实现将信息放入xml中的方法.分享给大家供大家参考,具体如下: 一.jsp代码: 省: 北京 广东 海南 市: 北京 二.ajax代码创建服务器请求代码不用写了,写onchange ...

  9. python读取一行数组_python 把文件中的每一行以数组的元素放入数组中的方法

    有时候需要把文件中的数据放入到数组中,这里提供了一种方法,可以根据文件结尾的标记进行数据拆分,然后再把拆分的文件放入数组中 # -*-coding: utf-8 -*- f = open(" ...

  10. java怎么把数据封进对象里_(Java)想把数组中一条一条的数据全部放入对象中去..要怎么做呢...

    展开全部 Java把数组中一条一条的数据全部放入对象中去操作如下: 1.先获取到数组中的数据dataArray数据. 2.接32313133353236313431303231363533e58685 ...

最新文章

  1. SharePoint迁移和升级方案
  2. linux 查找目录或文件详解
  3. 插入ts以及判断列是否存在(支持多数据库)
  4. 洛谷1967货车运输
  5. python逐行读取数据时出现错误_python如何逐行读取数据
  6. php+ksort+返回true,PHP preg_replace函数
  7. java selenium用js点击_Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?...
  8. JS-面向对象-创建具有私有属性的构造函数(2种方法)
  9. FD.io VPP基本介绍:理解向量包处理(VPP)
  10. Swift中类与结构的初始化
  11. UML类图各符号含义
  12. 今天开始,吾使用手机上的五笔输入法
  13. Python实现SPGD(SGD)优化算法
  14. springboot毕设项目北理珠青协志愿素拓系统eaa9n(java+VUE+Mybatis+Maven+Mysql)
  15. 标准c语言教程gary,C语言标准教程
  16. (logN)²是O(N)的
  17. java经典50道编程题(很好练逻辑思维的题)(第一篇)
  18. 数算(Python)——牛顿迭代法(巴比伦算法)求解平方根
  19. How to become a hacker 译文(如何成为一名黑客)
  20. gparted给ubuntu系统扩容

热门文章

  1. 2021牛客第五场 I.Interval Queries-回滚莫队
  2. 牛客网 【每日一题】5月28日题目精讲 Protecting the Flowers
  3. 牛客网【每日一题】5月1日题目 [SCOI2012]滑雪与时间胶囊
  4. 【无码专区7】括号序列(思维)
  5. 【周末狂欢赛6】[AT1219]历史研究(回滚莫队),大魔法师(矩阵+线段树),单峰排列
  6. 51nod1355-斐波那契的最小公倍数【min-max容斥】
  7. P3521-[POI2011]ROT-Tree【线段树合并】
  8. jzoj6276-[Noip提高组模拟1]树【线段树,扫描线,倍增】
  9. P3085,jzoj3234-[USACO13OPEN]阴和阳【点分治】
  10. jzoj3518-进化序列(evolve)【位运算】