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。我们使用命令行来编译运行。

  1. 带包名的。

源码:

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(包)。


关于Java中的模块(Module)可参见
https://blog.csdn.net/cnds123/article/details/123903184​​​​​​​



java程序的组织结构相关推荐

  1. Java程序员从笨鸟到菜鸟之(一百零九)一步一步学习webservice(三)开发第一个基于XFire的webservice

    在日常开发中,常用的webservice引擎主要有Axis,axis2,Xfire以及cxf(Xfire的升级版).现在只有axis2和cxf官方有更新.今天我们先以一个比较老的引擎为例.来讲诉一下w ...

  2. 优秀 Java 程序员写代码的风格

    转载自 涨姿势 | 优秀 Java 程序员写代码的风格 今天突发奇想,对编码习惯和 编程风格 很感兴趣,于是乎,找了一下关于编程风格(Java篇)的资料,希望对爱好编码或者开始学习编码的同学有帮助! ...

  3. 五年Java程序员进阶架构师的一些心得以及职业生涯规划

    1. 引言 搞Java的弟兄们肯定都想要达到更高的境界,用更少的代码解决更多的问题,用更清晰的结构为可能的传承和维护做准备.想想当初自己摸着石头过河,也看过不少人介绍的学习路线,十多年走过来多少还是有 ...

  4. Java程序员开发5年,该如何制定自己的职业规划

    很多小伙伴从一踏上JAVA程序员这条路开始,总是感觉Java多线程在实际的业务中很少使用,以至于不会花太多的时间去学习,技术债不断累积!整日深陷在创造Bug和修改Bug的无限循环中,上班来得最早的是你 ...

  5. Java程序员从笨鸟到菜鸟之(一百零九)一步一步学习webservice(三)开发第一个基于XFire的webservi

    在日常开发中,常用的webservice引擎主要有Axis,axis2,Xfire以及cxf(Xfire的升级版).现在只有axis2和cxf官方有更新.今天我们先以一个比较老的引擎为例.来讲诉一下w ...

  6. 作为一名合格的JAVA程序员需要点亮那些技能树?

    转自:https://zhuanlan.zhihu.com/p/26035486 先看看这些程序员技能树,你掌握或了解哪些?OMG竟然有么多---震精!震精!!! 这是从450家企业的招聘信息中统计而 ...

  7. Java程序猿面试题集(181- 199)

    Java面试题集(181-199) 摘要:这部分是包括了Java高级玩法的一些专题,对面试者和新入职的Java程序猿相信都会有帮助的. 181.  182. 183. 184. 185. 186. 1 ...

  8. java负数右移_收入囊中篇---Java程序基础(二)

    前言: 本篇是接着上一篇更新的,如果没有阅读上一篇的话,可以查阅或回顾一下. 1.收入囊中篇---Java基础必备知识(一) 2.收入囊中篇---Java程序基础(二) Java程序基础目录 1.Ja ...

  9. 2020年Java程序员不得不学习的10大技术

    对于Java开发人员来说,最近几年的时间中,Java生态诞生了很多东西.每6个月更新一次Java版本,以及发布很多流行的框架,如Spring 5.Spring Security 5和Spring Bo ...

  10. Java程序启动同时复制resources下文件到jar包同级目录

    Java代码调用.exe,包括获取exec()中的日志并打印,可以看我之前的博客 一.Java调用exe打包成jar的调用方式有俩种: Java程序中resources下的exe等文件,是可以同时打包 ...

最新文章

  1. 系统清理工具(Wise Care 365)绿色版
  2. 引子 我想大家应该都很熟悉DNS了,这回在DNS前面加了一个D又变成了什么呢?这个D就是Dynamic(动态),也就是说,按照传统,一个域名所对应的IP地址应该是定死的,而使用了DDNS后,域名所对应
  3. Git bash 终止git log 命令
  4. 金环(2017佛山市选拔初中组)
  5. 台湾国立大学郭彦甫Matlab教程笔记(14)polynomial differentiation多项式微分
  6. yum 安装jdk_03Centos安装JDK
  7. Jmeter之函数助手操作
  8. RealSense开发-Session和SenseManager的几种创建方法
  9. yum安装本地rpm包_在 Fedora 中安装替代版本的 RPM 包
  10. matlab实现图像放大两倍,matlab图像处理基础知识0(双线性插值matlab实现--调整水平和垂直放大倍数)...
  11. Java多线程系列(六):深入详解Synchronized同步锁的底层实现
  12. ds图—最小生成树_Python实现最小生成树
  13. 【产品评测】华为开源镜像站体验:美好终将不期而遇
  14. 一个简单计算器demo 拥有记忆和记忆清除功能
  15. 一支python教学_第一只python爬虫
  16. Django--CRM-客户列表展示, 分页
  17. Navicat Premium 15注册出现“rsa public key not find”
  18. 秋招历险记-计算机网络篇
  19. 【BUUCTF】[Zer0pts2020]Can you guess it?
  20. KF与无迹卡尔曼滤波详解

热门文章

  1. 很荣幸,和各位一起创造了历史
  2. .md文件简单的转化为pdf文件
  3. 高一计算机函数公式,高中全部函数公式大全
  4. android设计稿做ui px,苦逼APPUI设计师的标注切图的利器—PxCook
  5. 前端——阿里图标的使用详解
  6. 2019年那些成年人的崩溃瞬间,看着看着就哭了
  7. matlab 方位角 经纬度,经纬度转方位角matlab程序
  8. 4G基站软件产品测试,基站信号测试软件使用.doc
  9. 《区块链底层设计Java实战》之第一章区块链简介
  10. 新库上线 | CnOpenData制造业工商注册企业基础信息数据