Java程序的组织结构
JAVA程序是由类和接口组成的。
一个简单的java程序,有一个类即可。
一个简单的类,可以仅包含一个入口方法public static void main(String[] args),如下:
public class类名{
…
publicstatic void main(String[] args){
…
}
}
一个比较完整java程序包括下列部分
package语句;
import语句;
publicClassDefinition; // 公共的类定义部分,至多只有一个公共类的定义
// java语言规定该java源程序的文件名必须与该公共类名完全一致
classDefinition;// 类定义部分,可以有0个或多个
interfaceDefinition;// 接口定义部分,可以有0个或多个
一般地,具有相同功能的类放在一个package中。
一个java源程序至多只能有一个公共类(public类)的定义。
若java源程序有一个公共类的定义,则该源文件名字必须与该公共类的名字完全相同。
若源程序中不包含公共类的定义,则源该文件名可以任意取名。
若一个源程序中有多个类定义,则在编译时将为每个类生成一个.class文件(以类名为文件名,以.class作为扩展名,扩展名也称为后缀)。
java源文件又称为编译单元。一个java文件可以包含多个类,但至多包含一个公共类(public类),作为该java文件的公用接口,公共类的名字和源文件的名字要相同,但后缀为.java。
一个java文件中,在不同类中,是可以有多个public static voidmain(String[] args)
示例如下:
package lc01;
public class cs {
cs(){
System.out.println("你好啊! world!");
}
public static void main(String[] args) {
new cs();
}
}
class a{
public static void main(String[] args){
}
}
但是,对于一个Java程序而言,往往只需要一个入口,也就是只需要有一个类包含main方法,而其他类都是用于被main方法直接或间接调用的。
如果一个java源程序中含有public的类,则文件名必须与类名一致,如果没有public类,则文件可以随意命名。一个文件中,public的类可以有零个或一个,非public的类可以有零个或多个。
又,public static void main()不是必须要放在public类中,如
package lc01;
class Dog{
Dog(){
System.out.println("I'm a dog.");
}
public static void main(String[] args){
new Dog();
new Cat();
}
}
class Cat{
Cat(){
System.out.println("I'm a cat.");
}
}
文件中没有一个public类,程序也能正常运行。
Java包、公共类与Java源码文件的关系
包(package)是一个为了方便管理组织java文件的组织和管理方式。包内包含有一组类。可以使用import关键字来导入一个包。例如使用import java.util.*就可以导入java.util包里面的所有类。所谓导入这个包里面的所有类,就是在import声明这个包名以后,在接下来的程序中可以直接使用该包中的类。
一个Java源代码文件必须有一个后缀名.java,此文件通常被称为编译单元。在编译单元内有且仅有一个public类,否则编译器就不会接受。该public类的名称必须与文件的名称相同(包括大小写,但不包括后缀名.java)。
当编译一个.java文件(即一个编译单元)时,在.java文件中的每个类都会有一个输出文件,而该输出文件的名称与.java文件中每个类的名称相同,只是多了一个后缀名.class。因此在编译少量.java文件之后,会得到大量的.class文件。每个.java文件都是一个构件,如果希望许许多多的这样的构件从属于同一个群组,就可以在每一个.java文件中使用关键字package。而这个群组就是一个包。
例如,假设文件的名称是Apple.java,这就意味着在该文件中有且仅有一个public类,该类的名称必须是Apple(注意大小写):
package fruit;
public class Apple
{
//...
}
上面的代码已经将Apple类包含在了fruit包中,现在如果有人想使用Apple或者是fruit中的任何其他public类,就必须使用关键字import来使fruit中的名称可用。
import fruit.*;
public class ImportApple
{
public static void main(String[] args)
{
Apple a=new Apple();
}
}
或者使用带包名的限定名称:
public class QualifiedApple
{
public static void main(String[] args)
{
fruit.Apple a=new fruit.Apple();
}
}
显然使用关键字import使代码更加简洁。
一个项目(Project)可以有几个包,包是为了更好的规划整理你写的各个类,将相关的类放在一个包中。包是为了更好的规划整理你写的各个类。
包(package)的作用
1 把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。
2 如同文件夹一样,包也采用了树形目录的存储方式。同一个包中的类名字是不同的,不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别。因此,包可以避免名字冲突。
3 包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类。
java使用包(package)这种机制是为了防止命名冲突,访问控制,提供搜索和定位类(class)、接口、枚举(enumerations)和注释(annotation)等。
在Java源文件中,如果使用package语句,则package语句应作为第一条可执行语句(它的前面只能有注释或空行),指明该源文件定义的类所在的包。package语句的一般格式为:
package 包名;
包名可以是一个合法的标识符,也可以是若干个标识符加“.”分割而成,包的名字有层次关系,各层之间以点分隔。包层次必须与Java开发系统的文件系统结构相同。例如 packageaaa.bb.image
则此文件必须存放在aaa\bb\image目录下
如果源程序中省略了package语句,源文件中所定义命名的类被隐含地认为是无名包,即源文件中定义命名的类在同一个包中,但该包没有名字。
包(package)分为无名包和有名包,无名包的好处是无需对包作任何声明,可以拿来方便快捷使用,但也因为无名包没有名字,所以其它包无法用import语句导入访问无名包中的类,所以说无名包只适合在局部应用。而有名包就可以被其它包所访问,先用import语句导入,再用“包名.类名”方式访问指定包中指定的类。
使用命令行编译运行带包名和不带包名的Java源文件HelloWorld
1.不带包名的。
源码:
public class HelloWorld{
public static void main(String args[]){
System.out.println("helloworld");
}
}
文件名字必须是:HelloWorld.java。我们使用命令行来编译运行。
- 带包名的。
源码:
package net.csdn.blog;
public class HelloWorld{
public static void main(String args[]){
System.out.println("helloworld");
}
}
具体步骤(我的是在D盘下):
1. 创建文件夹net,在文件夹下面再创建csdn,再创建文件夹blog,把HelloWorld.java放在blog下。
2. 命令行先编译HelloWorld.java。
3. 再运行命令java net/csdn/blog/HelloWorld。
关于java项目程序目录结构的建议
建议将源码文件(即扩展名为.java的文件)和编译成字节代码文件(即扩展名为.class的文件)分开,如将源码文件放在scr目录中,将编译成字节代码放到classes目录中.
建议将使用包(package)的源码文件,放在和包层次相同的目录中,目的是把不同的 java 程序分类保存,但这不是必须的。
按照这些建议,层次分明,可以减少混乱,项目中文件越多就越能体现出其好处。
例、有一个使用包的程序文件Something.java源码如下
package lee.java;
public class Something{
//主要执行区块
public static void main(String[ ] args){
//程序语句
System.out.println("我的第一个Java程序");
}
}
使用带 -d参数javac 编译成字节代码:
javac -d D:\JavaTest2\classes D:\JavaTest2\src\Something.java
现在,目录结构示意图如下:
运行命令:
java -classpath D:\JavaTest2\classes lee.java.Something
从Java 9版本中Java 语言引入了一个非常重要的概念:模块(module)。module引入了Java代码分组的另一个级别。每个module都包含许多子package(包)。