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

黑马程序员----包(package)

2015-08-15 15:10 483 查看
——- android培训java培训、期待与您交流! ———-

包:package

1.对类文件进行分类管理;

2.给类提供多层命名空间;

3.写在程序文件的第一行;

4.类名的名称是:包名.类名;

5.包也是一种封装形式。

包用package关键字来定义:package pack;

包的文件名都是小写;

问题:

1.找不到类,名称错误;

2.目录中没有文件;新建文件夹.

自己生成包:

命令加参数:javac -d d:\java0217\day10

-d:指定这个包所存放的位置,也就是目录;

d:\java0217\day10:文件夹路径,如果是当前文件夹,可以用.代替,即javac -d .

javac -d c:myclass PackageDemo.java    //在c盘下的myclass文件夹下面建立一个名为pack的包,包里面存放的是PackDemo.class文件。

包的出现可以让类文件和源文件相分离,好处在于,当对方想要拿程序的时候,只需要拷贝class文件即可,不用再拷贝源文件

可以用classpath指定包存放的位置:classpath指向包的父目录即可,不用加pack;

set classpath=c:\myclass    //后面不用再写pack,pack和PackageDemo.class是一个整体,

运行:java pack.PackageDemo

包与包之间的访问:

    不同包中的类该如何访问呢?

package pack;

public class DemoA
{
public void show()
{
System.out.println("hello package");
}
}
public class PackageDemo
{
public static void main(String[] args)
{
pack.DemoA d=new pack.DemoA();
d.show();
}
}
javac -d c:myclass DemoA.java

javac -d c:myclass PackageDemo.java    

编译失败:找不到符号DemoA

错误原因:类名写错了,因为类名的全名是包名.类名。

修改后重新编译:javac -d c:myclass PackageDemo.java    

编译失败:pack软件包不存在;

错误原因:当前目录下没有这个包,包在myclass文件夹下。

解决方法:需要设置classpath,告诉jvm去哪里找指定的packb包:set classpath=c:myclass

修改后重新编译:javac -d c:myclass PackageDemo.java

编译错误:pack.DemoA在pack中不是公共的,无法从外部软件包中对其进行访问;

错误原因:DemoA在包里的权限不够大,有了包,范围变大,一个包中的类要被访问,必须要有足够大的权限;

解决方法:被访问的类加public关键字修饰.

重新编译:

javac  -d c:myclass DemoA.java

javac -d c:myclass PackageDemo.java

编译失败:show方法在pack.DemoA中不是公共的,无法从外部软件包中对其进行访问;

错误原因:类公有后,被访问的成员也要公有才可以被访问;

解决方法,show方法加public关键字修饰,增加权限;

重新编译,通过。

运行:java pack.PackageDemo

总结:

包与包之间进行访问,被访问的包中的类以及类中的成员需要public修饰;

---------------------------------------------------------

不同包中的类能不能有关系呢?

不同包中的类可以相互继承,但是要记得在被继承的那个包里的类前面一定要加包名;
package pack_1;

public class DemoB extends pack.DemoA
{
public void method()
{
System.out.println("demoB method run");
show();//可以直接使用父类的方法show;
}
}
public class PackageDemo
{
public static void main(String[] args)
{
pack_1.DemoB d=new pack_1.DemoB();
d.method();

//可不可以建立父类DenoA的对象呢?可以
pack.DemoA p=new pack.DemoA();
p.show();
}
}
编译:

javac -d c:\myclass DemoA.java

javac -d c:\myclass DemoB.java

javac -d c:\myclass PackageDeno.java

运行:

Java pack.PackageDemo

但是存在问题,不管是不是继承父类,都可以建立对象,因此Java给包中的子类提供了一个特殊权限:protected;

继承父类,就能拿到一些别人拿不到的东西;

public class DemoB extends pack.DemoA
{
public void method()
{
System.out.println("demoB method run");
show();//可以直接使用父类的方法show;
}
}
public class DemoA
{
protected void show() //被protected权限修饰;
{
System.out.println("hello package");
}
}
加了保护权限之后,就不能再在主函数中直接建立父类的对象和调用父类方法;

总结:

不同包中的子类可以直接访问父类中被protected权限修饰的成员。

-------------------------------------------------------------

包与包之间可以使用的权限有两种:

public:公有权限;

protected:被保护权限;

权限的说明:(按权限大小)

public:公有权限;

protected:被保护权限;

default:默认权限;

private:私有权限;

                        public    protected    default     private

同一个类中:       Y            Y              Y            Y

同一个包中:       Y            Y              Y            N

子类:                   Y            Y              N            N

不同包中             Y            N               N            N

protected在同一包中主要体现在覆盖上,权限大于等于就可以覆盖;

记住:一个Java文件中不能出现多于一个的公有类或者接口,

因为在命名的时候,当被public所修饰的时候,类名必须和文件名保持一致,如果出现多个,就会发生冲突;

解决方法:放在一个包中就可以。

包里面可以有多层包:(对类进行逐级存放,分层管理)

定义格式:

package pack.haha.heihei.hehe;
package packb.haha.heihei.hehe;
public class DemoC
{
public void method(){}
}


想要在packageDemo这个文件中建立Demo对象,该怎么做呢?

package pack;
class PackageDemo
{
public static void main(String[] args)
{
packb.haha.heihei.hehe.DemoC c=new packb.haha.heihei.hehe.DemoC();
}
}


发现建立对象很费劲,怎么办呢?

import关键字,可以帮我们简化包名的书写,导入的是包中的类;

package pack;

import packb.haha.heihei.hehe;//导入包,DemoC类就进入到当前文件中;
class PackageDemo
{
public static void main(String[] args)
{
DemoC c=new DemoC();	//直接写类名即可;
}
}


import packb.haha.heihei.*;//*表示所有文件;当前目录下的所有类导入到文件中;

但是比较占内存,不建议这样用。那怎么办呢?

建议不要写*,用哪个就导入哪个;

用eclipse不用写package,也不用写import,都可以自动导入;快捷键:ctrl+shift+o;

导入了两个包,但是这两个包里有重名的类,普通的建立对象的方法是不允许的,一编译会告诉你搞不清楚这个类到底是属于谁的;

怎么办?

建立对象的时候,必须加包名;

为了不让包名重复,定义包名的方式是:

可以使用url来完成定义,因为URL是唯一的。

www.itcast.cn

package cn.itcast.demo

package cn.itcast.test

Jar包:Java的压缩包

    1.方便项目的携带;

    2.方便于使用,只要在classpath设置jar路径即可;

    3.数据库驱动,SSH框架等都是以jar包体现的。

jar包的建立需要使用jdk中的工具jar.exe;
package pack;
import pack.*;
class JarDemo
{
public static void main(String[] args)
{
//创建A的对象;
DemoA a=new DemoA();
a.show();
System.out.println("Hello jar package");
}
}
编译:

javac -d c:\myclass DemoA.java

设置classpath:

set classpath=c:\myclass

编译JarDemo.java:

javac -d c:\myclass JarDemo.java

运行:

Java pack.JarDemo

压缩成jar包:

jar回车

jar -cf haha.jar packa pack

查看jar包中的文件:

jar -tf haha.jar

(jar包在创建的时候会自动生成一个文件夹,里面存放的是配置清单文件,这个文件可以被改动,改动之后jar包会具备特殊的意义或者操作方式。)

(jar包在图形化界面上可以被双击执行,类似于.exe)

删除myclass中的这两个文件之后,它们的父目录就不再是myclass而是jar包。

设置classpath=c:\myclass\haha.jar

当jar包中的文件很多时,可以使用下面的命令编辑成记事本文档来保存:(数据重定向)

jar -tf haha.jar >c:\1.txt

rt.jar:是Java的类库,Java的对象都在这里。

tools.jar:编译所属的类,如果删除了,编译就挂了。

src.zip:java的所有类的源文件。

native关键字:修饰本地方法;这个方法是看不到方法体的,因为它在调用windows系统的东西

(是哪个类型的虚拟机,就调用哪个类型的系统,先找虚拟机,虚拟机找系统)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 包package