包+类导入+静态导入+类放入包中+包作用域

【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 文件的方法)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值