Week 6.1 | Lecture 15 | Pakages and Access Control | CS61B-Spring-2018

本文详细介绍了Java中的包和访问控制。包提供唯一名称,使用import导入。创建包分为手动和IntelliJ自动方式。默认包不建议使用,因为其类无法被外部导入。JAR文件是包含.class和其他信息的压缩文件,可用于项目分发。创建JAR文件主要通过IntelliJ的Artifacts功能。访问控制中,无修饰符意味着包级别访问,仅限同一包内访问。接口和未声明类型的类成员默认为public。编译器判断访问权限基于静态类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Pakages

包名称为所有内容提供了唯一名称。
使用import导入包,就可以使用其中的类。

1. 包

创建包
  • 手动创建

创建一个包需要执行以下两个步骤:
1.)将软件包名称放在该软件包中每个文件的顶部

package ug.joshh.animal;
public class Dog {
...
}

2.)将文件存储在具有适当文件夹名称的文件夹中。该文件夹的名称应与您的软件包相匹配:
ug.joshh.animal package is in ug/joshh/animal folder

  • IntelliJ自动创建:File → New Package → Choose package name (i.e. “ug.joshh.animal”)

  • 在intelliJ中在包中新建java文件: 右键单击包名称→新建java类→命名java文件。自动放入正确的包中并在类中添加pakage声明。

默认包

文件顶部没有显式包名称的任何Java类都将自动视为“默认”包的一部分。但是,在编写真实程序时,应避免将文件保留在默认程序包中(除非这是一个非常小的示例程序)。这是因为无法导入默认包中的代码,并且有可能在默认包下意外地创建了具有相同名称的类。

例如,如果我要在默认程序包中创建“ DogLauncher.java”类,则将无法在默认程序包之外的任何其他位置访问此DogLauncher类。

DogLauncher.launch(); // won’t work
default.DogLauncher.launch(); // doesn’t exist

因此,您的Java文件通常应以显式包声明开头。

2. JAR文件

可以通过创建JAR文件将所有文件“压缩”在一起。该单个.jar文件将包含您的所有.class文件以及其他一些附加信息。
请务必注意,JAR文件就像zip文件一样。完全有可能将文件解压缩并转换回.java文件。JAR文件不能保证您的代码安全。
在项目中导入jar文件,就可以用该jar文件所包含的类了。

创建JAR文件
  • 创建一个JAR文件(IntelliJ)

1.) Go to File → Project Structure → Artifacts → JAR → “From modules with dependencies”
2.) Click OK a couple of times
3.) Click Build → Build Artifacts (this will create a JAR file in a folder called “Artifacts”)
4.) Distribute this JAR file to other Java programmers, who can now import it into IntelliJ (or otherwise)

Build Systems

无需每次我们要创建项目时都导入libraries列表或类似的列表,我们只需将文件放入适当的位置,然后使用“Build Systems”自动执行项目设置过程即可。Build Systems的优势在较大的团队和项目中尤为明显,这在很大程度上有利于自动化设置项目结构的过程。
如:Maven,Ant,Gradle

二、Access Control

在这里插入图片描述
黑色的一行意思是,如果什么修饰符也不加,则是package private类型,只有本类和同Pakage的类可以访问。

注意:

  • 默认包
    没有包声明的代码自动成为默认包的一部分。如果这些类的成员没有访问修饰符(即package private类型),由于该成员属于默认包,在其他默认包中的类仍然可以访问这些成员。

  • access仅取决于静态类型

例:

在这里插入图片描述
interface中的成员不声明类型也是public。
class如果不声明类型,也是默认为 package private类型,即只能同一个包中的类访问。
因此,在java中,return一个其他对象的方法很常见。因为被return的那个对象是无法被包外类访问到的。

看编译器能否正常运行只要看静态类型即可。

第一行:静态类型符合。将hashair赋值给blackhole。注意,调用hirsute()方法返回hashair对象是不会报错的,因为调用hirsute()方法得到的是一个内存盒,其中存储的是指向hashair对象的地址。我们可以访问这个内存盒,尽管不能直接访问或修改hashair。

第二行:使用静态类型blackhole接口的add方法,没问题。

第三行:接口没有get方法。错误。不能访问到hashair的get方法。

第四行:不能访问到hashair,所以client类根本不知道hashair是个什么东西。错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值