文章目录
Java的包和访问修饰符
一、包的引入
Java 允许使用包(package)将类组织在一个集合中。借助包可以方便的组织自己的代码,并将自己的代码与别人提供的代码库分开管理。
使用包的主要原因是确保类名的唯一性。 假如2个程序员不约而同的建立了 Employee 类。只要将这些类放置在不同的包中,就不会产生冲突。
1. 包的基本介绍
1.1 包的三大作用
-
区分相同名字的类。
-
当类很多时,可以很好的进行管理。
-
可以控制访问的范围。
1.2 包的基本语法
package com.xiong.pg;
//说明:
//1. package 关键字,表示打包
//2. com.xiong.pg 表示包名
//表示 这个文件在 com 文件夹下面的 xiong 文件夹,
//xiong 文件夹下面的 pg 文件夹里面
1.3 包的本质
包的本质: 实际上就是创建不同的文件夹来保存类文件。
2. 包名
2.1 包的命名规则
包名,只能包含 数字、字母、下划线、小圆点,但是不能用数字开头, 不能是关键字或保留字。
//有如下包名:
demo.12a //错误,12a 是数字开头的
demo.ab12.oa //正确
demo.class.exec1//错误,class 是关键字
为了保证包名的唯一性,一般使用一个因特网域名(这显然是唯一的)以逆序的形式作为包名,然后对于不同的工程使用不同的子包。
例如,有一个域名 xiong.com。如果逆序来写,就得到一个包名 com.xiong ,然后后面可以再追加一个工程名,如 com.xiong.corejava。如果再把 Employee 类放在这个包里,那么这个类的 “完全限定” 名 就是 com.xiong.corejava.Employee 。
2.2 常用的包
一个包下面,包含很多的类,Java 中常用的包有:
包名 | 说明 |
---|---|
java.lang.* | lang包是基本包,默认引入,不需要再引入 |
java.util.* | util 包,系统提供的工具包,工具类, |
java.net.* | 网络包,网络开发 |
java.awt.* | 是做java 的界面开发,GUI |
注意: 从编译器的角度来看,嵌套的包之间没有任何关系。例如, java.util 包与 java.util.jar 包毫无关系。每一个包都是独立的类集合。
3. 包的导入
3.1 类的导入
我们可以采用2种方式访问另一个包中的公共类。第一种方式是使用 完全限定名 。第二种方式是使用 import 语句。
3.1.1 使用完全限定名导入类
例如:
//创建一个Scanner 对象
java.util.Scanner scanner = new java.util.Scanner(System.in);
这种方式显然很繁琐,更简单的方式是使用 import 语句。
3.1.2 使用 import 语句导入类
import 语句是一种引用包中各个类的简捷方式。一旦使用了 import 语句,在使用类时,就不必要写出类的全名了。
语法规则: import 语句应该位于源文件的顶部(但位于 package 语句的后面)。
例如:
package com.xiong.pg;
import java.util.Scanner;//就只是引入一个类 Scanner
//import java.util.*;
//表示导入 java.util 包中所有的类。
public class A {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
}
}
java.util.*;
的语法比较简单,对代码的规模也没有任何负面影响。不过,如果能够明确地指出所导入的类,代码的读者能够更加准确的知道你使用的哪些类。
作者在这里建议,我们需要使用哪个类,就导入哪个类就可以了,不建议使用 * 进行导入。
3.1.3 使用星号(*)的注意事项
当使用星号(*)时,要注意只能使用它导入一个包,而不能使用 import java.*;
或 import java.*.*;
导入以 java 为前缀的所有包。
3.2 导入的2个包中有同名的类
例如,java.util 和 java.sql 包都有 Date 类。如果在程序中导入了这2个包:
import java.util.*;
import java.sql.*;
class B {
public void test() {
Date today;// ERROR
//因为,此时编译器不知道
//是使用 java.util.Date 还是 java.sql.Date
}
}
解决的方法是,要使用哪个 Date 类就再添加一个 import 语句
import java.util.Date;
import java.util.*;
import java.sql.*;
如果2个类都要使用,则考虑使用完全限定名。
java.util.Date deadline = new java.util.Date();
java.sql.Date today = new java.sql.Date();
4. 注意事项
- package 的作用是声明当前类所在的包,需要放在类的最上面,一个类中最多只有一句 package
- import 指令位置放在 package 的下面,在类定义的前面,可以有多句且没有顺序要求。
二、访问修饰符
1. 访问修饰符的基本介绍
java 提供 4 种访问控制修饰符号,用于控制方法和属性(成员变量)的访问权限(范围)。
- 公开级别:用 public 修饰,对外公开。
- 受保护级别:用 protected 修饰,对子类和同一个包中的类公开。
- 默认级别:没有修饰符号,向同一个包的类公开。
- 私有级别:用 private 修饰,只有类本身可以访问,不对外公开。
2. 四种访问修饰符的访问范围
访问级别 | 访问控制修饰符 | 同类 | 同包 | 子类 | 不同包 | |
---|---|---|---|---|---|---|
1 | 公开 | public | √ | √ | √ | √ |
2 | 受保护 | protected | √ | √ | √ | × |
3 | 默认 | 没有修饰符 | √ | √ | × | × |
4 | 私有 | private | √ | × | × | × |
3. 使用的注意事项
- 修饰符可以用来修饰类中的属性,成员方法以及类
- 只有默认的和 public 才能修饰类!!! 并且同样遵循上面的访问规则。
- 成员方法的访问规则和属性完全一样。
package pg1;
class Test1 {
public int n1;
protect int n2;
int n3;
private n4;
public void show() {
//在同一个类中,这4个访问修饰符,修饰的属性都可以进行访问
System.out.println(n1);
System.out.println(n2);
System.out.println(n3);
System.out.println(n4);
}
}
class Test2 {
public void show2() {
Test1 t = new Test1();
System.out.println(t.n1);//可以访问
System.out.println(t.n2);//可以访问
System.out.println(t.n3);//可以访问
//System.out.println(t.n4);
//t.n4将会报错,因为 在 Test1 类中,n4 为 private
}
}
package pg2;
class Test3 {
public void show2() {
Test1 t = new Test1();
System.out.println(t.n1);//可以访问
//System.out.println(t.n2); n2 为protected,在不同包中无法直接访问
//System.out.println(t.n3); n3 为默认,在不同包中无法直接访问
//System.out.println(t.n4);
//t.n4将会报错,因为 在 Test1 类中,n4 为 private
}
}
这4 种访问修饰符在 java 中有着及其重要的应用,作者希望读者们能够自己多去写代码进行验证,多去尝试。毕竟,“纸上得来终觉浅,绝知此事要躬行”。