第十七章 package、import以及访问控制权限
1、为什么要使用package?
package是java中的包机制,包机制的作用是为了方便程序的管理。
不同功能的类分别存放在不同的包下。(按照功能划分,不同的软件包具有不同的功能)
2、package怎么用?
package是一个关键字,后面加包名。例如:
package com.bjpowenode.javase.chapter17;
注意:package语句只允许出现在java源代码第一行。
3、包名有没有命名规范?有
一般都采用公司域名倒序的方式(因为公司域名具有全球唯一性)
包名规范:
公司域名倒序 + 项目名 + 模块名 + 功能名
4、对于带有package的java程序怎么编译?怎么运行?
采用之前的编译和运算不行了。
类名不在是:HelloWorld了。
类名变为:com.bjpowernode.javase.chapter17.HelloWorld
之前的编译运行模式:
编译:javac HelloWorld.java
运行:java com.bjpowernode.javase.chapter17.HelloWorld
在运行之前需要在当前目录建出 com/bjowernode/javase/chapter17 目录
然后把 HelloWorld.class 文件复制刚刚建出来的目录。
针对包机制的编译运行模式:
编译:javac -d . HelloWorld.java
解释一下:
javac --> 负责编译的命令
-d --> 带包编译
. --> 代表编译之后生成的东西放到当前目录下
HelloWorld.java --> 被编译的java文件名
运行:java com.bjpowernode.javase.chapter17.HelloWorld
package com.bjpowernode.javase.chapter17;
public class HelloWorld{
public static void main(String[] args){
System.out.println("Hello World!");
}
}
2 import
import什么时候使用。 A类中使用B类。 A和B类都在同一个包下,不需要import A和B类不在同一个包下,需要使用import java.lang.*; 这个包下的类不需要使用import导入 import怎么用? import语句只能出现在package语句之下,class声明语句之上。 import语句还可以采用星号的方式。
Test01.java
package com.bjpowernode.javase.chapter17; public class Test01{ public static void main(String[] args){ // 创建HelloWorld对象 // HelloWorld的完整类名:com.bjpowernode.javase.chapter17.HelloWorld com.bjpowernode.javase.chapter17.HelloWorld hw = new com.bjpowernode.javase.chapter17.HelloWorld(); System.out.println(hw); // 包名可以省略吗? // 思考:这里的包名之所以可以省略,是因为HelloWorld和test01在同一个package下。 HelloWorld hw2 = new HelloWorld(); System.out.println(hw2); } }
Test02.java
package com; // 将需要的类导入 // import com.bjpowernode.javase.chapter17.HelloWorld; import com.bjpowernode.javase.chapter17.*; public class Test02{ public static void main(String[] args){ /* Test02在com包下。 HelloWorld在com.bjpowernode.javase.chapter17下。 不在同一个package下,包名可以省略吗? 不能省略。 */ // 错误:找不到符号 /* HelloWorld hw = new HelloWorld(); System.out.println(hw); */ // 没导包之前需要这样做,比较繁琐 /* com.bjpowernode.javase.chapter17.HelloWorld hw1 = new com.bjpowernode.javase.chapter17.HelloWorld(); System.out.println(hw1); com.bjpowernode.javase.chapter17.HelloWorld hw2 = new com.bjpowernode.javase.chapter17.HelloWorld(); System.out.println(hw2); com.bjpowernode.javase.chapter17.HelloWorld hw3 = new com.bjpowernode.javase.chapter17.HelloWorld(); System.out.println(hw3); */ HelloWorld hw1 = new HelloWorld(); System.out.println(hw1); HelloWorld hw2 = new HelloWorld(); System.out.println(hw2); } }
Test03.java
package com.bjpowernode.javase.chapter17; // import java.util.Scanner; import java.util.*; public class Test03{ public static void main(String[] args){ // 为什么要这样写? // Test03类和Scanner类不在同一个包下。 // java.util就是Scanner类的包名。 // 没有导入java.util包之前这样编写 /* java.util.Scanner s = new java.util.Scanner(System.in); System.out.print("请输入你想输入的字符串: "); String str = s.next(); System.out.println("您输入的字符串是: " + str); */ Scanner s = new Scanner(System.in); System.out.print("请输入你想输入的字符串: "); String str = s.next(); System.out.println("您输入的字符串是: " + str); java.lang.String name = "zhangsan"; System.out.println("名字是: " + name); String username = "lisi"; System.out.println("用户名是: " + username); } }
3 package和import总结
1 package
- package出现在java源文件第一行
- 带有包名怎么编译?
javac -d . xxx.java
- 怎么运行?
java 完整类名
补充:以后说类名的时候,如果带着包名描述,表示完整类名。如果没有带包,描述的话,表示简类名。
java.util.Scanner // 完整类名
Scanner // 简类名
2 import
import什么时候不需要?
java.lang 不需要
同包下不需要
其它一律都需要
怎么用?
import 完整类名;
import 包名.*;
// 疑问:这样是不是效率比较低。
// 这个效率不低,因为编译器在编译的时候,会自动把*变成具体的类名。
import java.util.*; // 注意:这里的星号只能到类名那级。因为在java语言中规定,这里的*只代表某些类的名字。
1 访问控制权限都有哪些?4个
private 私有
protected 受保护
public 公开
默认
2 以上的4个访问控制权限:控制的范围是什么?
private: 表示私有的,只能在本类中访问
public: 表示公开的,在任何位置都可以访问
“默认”: 表示只能在本类,以及同包下访问。
protected: 表示只能在本类、同包、子类中访问
访问控制修饰符 本类 同包 子类 任意位置
------------------------------------------------
public ok ok ok ok
protected ok ok ok no
默认 ok ok no no
private ok no no no
范围从大到小排序: public > protected > 默认 > private
3 访问控制权限修饰符可以修饰什么?
属性(4个都能用)
方法(4个都能用)
类(public和默认能用)
接口(public和默认通用)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?