您的位置:首页 > 职场人生

黑马程序员—— 9,包package相关知识点

2015-07-26 16:50 411 查看
-----------android培训java培训、java学习型技术博客、期待与您交流!------------

黑马程序员—— 9,包package相关知识点
一:Package---》

Package就相当于一个文件夹,用来分类管理类文件的,也是一种封装的形式。包写在程序第一行,这样的话类名全称是:包名.类名

用以下例子解释,如图1所示

package   BaoDemo;

class   Bao
{
public  static  void  main(String[] args)
{
System.out.println("Hello World!");
}
}


图1

其中图1编译的结果为图2



图2

由图2中,可以看出编译是可以的,但是运行就会出问题。既然编译没有问题那么就会产生对应的class文件,但是,为什么运行就出问题了呢?这是因为Java文件中存在包,所以在DOS窗口中编写的java Bao这种格式不正确,应该写Java BaoDemo.Bao,接着运行结果如图3所示还是不成功的。



图3

为什么还是会出错呢?因为既然有package,那么就要在当前目录下新建一个BaoDemo的文件夹,把之前已经产生的类文件放进去,本人此次试验的当前目录是E:\JAVAwenjian



图4

再运行一次就可以了如图5所示:



图5

但是每次都这么新建文件夹,很麻烦,所以有另外一个办法解决。

以下是一个例子:

package  deg;

class  Bao2
{
public  static  void  main(String[] args)
{
System.out.println("deg包的Hello World!");
}
}


图6

在DOS窗口的编写如图7所示:



图7

其中,javac -d . Bao2.java表示在当前目录下新建一个deg文件夹,并且在deg文件夹里面生成class文件。而且当中的-d表示地址,而后面的. 则是表示当前目录,所以,-d是用来指定目录位置的,当然也是可以指定其他位置的。

以下是包与包之间访问例子:

package    Abao;
/*
Abao包中有一个Alei类
*/

public   class   Alei //extends  Bbao.Blei//Abao包里面的Alei类继承Bbao包里面的Blei类
//因为Alei类会被其他包的类调用所以加public
{
public   void zongjie()//因为会被其他包中的类访问,所以加public
{
System.out.println("总结有好处");
//eat();
//study();//study()方法在Bbao包的Blei类中被protected修饰
//不同包中的子类可以直接访问父类中protected修饰的成员
//sleep();这句话编译不通过
/*
因为这个sleep()方法在Bbao包的Blei类中为默认权限
*/
}

}


图8

package   Cbao;

class   Clei
{
public   static   void   main(String[] args)
{
Abao.Alei  dx= new Abao.Alei();
dx.zongjie();
System.out.println("Hello World!");
}
}


图9

Abao包中有一个Alei类;Cbao包有一个Clei;而且Clei要访问Alei其编译运行结果如图10所示。



图10

如图10所示,cmd命令行先输入javac e:\JAVAwenjian\erliou Alei.java这句话的意思是在目录e:\JAVAwenjian\erliou中产生Abao文件,Abao文件里面生成对应的class文件;接着set classpath=e:\JAVAwenjian\erliou这句话设定类路径为e:\JAVAwenjian\erliou第三行输入的javac -d e:\JAVAwenjian\erliou Clei.java表示也在e:\JAVAwenjian\erliou这个目录下生成Cbao文件,Cbao文件中生成对应的class文件

以下关于包与包之间访问的权限问题:

package   Abao;
/*
Abao包中有一个Alei类
*/

public   class   Alei  extends  Bbao.Blei//Abao包里面的Alei类继承Bbao包里面的Blei类
//因为Alei类会被其他包的类调用所以加public
{
public  void zongjie()//因为会被其他包中的类访问,所以加public
{
System.out.println("总结有好处");
eat();
study();//study()方法在Bbao包的Blei类中被protected修饰
//不同包中的子类可以直接访问父类中protected修饰的成员
//sleep();这句话编译不通过
/*
因为这个sleep()方法在Bbao包的Blei类中为默认权限
*/
}

}


图11

package Bbao;
/*
Bbao包中有一个Blei类
*/

public  class   Blei //因为会被Abao包中的Alei类继承(访问),所以要加public
{
public   void   eat()//因为会被Abao包中的Alei类访问,所以要加public
{
System.out.println("吃饭了");
}
protected   void   study()//protected保护权限
{
System.out.println("学习啦");
}
void   sleep()//默认权限
{
System.out.println("睡觉了");
}
}


图12

package Cbao;

class Clei
{
public   static   void   main(String[] args)
{
Abao.Alei  dx= new Abao.Alei();
dx.zongjie();
System.out.println("Hello World!");
}
}


图13

编译运行过程如图14所示:



图14

由此我们可以得知访问权限的大小关系是:

这样的public>protected(保护权限)>默认权限>private

以下是访问权限排序列表:

/*

public      protected   默认权限     private
同一个类        可以          可以        可以        可以
同一个包        可以          可以        可以
子类            可以          可以
不同包          可以

*/


图15

小知识点1:假如Bbao包里面除了Blei类之外还有另外一个类B1lei,其他包的类需要调用B1lei类的话不能直接在B1lei类前面加public,因为Blei类已经被public修饰了,一个Java文件里面只能有一个公共类,那么只有把B1lei类放在另外一个新建的Java文件中再调用。

小知识点2:包里面还有包的情况也是存在的,编写代码的时候就是这样写就可以了,举一个例子:在Java文件中的第一行加上package yi.er.san;这句话的意思是yi包里面有er包,er包里面有san包。也就是文件里面还有文件的意思,而且,这种情况下建立对象也是:yi.er.san.类名=new yi.er.san.类名();

————————分割线——————————

关于jar的知识点:



图1

在cmd命令中输入jar之后回车键得到的资料。

之前的实验中已经得到了在e:\JAVAwenjian\erliou目录下面的三个包:Abao,Bbao,Cbao



图2

在cmd命令行输入



图3

其中图3 的jar -cf hehe.jar Abao Bbao Cbao 表示新建一个压缩包,名字是hehe.jar并且把Abao Bbao Cbao这三个包压缩进里面。

再把原来的三个包Abao Bbao Cbao 删除,如图4:



图4

在cmd命令行输入



图5

在图5中,先是设定class路径指向hehe.jar然后直接运行Cbao.Clei运行结果和之前的实验结果一样的。

图6是一些显示jar压缩包的信息:



图6

但是有时候显示的资料过多,不方便在DOS窗口看的时候,我们可以把这些需要显示的资料放在TXT文件中,操作如图7所示:



图7

操作后看看d盘下是否有hehe.txt文件:



图8

里面都是需要显示的资料

————————分割线——————

package Dbao;
//import Dbao2.hh.tt.jj.bb.*;//导入Dbao2.hh.tt.jj.bb里面的所有类文件
import Dbao2.hh.tt.jj.bb.Dlei2;//表示仅仅是导入Dbao2.hh.tt.jj.bb中的Dlei2类文件
/*
但是如果有Dbao2.hh.tt.jj.bb.Dlei2
假如还有  Dbao2.hh.tt.jj.kk
kk与Dlei2都是类文件
在这种情况下,import Dbao2.hh.tt.jj.*;//只是表示导入Dbao2.hh.tt.jj里面的所有类文件,就是kk类文件而已,绝对不是表示导入Dlei2类文件
*/

class   Dlei
{
public   static   void   main(String[] args)
{
/*
既然已经导入了Dbao2.hh.tt.jj.bb里面所有的类文件,
那么接下来新建对象的写法和以前一样了
*/
Dlei2  a= new Dlei2();
/*
但是还有一点需要注意,如果导入的两个包中有同名类的话,那么建立对象的时候就要写包名以示区别
还有包名尽量不要重复

*/
System.out.println("HelloWorld!");
}
}
//下面是另外一个包Dbao2.hh.tt.jj.bb里面的类
package   Dbao2.hh.tt.jj.bb;

public   class    Dlei2
{
public  void    method()
{
System.out.println("这是Dbao2.hh,tt,jj,bb中的Dlei2类");
}
}


-----------android培训java培训、java学习型技术博客、期待与您交流!------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: