8. 包及访问权限控制 --- 学习笔记

本章目标:

  1. 掌握包的定义及作用
  2. 掌握java新特性 -- 静态导入
  3. 了解java中的常用系统包
  4. 掌握jar命令的作用
  5. 掌握java中的4种访问权限
  6. 掌握java语言的命名规范

索引

           8.1 包的基本概念

           8.2 jar命令的使用

           8.3 访问权限控制

           8.4 java命名规范

           8.5 本章要点

           8.6 习题


8.1 包的基本概念

      8.1.1 包的基本概念

          package关键字来避免出现类名称相同的情况。package是在使用多个类或接口时,为了避免名称重复而采用的一种措施,直接在程序中加入package关键字即可。格式如下

package  包名称.子包名称;

     打包程序

package org.forfan06.demo08;    //定义一个包
class Demo{                         //定义Demo类
     public String getInfo(){
          return "Hello World!!!";
     }
}
public class PackageDemo01{
     public static void main(String args[]){
          System.out.println(new Demo().getInfo());   //实例化本包对象
     }
}

因为以上程序是在包中,所以此时完整的类名称应该为“包名称.类名称”,即“org.forfan06.demo08.PackageDemo01”

此时编译该段代码也不能像之前那样直接 javac 类名称.java。。必须加上若干参数才行,编译语法如下:

javac -d . PackageDemo01.java

在以上的编译命令中加入了一下两个参数

  1. -d:  表示生成目录,生成的目录以package的定义为准。
  2. .     表示在当前所在的文件夹中生成。

编译完成之后可以发现,程序会自动为程序进行打包操作。 会自动生成相应的文件夹(包),之后再执行类时就必须输入完整的“包.类名称”,执行语法如下:

java org.forfan06.demo08.PackageDemo01                             //正常运行
java PackageDemo01     //此时会报错

      8.1.2 import语句

           如果几个类存放在不同的包中,则在使用类时就必须通过import语句导入。 格式如下

import package.subPackage.class;                         //手工导入所需要的类
import package.subPackage.*;                             //由JVM自动加载所需要的类

以上两种格式本身没什么区别。 一般都使用后者。

实例:

package org.forfan06.demo08.a;
class Demo{
     public String getInfo(){
        return "Hello World!!!";
     }
}
package org.forfan06.demo08.b;
import org.forfan06.demo08.a.Demo;  //导入不同包中的Demo类
public class ImportDemo01{
     public static void main(String args[]){
         System.out.println(new Demo().getInfo());
     }
}


   以上程序中的ImportDemo01类中因为要用到Demo类,所以在package语句后,通过import导入了所需要的类。

   以上程序在编译的时候,应该先编译Demo.java; 然后再编译ImportDemo01.java

编译 Demo.java:   javac -d . Demo.java

编译 ImportDemo01.java:   javac -d . ImportDemo01.java

编译时出错,说Demo类不是public定义的。在ImportDemo01类中无法进行访问。 如果一个类想要被外包访问,则此类一定要定义成public class。

如果一个类声明为public class。 则文件名必须与类名一致, 而且在一个类文件中只能有一个public class;

如果使用class声明一个类,则文件名称可以与类名称不一致,但是执行时必须执行生成的class文件名称。


public class和class在包的访问上有所限制,如果一个类只在本包中访问,不需要被外包访问,则直接声明成class即可;

而如果一个类需要被外包访问,则必须声明成public class

所以想要上面程序编译通过正常运行,必须修改Demo类

package org.forfan06.demo08.a;
<span style="color:#ff0000;">public class</span> Demo{
   public String getInfo(){
      return "Hello World!!!";
   }
}

             使用导入"*"的方式由JVM根据需要自己加载所需的类.

  • 导入类的方式:import org.forfan06.demo08.a; 和 import org.forfan06.demo08.*; 哪种性能更高??
  • 这两种导入方式本身不存在任何的性能问题,因为使用“*”时程序也是自动加载所需要的类,而不需要的类根本是不会被加载进来的!!!

            如果在一个程序中同时导入了两个包的同名类,在使用时就必须名窃地写出完成的“包.类名称”。 有点像绝对路径的概念。

 

      8.1.3 系统常见包

序号 包名称 作用
1 java.lang 此包为基本的包,String类都保存在此包中。此包
现在是自动导入的
2 java.lang.reflect 此包为反射机制的包,是java.lang的子包。
3 java.util 此包为工具包,一些常用的类库、日期操作等
都在此包中,如果把此包掌握精通,则各种设计思路都好理解
4 java.text 提供了一些文本的处理类库
5 java.sql 数据库操作包,提供了各种数据库操作的类和接口
6 java.net 完成网络变成
7 java.io 输入、输出处理
8 java.awt 包含了构成抽象窗口工具集(abstract window toolkits)的多
个类,这些类被用来构建和管理应用程序的图形用户界面(GUI)
9 java.swing 此包用于建立图形用户界面(GUI),此包中的组件
相对于java.awt包而言是轻量级组件

*********java.util包在开发中使用较多,因为其支持大量的工具类操作,象本书中的常用类库、java类集都是围绕此包展开讲解的*****

*****java.lang.reflect这个包一般在面试时有可能会问到,此包属于比较高级的开发包*****

      8.1.4 Java新特性 -- 静态导入

            如果一个类中的方法全部都是使用static声明的静态方法,则在导入时就可以直接使用import static的方式导入,格式如下

import static package.class.*;

实例: 使用静态导入

package org.forfan06.demo08.e;
public class Operate{
     public static int add(int i, int j){
          return i + j;
     }

     public static int sub(int i, int j){
          return i - j;
     }

     public static int mul(int i, int j){
          return i * j;
     }

     public static int div(int i, int j){
          return i / j;
     }
}

以上代码的类中的全部方法为static类型,所以在导入时就可以使用静态导入的方法。

package org.forfan06.demo08.f;
import static org.forfan06.demo08.e.Operate.*;
public class StaticImportDemo{
     public static void main(String args[]){
          System.out.println("7 + 7 = " + add(7, 7));
          System.out.println("7 - 5 =" + sub(7, 5));
          System.out.println("9 * 7 = " + mul(9, 7));
          System.out.println("9 / 3 = " + div(9, 3));
     }
}

     使用静态导入,所以Operate类中的所有静态方法可以直接在StaticImportDemo类中使用,而不再需要使用“类.静态方法()”的形式调用!!!

8.2 jar命令的使用

       通过JDK中bin目录里的jar.exe可以将所有的类文件.class进行压缩,此命令是随JDK一起安装的,直接在命令行中输入jar,可以看到此命令的提示界面。

       得到一个jar文件后,可以通过设置classpath的方式在系统中注册好此jar文件,以供程序使用。

       jar命令中的主要参数:

jar -cvf my.jar org

  1. c:  创建新的文档。
  2. v:  生成详细的输出信息。
  3. f: 指定存档的文件名。

      如果想查看一个jar文件中的全部内容,可以直接输入“jar -tvf jar文件的名称”

8.3 访问权限控制

       Java中,一共存在4种访问空问权限,即private、default(默认)、protected和public

  1. private访问权限,  私有访问权限。 只能在本类中进行访问。
  2. default(默认)访问权限   如果一个类中的属性或方法没有使用任何的访问权限声明,则就是默认的访问权限,默认的访问权限可以被本包中的其他类所访问,但是不能被其他包的类所访问 。
  3. protected访问权限   受保护的访问权限。 一个类中的成员如果使用了protected访问权限,则只能被本包及不同包的子类访问。
  4. public访问权限   公共访问权限。 如果一个类中的成员使用了public访问权限,就可以在所有的类中被访问,不管是否在同一个包中。
范围 private default protected public
同一类
同一包中的类  
不同包的子类    
其他包中的类      

关于protected访问权限

  在org.forfan06.demo08.g包中定义一个HelloDemo类,其中包含一个protected访问权限的成员。

package org.forfan06.demo08.g;
public class HelloDemo{
    protected String name = "forfan06";    //只能被本包及不同包的子类访问
}
<span style="background-color: rgb(255, 255, 255);"> </span>
<span style="background-color: rgb(255, 255, 255);">在org.forfan06.demo08.h包中的子类访问此类中的那么属性。</span>
<span style="background-color: rgb(255, 255, 255);">
</span>
<span style="background-color: rgb(255, 255, 255);">
</span>
package org.forfan06.demo08.h;
import org.forfan06.demo08.g.HelloDemo;
class SubHelloDemo extends HelloDemo{     //定义HelloDemo子类
    public void print(){
        System.out.println("" + super.name);      //可以访问protected权限的属性和方法
    }
}
public class ProtectedDemo01{
    public static void main(String args[]){
        SubHelloDemo sub = new SubHelloDemo();    //实例化子类对象
        sub.print();
    }
}

运行结果:

访问受保护属性: forfan06

以上程序在不同包的子类里访问了protected属性,而如果现在由不同包的类直接访问HelloDemo类中的protected属性,则会出现下面的编译错误

package org.forfan06.demo08.h;
import org.forfan06.demo08.g.HelloDemo;
public class ProtectedDemo02{
     public static void main(String args[]){
          HelloDemo sub = new HelloDemo();
          System.out.println(sub.name);    //<span style="color:#cc0000;"><del>错误,不同包的类无法访问protected属性</del></span>
     }
}

编译时会出现以下错误:

ProtectedDemo02.java:7: name has protected access in org.forfan06.demo08.g.HelloDemo
           System.out.println(sub.name);

1 error

8.4 java命名规范

  • 类: 所有单词的首字母大写。 如TestJava.
  • 方法: 第1个单词的首字母小写,之后每一个单词的首字母大写。如testMethod().
  • 属性: 第一个单词的首字母小写,之后每一个单词的首字母大写。如studentName.
  • 包: 所有单词的字母小写。 如org.forfan06.demo
  • 常量: 所有单词全部大写,如FLAG.

8.5 本章要点

  • java中使用包可以实现多人协作的开发模式。应避免类名称重复的麻烦。
  • 在java中使用package关键字来讲一个类放入一个包中
  • 在java中使用import语句可以导入一个已有的包
  • 如果在一个程序中导入了不同包的同名类,在使用时一定要明确地写出"包.类名称"
  • java中的访问权限控制分为4种,即private、default、protected、public
  • 使用jar命令可以将一个包打成一个.jar文件,以供用户使用

8.6 习题


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值