java中package(包)的使用理解

最近在学习java,在学习到对象和类这一部分时,接触了java中很重要的一个概念:package,也就是包。一开始对于package的使用我产生了许多疑惑,不仅是理论上的,在实际写代码的尝试中也出现了许多意想不到的错误。之后自己查阅了许多博客以及stackoverflow上的一些讲解,再结合编写代码试验,总算是稍微弄清楚了关于package的使用,在此为自己的理解做一个笔记。

package的简单定义如下:package是一个为了方便管理组织java文件的目录结构,并防止不同java文件之间发生命名冲突而存在的一个java特性。不同package中的类的名字可以相同,只是在使用时要带上package的名称加以区分。

在使用package的时候,如果java文件中使用了package,那么该java文件必须放在命名与package名称相同的目录下,比如:

package test;

public class Test {}
该文件的目录结构则为:...test/Test.java

又如:

package com.micheal.test

public class Test {}
java解释器会将package中的.解释为目录分隔符/,也就是说该文件的目录结构为:...com/micheal/test/Test.java

那么package中的类的访问权限是怎么样的呢?在同一package中的类是可以互相访问的,比如:

//Test1.java

package test;

class Test1 {}

//Test2.java

package test;

public class Test2 {
      public static void main(String[] args) {
            Test1 t;
      }
}
由于Test2与Test1在同一个package——test中,所以Test2能够直接调用Test1生成Test1的引用变量t;在命令行进行编译时,直接编译Test2.java即可:javac Test2.java(若没有进入Test1和Test2的目录,需在Test2前加上绝对路径)

若类在不同的package中,那么在一个类中要调用另一个package中的类(必须是public类,非public类不支持不同包间访问),需要在类名前明确加上package名称;不过,java中存在一个让java程序员偷懒的特性,叫做import关键字。使用import就可以在一个package中导入另一个package中的类,不过import和C语言和C++中的#include是不同的,import并不会在当前java文件中嵌入另一个package中的类的代码,只是告诉java文件,不属于该包的类能够到哪里去寻找而已:

package p1;

//import p2.Test2

public class Test1 {
      public static void main(String[] args) {         
          p2.Test2 t;//Test2 t if we import p2.Test2 before;
      }
}

那么问题来了,java文件在编译时如何知道p2这个package在哪?这里要提到一个重要的变量:classpath。classpath是java在编译程序时查找类文件的路径,java编译器会在classpath中包含有的路径中查找java的类文件。

举个例子,比如说classpath的值(Windows下)是.(当前目录);C:/,那么编译器在查找类的时候,就只会在当前目录和C:/中查找。所以如果p2这个目录与p1在同一目录层次下,那么p2就能直接被查找到了,查找也就结束了;如果不在的话,比如说p1的目录结构是C:/document/java/project/p1,p2的目录结构是C:/document/java/test/p2,那么如果C:/document/java/test不在classpath中,java解释器是找不到p2这个package的位置的,那么就会提示错误,因此需要将C:/document/java/test加入到classpath中。



  • 85
    点赞
  • 315
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
【资源说明】 1、该资源括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习借鉴。 3、本资源作为“参考资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研,自行调试。 Java开发基于区块链的去心化拍卖系统源码+项目说明.zip #### 这个分支是连接了Java后端的代码,对Mysql数据库进行了操作,如果不熟悉后端的话,可以先使用noback分支 ## 温馨提示:该项目仅适用于入门学习,功能并不复杂,谢谢理解 前置知识:solidity、truffle、JavaScript、web3.js、Java(非必须其他后端语言均可)...... 一个基于truffle搭建的拍卖系统项目,这个项目主要是基于以太坊开发拍卖系统DApp,拍卖的原理类似于eBay,所以又可以叫做“去心化eBay”项目. 默认检测Metamask钱插件,若有则使用MetaMask进行交互,若无则连接本地的8545端口. ## 应用架构图: ![Frame](Frame.png) 首先确保电脑已经安装**truffle、webpack、ganache-cli** ``` npm install -g [email protected] [email protected] [email protected] ``` 然后打开./app/package.json进行修改并安装相关 ``` // 这个是我的 { "name": "app", "version": "1.0.0", "description": "", "private": true, "scripts": { "build": "webpack", "dev": "webpack-dev-server" }, "devDependencies": { "@openzeppelin/truffle-upgrades": "^1.17.0", "copy-webpack-plugin": "^5.0.5", "webpack": "^4.41.2", "webpack-cli": "^3.3.10", "webpack-dev-server": "^3.9.0" }, "dependencies": { "@babel/core": "^7.20.12", "ipfs-http-client": "^50.1.2", "ethers": "^5.4.0", "web3": "^1.2.4" } } ``` ``` npm install ``` 还要安装IPFS,[下载链接](https://dist.ipfs.tech/#kubo),我安装的版本是 kubo_v0.18.1 启动IPFS后,打开IPFS的[UI前端](http://localhost:5001/webui),修改网关等配置文件并保存,然后重启IPFS ``` { "API": { "HTTPHeaders": { "Access-Control-Allow-Credentials": ["true"], "Access-Control-Allow-Headers": ["Authorization"], "Access-Control-Allow-Methods": ["GET","POST"], "Access-Control-Allow-Origin": ["*"], "Access-Control-Expose-Headers": ["Location"] } }, "Addresses": { ... "Gateway": "/ip4/127.0.0.1/tcp/9001", ... } ... } ``` 在启动 ganache-cli 、IPFS后,在项目根目录下使用 truffle 部署合约 ``` truffle migrations ``` 新增商品服务器时监听区块链状态,然后添加到mysql数据库,我部署在我的Java服务器里了([代码地址](https://github.com/kpyaoqi/JavaServer)) 如果Java不熟悉的话,也可以替换成直接查询区块链数据,或者自己有熟悉的后端语言的话也可以用其他的语言部署 在进行服务跳转的时候,会遇到跨域问题,需要在webpack.config.js文件添加一条代理配置: ```js devServer: {
Java初学者必看 Java初阶 一、Java程序框架结构简介 步骤9示意图 1、声明名,package是声明的关键字。com.axt.ch01是名,这里可以把java理解为文件夹。在磁盘上也确实是com\axt\ch01的文件夹嵌套。 说明: ① 声明Java程序框架的第一步,必须写在最开始。 ② 上例没有用到声明,但以后我们编写的Java程序都会用到声明这行代码。 2、外层框架,这里将其称为外层框架,以后会详细介绍这段代码的真正含义。public class,后面的HelloJava是类名,类名必须与文件的主文件名完全相同。本行最后有一个大括号,这个大括号与图最后一行的大括号向匹配,缺一不可。 ③(还有⑤)注释语句,注释语句是给程序员看到,程序执行时,注释不会显示给用户看。注释语句的主要作用是帮助程序员理解、回忆代码的作用、实现的方法。 在实际开发,注释语句起到了备忘录的重要作用,方便程序员进行代码的维护。 本例实现的注释有两个格式: 1) /** */:多行文档注释,多行注释,允许在/** 和*/之间书写多行注释文字。文档注释的文字可制作为HTML文档,方便程序员或用户查看。 2) //:单行注释。注释的文字在一行内书写 3) /* */多行文档注释:允许在/* */之间书写多行注释文字。 ④main方法,程序执行的起始处,这里暂时称其为程序的内层框架。以后会详细介绍这行程序各部分的作用。本行最后的大括号与倒数第二行的大括号匹配,缺一不可。 ⑥代码输入区域 我们在这里编写Java程序。System.out.println是一个Java命令,该命令向控制台显示一个字符串。字符串由双引号括起来,并放在一对小括号Java规定:每个命令结束时,由有一个分号做标志。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值