1、编译运行含有包层的类
package zhangsan.lisi;//必须放放第一条语句
class A{
public void f(){
System.out.printf("AAAA\n");
}
}
class M{
public static void main(String[] args) {
new A().f();
}
}
- 使用
javac bao.java
编译需要手动建立包目录 - 使用
javac -d . bao.java
自动生成包目录
-d
表示自动生成包层
.
表示这个包层是在当前目录下建立 - 类A和M在zhangsan文件夹里的lisi文件夹里面
java zhangsan.lisi.M
- 这时类的真正名字是包名和类名的组合
如果不在当前路径运行程序,则必须保证class文件的最上层目录的父目录,位于classpath下
set classpath
查看环境变量
set classpath=E:\课程\JAVA\11包
设置环境变量,这样就可以在其他路径运行程序
(先检测当前目录有没有zhangsan.lisi
这个包,如果有,再检测是否有zhangsan.lisi.bao
这个类,如果没有编译器再去classpath
路径中查找,如果查找失败,则运行出错)2、同包和不同包类的相互访问
1. 同包
A.java
class A{
public void f(){
System.out.printf("AAAA\n");
}
}
B.java
class B{
public static void main(String[] args) {
A aa = new A();
aa.f();
}
}
两个文件放同意文件默认同包
同一个包的私有的不能被另一个类访问。
2. 不同包
A.java
package zhangsan.lisi;
public class A{
public void f(){//注意都加了public
System.out.printf("AAAA\n");
}
}
B.java
package com.ruide;
class B{
public static void main(String[] args) {
zhangsan.lisi.A aa = new zhangsan.lisi.A();
aa.f();
}
}
javac -d . A.java B.java
java com.ruide.B
输出AAAA
只有公有类的公有成员才能被另外一个包访问。
B.java
也可以写为
package com.ruide;
//import zhangsan.lisi.*;
import zhangsan.lisi.A;
class B{
public static void main(String[] args) {
A aa = new A();
aa.f();
}
}
import zhangsan.lisi.*;
将整个包都导进来了
import zhangsan.lisi.A;
只导入这一个类
- 有关继承
A.java
package zhangsan.lisi;
public class A{
public void g(){
System.out.printf("GGGG\n");
}
protected void b(){
System.out.printf("BBBB\n");
}
}
B.java
package com.ruide;
import zhangsan.lisi.*;
class B extends A{
public void f(){
g();
b();
}
}
class M{
public static void main(String[] args) {
B bb = new B();
bb.f();//OK
bb.g();//OK
bb.b();//error
}
}
在不同包中有继承关系的两个类,只有public类的public成员和public类的protected成员可以被另一个包中的子类在内部使用,但是在子类的外部,通过子类对象名只能访问父类的public成员。