JavaSE之包

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/HL_HLHL/article/details/83960234


包的本质实际上就属于一个文件夹。在项目开发中很难避免类名称重复的问题。如果所有的java文件都放在一个文件夹中,就会可能存在覆盖问题。

包的定义与使用

在java文件首行使用package包名称,即可
(有的软件会自动生成一个包)
范例:定义包

package hhh.pre.java;
public class Test {
    public static void main(String[] args) {
   }
}

一旦程序出现包名称,那么*.class必须存在相应的目录下。在JDK编译的时候使用配置参数。
打包编译命令:javac -d.类名称.java
1.-d:表示生成目录,根据package的定义生成
2.“.":表示在当前所在目录生成目录
范例:

java -d .Test.java

按照此种方式编译完成之后发现,自动会在当前目录下生成相应的文件夹以及相应的*.class文件。一旦程序类上出现包名称,那么在执行的时候就需要带上包名称,即使用完整类名称”包.类“。

java hhh.pre.java.Test

包的导入

在开发中使用包的定义之后,相当于把一个大的项目分别按照一定要求保存在了不同的包之中,但是这些程序类一定会发生互相调用的情况,这个时候就需要包的导入。
范例:编写简单的java类,本类需要被其他程序所使用

package hhh.pre.java;
public class Message {
    public void ptint(){
        System.out.println("HL");
    }
}

范例:导入包

package hhh.pre.java;
import hhh.pre.java.Message;//导入程序类
public class Test {
    public static void main(String[] args) {
        Message mes=new Message();
       mes.ptint();
    }
}

从正常的角度来讲,Test类引用了Message类,那么首先编译的应该是Message类,而后才是Test类。
最好的方法是让java自己去匹配编译的先后顺序,最常用的打包编译命令为:java -d . ./*.java
注意:类使用class和public class的区别:
1.public class: 文件名称必须与类名称保持一致,如果希望一个类被其他包访问,则必须定义为public class .
2.class: 文件名称可以与类名称不一致,在一个*.java中可以定义多个class,但是这个类不允许被其他包所访问。
另外需要注意的是,以上**导入的语句为"import 包.类"**这样只会导入一个类,如果说现在导入一个包中的多个类,可以直接采用通配符"*"来完成。

import www.bit.java.util.* ;

这种"*"并不意味要将包中的所有类都进行导入,而是根据你的需求来导入。

问题:不同包但是相同类名的情况
这个时候我们一般在使用时使用全名称定义

www.bit.java.message.Message msg = new www.bit.java.message.Message() ;

系统常用包

系统常用包:
1.java.lang:系统常用基础类(String、Object),此包从JDK1.1后自动导入。
2.java.lang.reflect:java 反射编程包;
3.java.net:进行网络编程开发包。
4.java.sql:进行数据库开发的支持包。
5.java.util:是java提供的工具程序包。(集合类,ArrayList,HashMap),需要手工导入
6.java.io:IO编程开发包。
7.java.awt(离不开windows平台)、java.swing:UI开发包,主要进行界面开发包,目前已经不用了。
8.juc:java.util.concurrent:并发程序包

访问控制权限

在java中提供有四种访问控制权限:private<default(包访问权限)<protected(继承访问权限)<public,这四种访问控制权限的定义如下:
在这里插入图片描述

范例:验证default(包)访问权限

定义一个包

package hhh.pre.java.util;
//这里这个类必须public修饰。如果不加public,默认是default包访问权限,也就是说只能在同一个包内访问
public class Message {
    public void print() {
        System.out.println("包访问权限");
    }
}

定义一个测试类

package hhh.pre.java;
import hhh.pre.java.util.Message;
public class Test {
    public static void main(String[] args) {
      Message mes=new Message();
      mes.print();
    }
}

范例:验证protected(继承)访问权限

定义一个父类包

package hhh.pre.java.util;

public class father {
   private int a=10;
   protected int b=20;
   protected void test(){
       System.out.println("继承权限方法");
   }
   public void fun(){
       System.out.println("共继承方法");
   }
}

定义一个子类包

package hhh.pre.java.util;
import hhh.pre.java.util.father;
public class child extends father{
    public void test1(){
        System.out.println(b);
    }
}

定义一个测试包

package hhh.pre.java;

import hhh.pre.java.util.child;

public class Test {
    public static void main(String[] args) {
        child ch=new child();
        ch.test1();//20
        //ch.test();//错误代码,因为protected继承权限,不同包中的子类包可以访问,非子类包不能访问
        ch.fun();//公共继承权限
    }
}

对于public永远都可以访问,对于封装性而言主要是private、default、protected权限。
总结:关于权限的选择
1.对于封装的描述90%使用private,只有10%会使用protected,这两个都叫封装。
2.属性都使用private,方法都使用public。

jar命令

jar本质上也是一种压缩文件,里面保存的都是*.class文件。也就是说现在要实现某一个功能模块,可能有几百个类,最终交付给用户使用时,为了方便管理,就会将这些文件形成压缩包提供给用户。
在JDK中提供实现jar文件操作的命令,只需要输入一个jar即可。对于此命令,有如下几个常用参数:
1.“c”:创建新档案
2.“f”:指定档案文件名
3.“v”:在标准输出中生成详细输出

范例:编译源文件并打包

package hhh.pre.java.util;

public class Message { public void print() {
System.out.println("Hello I am Message");
}
}

对上述源文件编译而后变为jar文件。
1.打包进行程序编译: javac -d . Message.java
2.将生成的程序类打包为jar文件:jar -cvf Message.jar Message.class

打开后发现有一个META-INF文件夹,里面包含版本号等信息。此时的Message.jar就包含我们需要的程序类.
范例:编写程序调用Message.jar

package hhh.pre.java.testjar;
import hhh.pre.java.util.Message;
public class Testjar{
  public static void main(String[] args){
      Message msg=new Message();
      msg.print();
      }
      }

要想使用jar文件,并不是说将其放到程序的目录之中就可以,还需要配置CLASSPATH,设置jar文件的加载路径才会起效。

猜你喜欢

转载自blog.csdn.net/HL_HLHL/article/details/83960234
今日推荐