类:public class可以被外包访问;class只能在本包中访问
文件Mymath.java
package b;
public class Mymath {
}
文件Pack.java
package a;
import b.*;
public class Pack {
public static void main(String args[]) {
Mymath m = new Mymath();
}
}
执行 javac Pack.java就不会报错,如果把Mymath.java文件中的public去掉就会报错
生成文件和源文件存放结构如下:
├── b
│ └── Mymath.class
├── Mymath.java
├── Mymath.java.bak
├── Pack.class
├── Pack.java
└── Pack.java.bak
如果想把Mymath.java文件中的public去掉也不会报错,需要修改Mymath.java、Pack.java,修改后的结果如下:
文件Mymath.java
package a;
class Mymath {
}
文件Pack.java
package a;
//import b.*;
public class Pack {
public static void main(String args[]) {
Mymath m = new Mymath();
}
}
生成文件和源文件存放结构如下:
├── a
│ └── Mymath.class
├── Mymath.java
├── Mymath.java.bak
├── Pack.class
├── Pack.java
└── Pack.java.bak
根据上面的测试结果可以知道Java存在权限控制, Java 中一共有四种访问权限控制,其权限控制的大小情况是这样的:public > protected > default(包访问权限) > private ,具体的权限控制看下面表格,列所指定的类是否有权限允许访问行的权限控制下的内容:
- public: 所修饰的类、变量、方法,在内外包均具有访问权限;
- protected: 这种权限是为继承而设计的,protected所修饰的成员,对所有子类是可访问的,但只对同包的类是可访问的,对外包的非子类是不可以访问;
- 包访问权限(default): 只对同包的类具有访问的权限,外包的所有类都不能访问;
- private: 私有的权限,只对本类的方法可以使用;
private:
/* file: Mymath.java */
package a;
public class Mymath {
private int x;
}
/* file: Pack.java */
package a;
//import b.*;
public class Pack {
public static void main(String args[]) {
Mymath m = new Mymath();
m.x = 0;
}
}
编译运行:
javac -d . Mymath.java
javac -d . Pack.java
报下面错误信息:
Pack.java:8: error: x has private access in Mymath
m.x = 0;
^
1 error
default:
把Mymath.java文件修改为下面内容编译就不会报错误信息
/* file: Mymath.java */
package a;
public class Mymath {
int x;
}
但是放在不同的包里面就会报错