Java的包和4种访问修饰符(详细版)

Java的包和访问修饰符

一、包的引入

​ Java 允许使用包(package)将类组织在一个集合中。借助包可以方便的组织自己的代码,并将自己的代码与别人提供的代码库分开管理。

使用包的主要原因是确保类名的唯一性。 假如2个程序员不约而同的建立了 Employee 类。只要将这些类放置在不同的包中,就不会产生冲突。


1. 包的基本介绍

1.1 包的三大作用

  1. 区分相同名字的类。

  2. 当类很多时,可以很好的进行管理。

  3. 可以控制访问的范围。

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. 注意事项

  1. package 的作用是声明当前类所在的包,需要放在类的最上面,一个类中最多只有一句 package
  2. import 指令位置放在 package 的下面,在类定义的前面,可以有多句且没有顺序要求。

二、访问修饰符

1. 访问修饰符的基本介绍

  java 提供 4 种访问控制修饰符号,用于控制方法和属性(成员变量)的访问权限(范围)。

  1. 公开级别:用 public 修饰,对外公开。
  2. 受保护级别:用 protected 修饰,对子类和同一个包中的类公开。
  3. 默认级别:没有修饰符号,向同一个包的类公开。
  4. 私有级别:用 private 修饰,只有类本身可以访问,不对外公开。

2. 四种访问修饰符的访问范围

访问级别访问控制修饰符同类同包子类不同包
1公开public
2受保护protected×
3默认没有修饰符××
4私有private×××

3. 使用的注意事项

  1. 修饰符可以用来修饰类中的属性,成员方法以及类
  2. 只有默认的和 public 才能修饰类!!! 并且同样遵循上面的访问规则。
  3. 成员方法的访问规则和属性完全一样。
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 中有着及其重要的应用,作者希望读者们能够自己多去写代码进行验证,多去尝试。毕竟,“纸上得来终觉浅,绝知此事要躬行”。

  • 26
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值