初学者应从文件目录结构理解import的过程,并创建自已的代码库

                                                          ——初步看SUN如何让JAVA“降低程序开发的复杂度”

    一开始学JAVA的时候就对自己说应该要勤做笔记,但又发现列表式逐条记录的意义并不是很大,还不如动手编写来得有趣,有效。经过一段时间后发现了几个比较有趣的话题,于是,才知道要写些什么,总结些什么,并且觉得这样逐个话题写的方式很有趣,因为它总是把几个本来独立的部分联系在一起,所在看这篇日志还是要求你有一定的java基础才行的,不然会比较痛苦(虽然今天写的这一部分是每个程序员,学习每种语言的开始)。

    正酝酿着几个话题,不过更新应该会很慢,估计到下个学期初也不能把所有的写完,今天这篇是关于——粗略理清java JDK的文件目录结构,从而理解何为包,怎么导入(import)一个.jar或者一个库类,来运用别人或者自己已经编写完成的功能,以加快程序的编写速度,提高工作效率。

这是个很重要的过程,熟悉了这块和较稳固的基础知识,你就要以在开源社区里闲逛啦。

    注意:初学者最忌讳的是一开始用各种IDE集成开发环境,应该用命令行,这也是最起码的要求。所以本文是基于命令行的操作,不打算用命令行的,或者你没有足够的耐心和兴趣来用命令行的话别看算了,不过这样做(不会用命令行)你会吃亏的。

 JDK根目录 jdk和jre 

    开发JAVA应用程序需要安装JDK,安装完后其根目录就是这两个 。其中,运行java应用程序用到 “jre” 文件夹中的文件,而开发应用程序的各种工具和基本库类就在于“jdk”文件夹内了。所以粗略地记住,这两个文件夹,一个是开发用的,一个是运行用的。

从一个Hello world 程序看,如何设置环境变量

    先看一段简单的代码,想想怎么用doc命令行运行(用到java 和javac命令)?这些命令软件在哪个文件内?代码如下:

1.    import javax.swing.*;
2.    import java.awt.*;
3.    public class HelloWorld extends JFrame{
4.        private JLabel jlabel;
5.        public HelloWorld(){
6.            super("Hello");
7.            jlabel=new JLabel("HelloWorld,Iris");
8.            setLayout(new FlowLayout());add(jlabel);
9.            setBounds(110,100,200,100);setVisible(true);
10.        }
11.        public static void main(String args[]){
12.              new HelloWorld();
13.        }
14.    }

    如果我把代码源文件放在C盘。那么在doc控制台下切换到C盘后,输入如下命令运行程序:

    命令行1  c:>javac HelloWorld.java      编译生成字节码文件(HelloWorld.class),然后再输入以下命令执行程序 :

    命令行2  c:>java HelloWorld    就可以看到运行结果。

    运行结果:
                

     但这个过程中,其实有几个问题要问自己的:

    1、为什么要用两个命令行来执行一个源程序,java程序的开发过程是怎么样的?

    2、javac和java在哪,按平时的使用习惯,如果没有桌面快捷键,平时我们运行QQ等软件需要在它所在的位置双击运行,那为什么我的工作目录在C盘却可以运行它?(其实在任何其它目录下同样可以执行这两个软件,为什么呢?

    3、我们一开始安装JDK的时候,都会被要求设置系统环境变量PATH,有时候还要设置Classpath。这些设置我们都跟着做了,但是有什么用呢?都是个谜,只能跟着做呗!

    4、执行字节码文件(.class后缀)时,java.exe首先需要知道要执行的.class文件在哪,如本例运行命令行c:>java HelloWorld,需要首先知道HelloWorld.class在哪?那我们在C盘的时候,java.exe怎么知道所需要的HelloWorld.class在哪呢?

    5、import是什么东西,有什么用?import后面的东西是怎么找到并执行的?

 寻找答案,by……

    step 1:JAVA开发过程:

      注解:

    源文件:含源代码的文件,以.java为后缀

    javac.exe:编译器,生成字节码文件

    字节码文件:与平台无关的二进制码,以.class为后缀

    java.exe:解释器,找到并执行字节码。   

Step 2:命令中运行的javac.exe和java.exe都在上面介绍过的文件夹“jdk”中,在我的系统中,它们所在目录的路径是C:/Program Files/Java/jdk1.6.0_07/bin。上面的命令行1、2就是找到这个路径后,执行javac.exe和java.exe的。那么,为什么无论我们在哪(意思就是无论我们是不是在C:/Program Files/Java/jdk1.6.0_07/bin)系统能找到呢javac.exe和java.exe?

    step 3:环境变量。说白了就是一个无论在整个操作系统环境的任何地方都可以用到的变量。我们要设置的path和classpath就是环境变量中的两个了。先说一下path,classpath后面再介绍。既然是无论在哪都可以用到环境变量,如path,那么如果我们把要用到的java.exe的路径设为环境变量,我们不就在哪都可以执行java.exe吗?——设置path的意义就是:让我们的doc控制台无论处在哪个目录下都可以直接运行java.exe。它的值是:C:/Program Files/Java/jdk1.6.0_07/bin(这是在我的系统中)。

    step 4:javac.exe是编译用的,它生成字节码文件,如HelloWorld.class,再把字节码交由java.exe执行,那么java.exe是怎么寻找字节码文件(.class文件)的呢?通过环境变量找classpath。 要运行java程序是有几个类库是必需的。一、java应用程序运行时要用到JDK自带的java类库,如java.lang.*一旦要用java语言这些类是一定要的。它位于C:/Program Files/Java/jdk1.6.0_07/jre/lib下的rt.jar中,这个类库是必须的。另外一个很重要的是“.”——指当前目录,即JVM可以在你的当前目录下搜索是否有你要的类,有则执行——如本例运行命令行c:>java HelloWorld时,JVM利classpath变量中的“.”来找到HelloWorld.class的——classpath变量的作用是找到要用的类。它的值是:.;C:/Program Files/Java/jdk1.6.0_07/jre/lib/rt.jar.

    注意:如果你没有设置“。”那么程序将运行失败,提示找不到类,不信你可以试一试。

    step 5:重头戏import 它让你节省很多功夫。先看一个我跟黄蝶打的一个比方。

    如果你有一个多啦A梦的百宝盒,里面有你想要的一切东西,和一堆做杯子的原料(假设是水,土等等),现在你要用杯子,那你会用原材料做一个呢还是从百宝盒里直接拿?

    如果你抛开一切个人主义说非要自己做一个一模一样的用起来才舒服,那你一定会选择从百宝盒里拿一个出来用就行了。

    哎!可惜你不是多啦A梦!没有这样的本事,但SUN公司给了你这样的一只手——import 就是这样一个手,让你可以从类库(相当于百宝盒)里拿出你要的杯子。

    类库就是有很类的一个小仓库。你可以在网上下载,也可以自己编写,它们都实现一定的功能。那么如何导入呢?

    还是用一个实例来一步步说明吧。下面要写一个日历,但生成日历的代码我不自己写,我只写了一段关于怎么实现导入别人写好的日历的代码,我在网上下载的一个开源的类库OpenSwing.jar——我只用一段简单的代码(这是一只手)从OpenSwing.jar这个类库(百宝箱)里拿出日历来自己用。代码如下:

1.    import com.sunking.swing.JCalendarPanel;//导入其他人写好的类库代码,相当于找到我要的百宝箱里面的东西,

                         //即OpenSwing.jar里的一个实现的日历类
2.    import javax.swing.*;
3.    import java.awt.FlowLayout;

4.    public class UseOpenSwing extends JFrame{
5.        private JCalendarPanel jcalendar;
6.        public UseOpenSwing(){
7.            super("从百宝箱里拿日历");
8.            jcalendar=new JCalendarPanel();//创建一个日历,相当于成功拿到了日历
9.            setLayout(new FlowLayout());
10.            add(jcalendar);

11.            this.setBounds(100,100,400,300);
12.            setVisible(true);

13.        }
14.        public static void main(String args[]){
15.            try{UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());}catch(Exception e){}
16.                new UseOpenSwing();
17.        }
18.    }

运行结果:

    一个很漂亮的日历就出现了,仅仅用了18行代码。

    import用来导入包(初次谈到,注意一下它)里的类。这里import com.sunking.swing.JCalendarPanel就是引用了OpenSwing.jar中的包“com.sunk.swing”众多类中的一个类JCalendarPanel。那么,在一句import com.sunking.swing.JCalendarPanel实际上做了哪些工作呢?

    import 只是说,你找到了这个东西,并且导入,程序到这一句,你还没有用到它的功能,只是找到并拿过来而已(拿了百宝箱,当没有取出杯子)。当程序运行到第8行jcalendar=new JCalendarPanel();你要才用到它。但JVM怎么调用它的呢?而OpenSwing.jar此时身在何处?

    解决这个问题,我们须要联想一下SUN在JDK中自带的库类(在tr.jar中,之前提到过),我们怎么用它的呢?外加的OpenSwing.jar和这些系统自带的.jar被调用的过程是一样的吗?答案是:一样的。外加的和自带的仅仅是路径不一样而已。和系统自带的类库一样所面临的问题是JVM怎么找到这个外加的类库呢?解决方法也是一样的——在classpath中加一个值,即OpenSwing.jar所在路径。我把OpenSwing.jar放在了E:/Lin/me/UseOpenSwing(当然,你可以放在任何你想要的位置)。所以给classpath赋一个新的值:E:/Lin/me/UseOpenSwing/OpenSwing.jar。这样:

classpath=.;C:/Program Files/Java/jdk1.6.0_07/jre/lib/rt.jar——变成——》classpath=.;C:/Program Files/Java/jdk1.6.0_07/jre/lib/rt.jar;E:/Lin/me/UseOpenSwing/OpenSwing.jar

导入就成功啦!那么接下来的问题是,怎么得到百宝箱了。

构建自己的包,形成自已的代码库

    会import了,就是有手了,可是没百宝箱怎么办,SUN公司很关照程序员,它让我们自己做一个百宝箱,或者网上乱七八糟的垃圾堆捡回来一些精华放在自己的箱子里,精华多了就成了百宝箱啦。

     网上下载就不说了,自己找。

    说说自己怎么创建百宝箱吧——创一个个的包

    其实包真的很形象,它用来装一些类(这些类就是一个个像日历那样的小工具)。为什么要用包呢?你也知道,生活中我们用一个个的包来装东西的作用:一来,可以辨别,例如,你和弟弟有一样外观和名字的笔盒,怎么认出哪个是你的哪个是弟弟的呢?很简单,你的包里面的笔盒是你的,弟弟包里的是弟弟的——包的第一个功能:同名的类放在不同的包里就不是有冲突了(你跟你弟拿对了笔盒就不会起冲突了);二来,方便管理,吃的和穿的东西不能放在同一个包里,这样找吃的东西才不会到装了衣服的包里找,同样对程序而言,同一类的东西放一块才方便查找等等。

    理解了这些之后,你只需要有一个观点就好了:没有包的源文件里,它的类名就是public 类的类名。在有包的的源文件里,它的类名就是包名.public类的类名,即包只是给你的类一个中间带点的名,它像外国人的名字。

    用一段代码来说明怎么创建一个包。目标是创建一个包,使类名为firpack.shinte.

//E:/Lin/me/firpack/Shinte.java,Shinte.java路径。

1.    package firpack;
2.    public class Shinte{
3.        public Shinte(){
4.            System.out.println("i am shinte!");
5.         }
6.        public static void main(String args[]){
7.             new Shinte(); 
8.        }
9.    }

    代码很简单,我介绍一下创建包的整个过程,但你要清楚这个过程,最好自己动手一次,话说我是自己摸索出来的。特别注意怎么在命令行下运行。

    首先,因为要创建包,使类名firpack.Shinte所以,第一步是要在工作目录下建一个文件夹,命名为firpack。如,根据我的Shinte.java的路径,我是在me文件夹下创建新文件夹。然后在新建的这个文件夹firpack中写源代码文件Shinte.java

    然后,编译。命令如下:

    E:> cd Lin/me/firpack    //切换到firpack,因为java.exe编译要找到源文件,所以只能在Shinte.java所在目录运行java.exe

    E:/Lin/me/firpack> javac Shinte.java  //这个过程和不创建包的一样  

    E:/Lin/me/firpack> java Shinte XX    //这样是错误的   

    E:/Lin/me/firpack> cd ..    //回到me文件夹

    E:/Lin/me> java firpack.Shinte //记住一句话,classpath中的“.”表示当前目录,而且当前目录下的子目录可以作为包的名字来使用。完整的类名应该是firpack.Shinte,而不是Shinte所以有红包标志的命令是错的。

运行结果:     

    这样包的创建就成功啦,怎么导入呢?可以通过领悟上面对import的介绍来导入,就算是一个练习吧。

使用刚创建的类firpack.Shinte.

1、设置环境变量:再赋一个值,好让JVM能找到包所在位置:E:/Lin/me

2、编写代码

 1.   import firpack.Shinte;//导入

 2.   public class UseShinte{
 3.       public static void main(String args[]){
 4.           System.out.println("使用了Shinte");
 5.           new Shinte();
    6.       }
 7.   }

运行结果:        

             

3、直接编译并运行UseStinte.java就可以了。

综述

    从文件结构和功能领会环境变量的配置,其配置对程序编译和运行的影响,理解如何导入类库,实现快速开发,降低了开发的复杂度。

    总的下来,最终介绍了两个导入两种类库的方法:压缩包类库的导入(OpenSwing.jar)和没有压缩的类库的导入(Shinte.class)。至于怎么创建jar,即发布程序这里就不讲了。

初学者应从文件目录结构理解import的过程,并创建自已的代码库相关推荐

  1. asp.mvc 4项目发布文件目录结构_Spring Boot项目搭建与启动

    Spring Boot简介 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不 ...

  2. stm32串口通信(初学者对于串口通信的理解)

    stm32串口通信(初学者对于串口通信的理解) 标签: stm32串口通信单片机 2015-01-24 10:12 987人阅读 评论(0) 收藏 举报  分类: stm32 版权声明:本文为博主原创 ...

  3. JavaScript 初学者应知的 24 条最佳实践

    原文:24 JavaScript Best Practices for Beginners (注:阅读原文的时候没有注意发布日期,觉得不错就翻译了,翻译到 JSON.parse 那一节觉得有点不对路才 ...

  4. 14 操作系统第四章 文件管理 文件逻辑结构 文件目录结构

    文章目录 1 初识文件管理 1.1文件属性 1.2 文件内部的数据应该怎样组织起来? 1.3 文件之间应该怎样组织起来? 1.4 操作系统应该向上提供哪些功能? 1.5 文件应如何存放在外存? 1.6 ...

  5. Linux文件目录结构一览表

    学习 Linux,不仅限于学习各种命令,了解整个 Linux 文件系统的目录结构以及各个目录的功能同样至关重要. 使用 Linux 时,通过命令行输入 ls -l / 可以看到,在 Linux 根目录 ...

  6. LSTM结构理解与python实现

    LSTM结构理解与python实现 上篇博客中提到,简单的RNN结构求解过程中易发生梯度消失或梯度爆炸问题,从而使得较长时间的序列依赖问题无法得到解决,其中一种越来越广泛使用的解决方法就是 Long ...

  7. 抽了一包华子才写出来的linux 文件目录结构详解

    文章末尾给大家留下了大量的福利 前言 今天笔者想和大家聊聊linux操作系统的文件目录结构,废话呢笔者也不想多说直接进入正文吧,希望这一篇文章能够更好的帮助大家了解到linux操作系统的文件目录结构. ...

  8. HDFS文件目录结构详解

    Namenode中主要存储fsimage和editlog文件,Datanode中主要存储数据块blk文件.下面分别介绍Namenode和Datanode中的文件存储结构. 文章目录 1 Namenod ...

  9. 零基础的前端开发初学者应如何系统地学习?前端技能汇总 Frontend Knowledge Structure

    本文转自 张帅 于知乎<零基础的前端开发初学者应如何系统地学习?>中的回答. 知乎原文:https://www.zhihu.com/question/19834302 GitHub项目:前 ...

  10. linux 如何以树形结构显示文件目录结构

    linux 如何以树形结构显示文件目录结构 1.linux 如何显示文件信息 一般可用 ls 命令来查看文件的信息: ls [OPTION]- [FILE]- 如: ls 显示所有文件 ls -1 显 ...

最新文章

  1. 定位ARM Hard Fault 的方法
  2. C语言程序练习-L1-002 打印沙漏 (20分)
  3. C# 单例模式的多种简单实现
  4. php中qq授权登录,ThinkPHP利用QQ互联实现网站第三方登录(QQ登录)
  5. javascript 获取控件坐标
  6. 人人都是 DBA(XI)I/O 信息收集脚本汇编(转)
  7. Practical Go: Real world advice for writing maintainable Go programs
  8. Javascript 笔记(2)----闭包
  9. 未能加载文件或程序集或它的某一个依赖项。参数不正确
  10. android数码管字体,matplotlib绘图时显示额外的“figure”浮窗
  11. 4月6日——4月10日课程表
  12. 23 期-原文 6.30
  13. 阿里云服务器中安装配置MYSQL数据库完整教程
  14. 韩国研发AI武器遭抵制,武器自带“头脑”将多可怕
  15. STM32 驱动 GY-302 光照传感器 BH1750 模块(软件IIC与硬件IIC驱动)
  16. 机器学习分类算法之随机森林(集成学习算法)
  17. 我大121321321321321
  18. np.meshgrid plt.contourf
  19. 解决pdf打印预览中遇到特殊字符,导出失败问题
  20. 如何让matlab提速,[转载]matlab提速技巧(自matlab帮助文件)

热门文章

  1. 百度 linux格式c盘指令,Dos指令直接将gho文件还原到C盘的指令怎么写
  2. Matlab批量画图并写入word
  3. 微信小程序音乐播放器系统app毕业设计
  4. 初学者如何快速练习盲打
  5. 常用的ODI映射与过滤命令
  6. 动态卷积:自适应调整卷积参数,显著提升模型表达能力
  7. c语言手写平衡二叉树(一)
  8. 一文带你深入了解 SaaS(软件即服务) 的架构设计
  9. 【Unity3D游戏教程】记忆翻牌游戏
  10. 模块Datetime