2021.4.27:包

说明

简单来说,就是存放.java文件的文件夹

自定义包所在文件夹是工程文件下的src目录

 

Java定义了一种名字空间,称之为包(package)一个类总是属于某个包类名只是一个简写,真正的完整类名是包名.类名

在定义class时,我们需要在第一行声明这个class属于哪个包

例如,小明写了一个Person类,放在Person.java文件中:

package ming;//说明package名
public class Person{}

JVM执行时,只看完整类名,因此只要包名不同,类就不同。

 

包可以是多层结构,用.隔开,比如java.util,Java包没有父子/继承关系,java.utiljava.util.zip是不同的包。

 

没有定义包名class,它使用的是默认包,容易引起名字冲突,因此不推荐不写包名的做法。

所有Java文件(.java)对应的目录层次在src目录下。编译后的.class文件也需要按照包的结构存放,把编译后的.class文件放在bin目录下。

包作用域

位于同一个包的类,可以访问包作用域中的属性和方法。

不用public、protected、private修饰的属性和方法就是包作用域。

引用其他class

在一个class中,我们总会引用其他的class,例如,假如我们在包pack1中的类Person中,要引用pack2包中的类Arrays,有三种写法:

①直接在使用时将包名.类名写完整;(最不常用)

package pack1;

public class Person{
    public void run(){
        pack2.Arrays arrays = new pack2.Arrays();
    }
}

②使用import导入包名.类名;(最常用)

复制代码
package pack1;

import pack2.Arrays;

public class Person{
    public void run(){
        Arrays arrays=new Arrays();
    }
}
复制代码

补充

在写import时,可以通过*导入某个包下的所有class(但不包括子包中的class);不推荐,因为导入了多个包后,很难看出某个类属于哪个包。

packpage pack1;

import pack2.*;

import static:导入一个类的静态字段、静态方法(很少用)

复制代码
package pack1;

import static java.lang.System.*;

public class Main{
    public static void main(String [] args){
        out.println("Hello,world!");
    }
}
复制代码

编译流程

Java编译器最终编译出的.class文件只使用完整类名,因此在代码中,当编译器遇到一个class名称时:

  • 完整类名,编译器可以根据完整类名查找这个class
  • 如果是简单类名,就按以下顺序查找:
    • 当前package是否存在该class;
    • 查找import的包中是否包含该class;
    • 查找java.lang包是否包含该class;

如果按照以上规则还无法确定class,则编译报错。

其他

编译class时,编译器会自动帮我们做两个import动作:

  • 默认import当前包的所有class;
  • 默认import java.lang.*

如果有两个class类名相同,例如pack2.Arraysjava.util.Arrays,那么只能import其中一个,另一个必须写完整名

总结

  1. 包是存放.java文件的文件夹,自定义包总是在src目录下;
  2. 程序首行指明该程序所属的包,写法:package 包名;
  3. JVM执行程序时,会自动把类名编译成为完整的类名(带有包名前缀)
  4. 位于同一个包的类,可以彼此直接访问不用import导入,此外也可以访问其他的不用public、private、protected修饰的类、方法、属性
  5. 引用其他class的三种方法
    • 写完整包名.类名;(最不常用)
    • import 包名.类名(最常用)
    • import static导入一个类的静态方法;(有用但少用,只要用在工具类中常用方法的导入)
  6. 编译:
    • 默认import当前包的所有class
    • 默认import java.lang.*
    • 编译时class检查顺序:
      • 当前package;
      • import导入的package;
      • java.lang包
  7. 如果两个class重名,则其中一个必须写全包名.类名
posted @   ShineLe  阅读(36)  评论(0编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
点击右上角即可分享
微信分享提示