04java基础课堂笔记 - 面向对象课时5 - 包机制与访问控制
158、包机制 package、import
1、package是java的包机制,作用是为了方便程序的管理,将不同功能的类存放在不同的包下,按照功能划分,不同的软件包具有不同的功能
2、package
2.1、声明包:
package 包名1.包名2.包名3...
- package语句编写在java源文件第一行
- 一个包代表一个目录,包名之间使用 . 号间隔
2.2、包名的命名规范:
域名倒序 + 项目名 + 模块名 + 功能名
- 一般使用公司域名倒序的方式,因为公司域名具有全球唯一性
- 包名也是标识符要求全部小写
3、使用了package包机制之后,如何编译?如何运行呢?
3.1、使用了package机制,类名不再是简单的字节码文件名Test,而是一个带包名的完整类名:包名1.包名2.包名3.类名
如Test.class的完整类名是:com.bjpowernode.javase.project10.Test
3.1、如何编译?
1)、当源文件在控制台当前目录下时,源文件路径可以省略,字节码文件的默认保存位置与源文件相同
javac xxx.java
2)、当源文件不在控制台当前目录下时,须指明源文件路径,字节码文件的默认保存位置与源文件相同
javac [源文件路径]\xxx.java
- 以上两种,字节码文件默认保存在与源文件相同的位置,因此须手动创建包名目录,并将字节码文件放入该目录,这样才能进行运行
3)、带包编译并指定类文件的保存位置:
javac -d [路径] xxx.java
javac -d . xxx.java
- -d 表示带包编译,并且指定生成的 “包目录和.class字节码文件”(即完整类)的保存位置
- 即将java源文件带包编译,“包和字节码文件” 保存到指定路径下
- . 表示控制台当前目录,-d后面的路径不能为空
- “-d [路径]” 省缺时,同3.1.1,字节码文件默认保存在与源文件相同的位置
javac -d . *.java
- * 表示所有 .java源文件
- 即编译所有.java源文件,并保存到控制台当前目录下
4)、删除当前目录下所有.class字节码文件
del *.class
3.2、如何运行?
1)、JVM的类加载器ClassLoader默认从控制台当前目录下加载类,所以要确保控制台当前目录与字节码文件或包所在的目录相同
2)、未使用包机制时,xxx.class字节码文件的保存位置默认与源文件相同,可以采用缺省类名方式运行字节码文件
java xxx
3)、当使用了包机制时,xxx.class字节码文件保存在包名目录里,须采用完整类名方式运行
java 包名1.包名2.包名3.xxx
- 如果使用省缺方式编译,字节码文件默认保存位置与源文件相同,因此须手动创建包名目录,并将字节码文件放入该目录再运行
4、import
4.1、为了省略包名,方便编程,使用import机制
当引用类与当前类不在同一个包下时,由于编译器默认会在当前包下去找字节码文件,因此须采用完整类名的方式编写引用类,包名不能省略
为了方便编程,使用import机制,导入其它包下的类,从而实现省略包名,采用简化类名的方式的去引用类
4.2、import什么时候使用?
1)、java.lang.包下的类不需要手动导入,系统支持自动引入
常用类如:String、System、Math
2)、引用的类与当前类,是同包下的类不需要导入
3)、引用的类是其它包的类,不同包的类需要导入,否则无法省略包名
4.3、怎么用?
1)、import语句必须编写在package语句之下,class语句之上
2)、使用完整类名导入
import 包名1.包名2.包名3.xxxx ;
3)、导入所有类
import 包名1.包名2.包名3.* ;
- * 代表所有类,效率不会降低,因为编译器在编译的时候,会自动把 * 变成具体的类名支持多行
如:import java.util.Scanner;
import java.util.*;
示例1:声明包

package com.bjpowernode.javase.project10; public class Test{ public static void main(String[] args){ System.out.println("Test's main method execute"); } }
示例2:当引用类Test与当前类Test2不在同一个包下时,须使用完整类名,import机制

package com.bjpowernode.javase.project11; import com.bjpowernode.javase.project10.Test; public class Test2{ public static void main(String[] args){ /* 以下代码编译错误,当省略包名之后,编译器会在当前包下找Test 实际上编译器去找com.bjpowernode.javase.project11.Test这个类了,但这个类不存在 */ //Test t = new Test(); //使用import机制导入Test类之后,就可以采用简洁类名方式编写了 Test t = new Test(); //Test和当前类Test2不在同一个软件包下,包名不能省略 com.bjpowernode.javase.project10.Test tt = new com.bjpowernode.javase.project10.Test(); System.out.println(t); System.out.println(tt); } }
159、访问控制权限修饰符:
1.1、访问控制权限修饰符用来控制元素的访问范围
权限排序为:public > protected > 默认 > private
1.2、访问控制权限修饰符有哪些?
private 私有的 只能在本类中访问
default 缺省的/默认 只能在本类和同包下访问,非同包下的子类也不能继承(不能显性使用“default”修饰)
protected 受保护的 同上只能在本类和同包下访问,但非同包下的子类可以继承,使用this.访问
public 公开的 可以在任何位置访问
访问控制修饰符 本类 同包 子类 任意位置
----------------------------------------------------------------------------
public 可以 可以 可以 可以
protected 可以 可以 可以 no
default 可以 可以 no no
private 可以 no no no
1.3、访问控制权限修饰符可以修饰什么?
属性,4个修饰都能用
方法,4个修饰都能用
类, 只能用 public 和缺省修饰
接口,只能用 public 和缺省修饰
示例1:private、缺省修饰 本类及同包下的访问权限

package com.bjpowernode.javase.project10; public class Test{ public static void main(String[] args){ //实例化同包类,省略包名 //protected与省缺修饰的元素,都可以在本类或同包的类中访问 //protected修饰的元素,还可以在它的子类中访问 User u = new User(); //System.out.println(u.i1); //private 访问控制 System.out.println(u.i2); //缺省的 同包下可以访问 System.out.println(u.i3); System.out.println(u.i4); //u.m1(); //private 访问控制 u.m2(); //缺省的 同包下可以访问 } } class User{ private int i1 = 10; int i2 = 20; protected int i3 = 30; public int i4 = 40; private void m1(){ System.out.println("m1 method execute!!! " + this.i1); } void m2(){ System.out.println("m2 method execute!!!"); this.m1(); } protected void m3(){} public void m4(){} }
示例2:protacted修饰 非同包的子类的访问权限
编译:javac -d . *.java
运行:java com.bjpowernode.javase.project10.Test
主类Test 10包

package com.bjpowernode.javase.project10; public class Test{ public static void main(String[] args){ //实例化同包类,省略包名 //protected与省缺修饰的元素,都可以在本类或同包的类中访问 //protected修饰的元素,还可以在它的子类中访问 User u = new User(); //System.out.println(u.i1); //private 访问控制 只能在本类中访问 System.out.println(u.i2); //20 default System.out.println(u.i3); //30 protected System.out.println(u.i4); //40 public //u.m1(); //private 访问控制 只能在本类中访问 u.m2(); //m2 method execute!!! u.m3(); //m3 method execute!!! u.m4(); //m4 method execute!!! com.bjpowernode.javase.project11.Vip v = new com.bjpowernode.javase.project11.Vip(); v.m(); com.bjpowernode.javase.project12.Vip2 v2 = new com.bjpowernode.javase.project12.Vip2(); v2.m(); } }
User类 10包

package com.bjpowernode.javase.project10; public class User{ private int i1 = 10; int i2 = 20; protected int i3 = 30; public int i4 = 40; private void m1(){ System.out.println("m1 method execute!!! " + this.i1); } void m2(){ System.out.println("m2 method execute!!!"); this.m1(); } protected void m3(){ System.out.println("m3 method execute!!!"); } public void m4(){ System.out.println("m4 method execute!!!"); } }
Vip类 11包 Vip继承User

package com.bjpowernode.javase.project11; import com.bjpowernode.javase.project10.User; public class Vip extends User{ public void m(){ User u = new User(); //private 访问控制 //System.out.println(u.i1); //default,非同包下不能访问,非同包下也不能被继承 //System.out.println(u.i2); //System.out.println(this.i2); //protected 访问控制,非同包下不能访问,但非同包下的子类可以继承 //System.out.println(u.i3); System.out.println(this.i3); //30 //public System.out.println(u.i4); //40 //u.m1(); //private 访问控制 //u.m2(); //default,非同包下不能访问,非同包下也不能被继承 //this.m2(); //u.m3(); //protected 访问控制,非同包下不能访问,但非同包下的子类可以继承 this.m3(); //m3 method execute!!! u.m4(); //m4 method execute!!! } }
Vip2类 12包 无继承

package com.bjpowernode.javase.project12; import com.bjpowernode.javase.project10.User; public class Vip2{ public void m(){ User u = new User(); //System.out.println(u.i1); //private 访问控制 //System.out.println(u.i2); //default 非同包下不能访问 //System.out.println(u.i3); //protected 访问控制,非同包下不能访问 System.out.println(u.i4); //40 public //u.m1(); //private 访问控制 //u.m2(); //default 非同包下不能访问 //u.m3(); //protected 访问控制,非同包下不能访问 u.m4(); //m4 method execute!!! } }
//即使再小的帆也能远航20220307
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?