/*
包:包就是java中的文件夹,一个文件夹就对应java中的一个包。包表现在具体的操作系统(如Windows)中,就是一个
文件夹。是用来存放类文件的即.class文件,也可以存放其他的子包,即包中有包。
在JAVA的世界中,没有什么源文件,核心的文件就是.class文件,即java运行文件。文件夹就是包。带压缩的文件夹
就是Jar包。
总的原则是:
1、一个java源文件(即.java文件)中可以定义多个类(即class),该源文件在编译的时候,每一个类都会形成一个
.class文件,包括内部类在内。
2、含有main方法的类(即public static void main(String[] args))是可以独立运行的类,即不需要依靠其他类
的调用,直接交给JVM,就可以被JVM运行的类。没个类都可以作为主类。一个程序有多个主类也可以,但一般没有
这样设计的,一般坚持一个程序只有一个程序入口。
3、一个Java源文件中(即.java文件)中只可以有一个公共类(即被public修饰的类)。因为有这样一条规定,如果
一个源文件中存在一个公共类,则源文件名必须和该公共类同名,否则编译时就会报错。所以,当一个Java源文件中
有多个公用类时,文件名就不知道该和哪个公共类名称一致了。所以java源文件中不允许出现两个以上的公共类,
最多只能有一个公共类,可以没有,没有公共类时,java源文件的名称可以任意命名,可以与源文件中定义的某个类
的名称相同,也可以与源文件中的任何类的名称都不相同,任意命名,编译时都会通过。
4、而位于同一个java源文件中的类也位于同一个包中。
经过编译后,就不存在源文件了,程序变成由一个个类文件组成,而这一个个类文件又被放在文件夹中,即被包
所管理。
————————**由于有了包之后,类也就有了公用类和默认类之分,公共类是可以突破包的封装隐藏,而暴露除去,给其他包中的
类所使用的公共类。而默认类(即没有被任何修饰的类),只能在本包中被使用,被引用,即时是父包中的类也
无法引用。**
带包的源文件的编译和运行方法:
带包的源文件的编译:用Javac直接编译即可。如果没有用创建文件的javac命令编译,则编译出的.class文件不能
被JVM所找到识别。必须手动创建文件夹(即包),按照源文件中包的定义,创建出文件夹目录,将.class文件放入
其中,然后再用JVM运行主类,而运行时需要主类的完全名称,即包名.类名。并且需要设置classpath路径,在
classpath中找完没有,在当前文件夹下找,查找的方式按照包名.类名的方式,每一个包名是一个文件夹,所以
会在classpath所显示的路径下及当前路径下(如果classpath带有;),按照包名——文件夹名,包名——文件夹名,
类名——.class文件名的方式查找。最后一个.之前的都是包名,如果查找不到就会报错。
带包的类的运行方法:必须用完全类名来引用类,即用包名.类名的方式。JVM(java虚拟机)查找该类的方式
和上面描述的一致,按照包名对应文件夹名,类名对应.class文件名的方式查找,找到则加载,当然还有检查
权限是否足够大。
注意:我认为默认包机制,是没有包名的,即所在文件夹即根目录即时默认包。没有定义包的类,都是在根目录下
即默认包中。
补充:javac编译器和java运行器的工作,都不可能离开jvm,java虚拟机相当于一个小的java操作系统。但这个
Java操作系统必须运行在其他操作系统之上,即属于一种寄生操作系统。而java语言写的源文件(即.java文件)和
java的运行文件(即.class文件)都只有JVM能够识别,即只有java虚拟机能够识别Java语言和运行java语言编译
后的字节码文件。其他操作系统不行,没有该功能。windows和Linux都不行,除非内嵌了java虚拟机的功能。
————————**javac和java运行器,这些工具程序,都是用java语言开发的程序,所以本质上都是一些java的.class类文件,而
这些类文件需要通过jvm来运行的,所以是调用Jvm的功能,通过jvm来进一步调用使用宿主操作系统的底层功能。
而classpath是给JVM使用的,是JVM在寻找.java文件和.class文件中的类时,依据的查找路径。所以编译的时候
也会同样使用到classpath环境变量,编译一个.java文件时,如果.java文件中用到了其他类,JVM会依据classpath
环境变量中设置的路径依次查找该类的.class文件或者源文件.java文件,若找到.class文件则直接使用,若找
到.java文件则先编译成.class文件后使用。即本质上JVM使用的是.class文件,而不是.java文件,来形成当前需要
编译的.java文件的.class类文件。**
创建方法: 用关键字package来创建,包名一律用小写。
eg. package pack;
包的作用:
1、包是对类文件的管理
2、包是为了区分同名类文件而引入的命名空间(即名称空间)。
3、包也是一种封装。
注意:所以本质上类的名称为:包名.类名 ,这个称为类的完全限定名,也称为完全类名。
包的创建要位于一个java文件(即源文件)的第一行。因为要先有包文件,然后再有类文件。对于没有显示用package
关键字创建包的类文件,则采用默认java默认包机制,即将java源文件所在的当前目录作为一个默认包。
将.class文件放在里面,所以就会看到之前编译后的类文件和java源文件是在一个文件夹下的。
Dos命令行创建带有包(即文件夹)的类文件时,需要使用带参数的javac语句,即 javac -d 目录 Test.java。
这样编译后会将Test.class文件放到Test.java中package语句所定义的包(文件夹)中。
用java运行类时,必须要带有包名,否则找不到类。
java允许包中有包,是因为那么多的类文件需要分层分类管理。包下的子包,就是一种分层管理。
包对于类的封装,体现为将一部分功能相似的类或者有某些关系的类放到一个包中,同时通过关键字public,protected
将某些类及类中的方法提供出去,而某些类作为包的内部使用,不对外提供。
eg. 1、对于包与包之间类的访问,必须将包中的类
例如:
【表 1】:基于类的封装,对类中成员的隐藏程度的设置,形成了类中成员的权限。
<java中类成员的权限和各权限的作用范围>
一个java源文件中的一处代码是否可以访问(引用)某个类中的成员。
————————————————————————————————————————————————————————————————————————————————————————————————————————————————
不同类中的成员是否可以访问(引用)就依照该表,即在一个java源文件中是否可以出现该成员的名称
成员权限修饰符: public | protected | default(没有该关键字,什么都不写就是默认权限) | private
(作用范围:) | | |
同一个类中成员 ok | ok | ok | ok
同一个包中的类中成员 ok | ok | ok |
不同包中子类和父类中成员 ok | ok | |
不同包中的非子父的两个类中成员 ok | | |
————————————————————————————————————————————————————————————————————————————————————————————————————————————————
注意:表 1 的使用是需要参照 表 2 的,即表1 中的情况是建立在类的访问没问题的基础上,对类中成员的访问是否可以。
如果类的访问就不行,那成员就更白扯了,就更不行了,无论是什么权限。
【表 2】:基于包的封装,对包中类的隐藏程度的设置,形成了包中类的权限。
<java中类的权限和各权限的作用范围>
一个java源文件中的一处代码是否可以访问(引用)某个类。
————————————————————————————————————————————————————————————————————————————————————————————————————————————————
不同的类之间是否可以访问(引用)就依照该表,即在一个java源文件中是否可以出现该类的名称
类权限修饰符: public | default(没有该关键字,什么都不写就是默认权限)
(作用范围:) |
同一个包中的类 ok | ok
不同包中的类 ok |
————————————————————————————————————————————————————————————————————————————————————————————————————————————————
*/
class Demo
{
}
class PackDemo2
{
public static void main(String[] args)
{
System.out.println("Hello World!");
}
}