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

来源:互联网 发布:ubuntu 16.04中文版 编辑:程序博客网 时间:2024/06/07 22:21

本章目标:

  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 系统常见包

序号包名称作用1java.lang此包为基本的包,String类都保存在此包中。此包
现在是自动导入的
2java.lang.reflect此包为反射机制的包,是java.lang的子包。3java.util此包为工具包,一些常用的类库、日期操作等
都在此包中,如果把此包掌握精通,则各种设计思路都好理解
4java.text提供了一些文本的处理类库5java.sql数据库操作包,提供了各种数据库操作的类和接口6java.net完成网络变成7java.io输入、输出处理8java.awt包含了构成抽象窗口工具集(abstract window toolkits)的多
个类,这些类被用来构建和管理应用程序的图形用户界面(GUI)
9java.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访问权限,就可以在所有的类中被访问,不管是否在同一个包中。
范围privatedefaultprotectedpublic同一类同一包中的类 不同包的子类  其他包中的类   

关于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 习题


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 蜡笔弄到指甲里怎么办 小孩把彩笔吃了怎么办 宝宝吃了水彩笔怎么办 宝宝不小心吃了蜡笔怎么办 小孩把蜡笔吃了怎么办 宝宝吃了记号笔怎么办 二年级的孩子不太爱看书怎么办 数字油画涂错了怎么办 白墙上被蜡笔画起来怎么办 衣服上的油画棒怎么办 蜡笔要是涂错了怎么办 蜡笔颜色涂错了怎么办 书被蜡笔涂了怎么办 白灰墙上被蜡笔涂了怎么办 电器上涂了彩色蜡笔怎么办 3d渲大图慢怎么办 23岁就眼皮下垂怎么办 手被猫咪抓破了怎么办 有幻想症的人怎么办 做事不专心老走神怎么办 小朋友做作业老发呆走神怎么办? 小朋友总是上课走神发呆怎么办 21岁精神心急了怎么办 一直有人阻止我做事怎么办 安装了渲染su找不到怎么办 su室内渲染很暗怎么办 su未响应未保存怎么办 电脑工作栏没了怎么办 ps工作栏没了怎么办 草图大师文件太大打不开怎么办 su模型保存后不见了怎么办 墨汁溅到衣服上怎么办 黑裤子溅上白色颜料怎么办 解码器上墙后图像放大了怎么办 宝宝把墙画了怎么办 孩子画画勾线笔过敏怎么办 微信语音撤回了怎么办? 小天才电话手表充不上电怎么办 儿童电话手表定位不准怎么办 2岁宝宝不让刷牙怎么办 宝宝两岁蛀牙多还不刷牙怎么办