zoukankan      html  css  js  c++  java
  • 包+类导入+静态导入+类放入包中+包作用域

    【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 文件的方法)
  • 相关阅读:
    Spring框架之环绕增强
    Spring框架之最终增强
    Spring框架使用注解实现IOC的配置
    [算法] 带有条件的全排列 [dfs + set]
    [算法] 字符串的全排列 [dfs 递归神技]
    [面试] 十七道海量数据处理面试题与Bitmap详解 [未细看]
    [算法] 输出 字符串的全部子组合 [dfs 递归神技]
    [linux] 进程间通讯的几种方式
    [面试] 在数组查找这样的数,它大于等于左侧所有数,小于等于右侧所有数
    [算法] 彻头彻尾理解二分检索 6 种变换
  • 原文地址:https://www.cnblogs.com/pacoson/p/4926388.html
Copyright © 2011-2022 走看看