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

来源:互联网 发布:linux 显卡驱动安装 编辑:程序博客网 时间:2024/05/14 18:16

——- 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系统的东西
(是哪个类型的虚拟机,就调用哪个类型的系统,先找虚拟机,虚拟机找系统)

0 0
原创粉丝点击