教你玩转HelloWorld

我们知道,要运行 java 程序,必须要配置 Java 开发环境,对吧。这次我们不使用开发工具,用命令行将HelloWorld编译运行出来,将其中的原理搞清楚。

1)将下载好的 JDK 无脑安装(即下一步、下一步)或者指定安装目录,不过自己要记得安装到哪了。

2)配置环境变量

JAVA_HOME(新建)
    D:\JDK\jdk7
Path(追加)
    %JAVA_HOME%\bin
CLASSPATH
    .(注意这里配置了一个点)

3)HelloWorld的编写运行

我们新建这样的目录结构,我们知道 bin 目录是用来存放 .class文件(即字节码文件),src 目录是用来存放 .java 文件(即源码)。

编写

在 src 目录中新建 HelloWorld.java 文件。

我们知道一个 java 类应该有顶级三要素:

a. package

b.import

c.class

但有的可能没有 import ,不需要导包情况

1)需要的类当前类在同一个包下

2)需要的类位于 java.lang下

HelloWorld.java 如下

package com.briup.day;

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}

编译

打开 cmd,使用 javac 命令编译

-d 目录 将编译好的字节码文件放到指定目录

这时候 bin 目录下就会生成 .class 文件了。

运行

在 cmd 命令中使用 java 命令

这里解释这条命令的含义:

java [参数] 完整类名(包名+类名)

    -classpath 路径
    -cp 路径
    指定类加载路径(CLASSPATH)
如 java -cp ./bin com.briup.day.HelloWorld
.代表当前目录,当前处于 test 目录下。
而 .class 文件处于 /test/bin 目录下,我们知道 java 运行的是 .class 文件。
所以找到 HelloWorld.class 只需要 ./bin

如果写成这样 java com.briup.day.HelloWorld 它会默认去 CLASSPATH 路径下去找,
当前 CLASSPATH 配置为 . 即当前目录,所以默认会去当前目录找。
当然现在这样是找不到,因为HelloWorld.class 在test/bin 目录下。

打包

在 cmd 下 输入

cd bin

java -cvf ../hello.jar *

java -cvf hello.jar *

-cvf : 表示打包

hello.jar : 给打包好后的 jar 起了个名字

* : 表示将当前目录下的所有文件打包。即 test/bin/下的所有文件。

使用好压将 hello.jar 打开

部署运行

将 hello.jar 复制到 E 盘。

在 cmd 命令下运行

E:

java -cp hello.jar com.briup.day.HelloWorld

这样是不是觉得很麻烦,每次都要先定位到打包好的 jar 包的位置,这样才能运行出来。

我们将 hello.jar 放到 JDK 的安装目录中的 jre/lib/ext/中。即D:\JDK\jdk7\jre\lib\ext

这样我们就可以任何地方运行了。

例如:我们在D盘运行

这样是不是很方便呢,那么这又是为什么呢?这是因为 java 的类加载机制。我们来了解下吧。

类加载器与双亲委派模型

类加载器

(1) Bootstrap ClassLoader(启动类加载器) : 将存放于<JAVA_HOME>\jre\lib目录中的,或者被-Xbootclasspath参数所指定的路径中的,并且是虚拟机识别的(仅按照文件名识别,如 rt.jar 名字不符合的类库即使放在lib目录中也不会被加载)类库加载到虚拟机内存中。启动类加载器无法被Java程序直接引用

     (2) Extension ClassLoader(扩展类加载器) : 将<JAVA_HOME>\jre\lib\ext目录下的,或者被java.ext.dirs系统变量所指定的路径中的所有类库加载。开发者可以直接使用扩展类加载器。

     (3) Application ClassLoader(系统类加载器) : 负责加载用户类路径(ClassPath)上所指定的类库,开发者可直接使用。

JVM的类加载是通过ClassLoader及其子类来完成的,类的层次关系和加载顺序可以由下图来描述:

双亲委派模型

工作过程:如果一个类加载器接收到了类加载的请求,它首先把这个请求委托给他的父类加载器去完成,每个层次的类加载器都是如此,因此所有的加载请求都应该传送到顶层的启动类加载器中,只有当父加载器反馈自己无法完成这个加载请求(它在搜索范围中没有找到所需的类)时,子加载器才会尝试自己去加载。

好处:java类随着它的类加载器一起具备了一种带有优先级的层次关系。例如类java.lang.Object,它存放在rt.jar中,无论哪个类加载器要加载这个类,最终都会委派给启动类加载器进行加载,因此Object类在程序的各种类加载器环境中都是同一个类。相反,如果用户自己写了一个名为java.lang.Object的类,并放在程序的Classpath中,那系统中将会出现多个不同的Object类,java类型体系中最基础的行为也无法保证,应用程序也会变得一片混乱。

现在应该知道怎么回事了吧。

时间: 2024-10-12 17:13:21

教你玩转HelloWorld的相关文章

教你玩App怎么赚钱(一)

在看这篇文章之前,你一定要接受一下谋哥的观点:金钱就是价值流通的手段,不要高看了钱. 玩App怎么赚钱?貌似谋哥写的文章超级多,把这个最重要的忘记了.说实在的,我为啥要写“玩App"呢?其实就是一种比较轻松的心态.就好像现在我写文章,简直就是神速,那思路就如北大某牛人说的:“诗文如尿崩.”轻松地玩,自己才觉得好玩,爽快,不累. 玩App怎么赚钱这个系列的文章,我打算分三篇来探讨下,具体就是:App前赚钱.App里赚钱.App之外赚钱.当然了,这三个分法,业界貌似没有定论,统统是谋哥我为了自己总结

IOS 教你玩转UITableViewController和TableView

iphone和Ipad开发中UITableViewController和TableView应该是用得比较多得控件.但是你是会因为写这些控件写得多了而厌烦. 所有怎么让这个控件一直能用,怎么让这个控件写起来简单.是很必须.特别是UITableViewController把dataSouce的业务逻辑集成在自己身上而让看起来扎乱无章. 1.解决UITableViewController一直能用下. 那就是自己写个基类的UITableViewController,然后其他的来继承.这样可以把相似的功能

手把手教你玩转SOCKET模型之重叠I/O篇(上)

“身为一个初学者,时常能体味到初学者入门的艰辛,所以总是想抽空作点什么来尽我所能的帮助那些需要帮助的人.我也希望大家能把自己的所学和他人一起分享,不要去鄙视别人索取时的贪婪,因为最应该被鄙视的是不肯付出时的吝啬.” ----- 题记  By PiggyXP(小猪) 前   言   其实我首先应该道歉,因为7月份的时候曾信誓旦旦的说要写一套关于SOCKET所有模型的入门文章以及配套代码,不过没想到后天竟然被美女所迷出去度假了,刚刚回来不久......-_-b其实那些模型的配套代码我已经基本写完了,

手把手教你玩转SOCKET模型之重叠I/O篇(下)

四.     实现重叠模型的步骤 作 了这么多的准备工作,费了这么多的笔墨,我们终于可以开始着手编码了.其实慢慢的你就会明白,要想透析重叠结构的内部原理也许是要费点功夫,但是只是学会 如何来使用它,却是真的不难,唯一需要理清思路的地方就是和大量的客户端交互的情况下,我们得到事件通知以后,如何得知是哪一个重叠操作完成了,继而知道 究竟该对哪一个套接字进行处理,应该去哪个缓冲区中的取得数据,everything will be OK^_^. 下面我们配合代码,来一步步的讲解如何亲手完成一个重叠模型.

手把手教你玩转CSS3 3D技术

手把手教你玩转 CSS3 3D 技术 要玩转css3的3d,就必须了解几个词汇,便是透视(perspective).旋转(rotate)和移动(translate).透视即是以现实的视角来看屏幕上的2D事物,从而展现3D的效果.旋转则不再是2D平面上的旋转,而是三维坐标系的旋转,就包括X轴,Y轴,Z轴旋转.平移同理. 当然用理论来说明,估计你还不明白.下面是3个gif: 沿着X轴旋转 沿着Y轴旋转 沿着Z轴旋转 旋转应该没问题了,那理解平移起来就比较容易了,就是在在X轴.Y轴.z轴移动. 你可能

不止是联网!教你玩转PC自带Wi-Fi网卡

前言:Wi-Fi对于现在的智能手机来说已经是再熟悉不过的配置了,而主板自带Wi-Fi网卡的设计也越来越普及,但有些玩家可能思维还停留在“Wi-Fi网卡 = 连无线网络用的网卡,我用有线就不需要”的层次,因此我们今天就来跟大家谈谈,PC自带Wi-Fi网卡到底能够实现什么样的功能. 不止是联网!教你玩转PC自带Wi-Fi网卡 ●很多主板都自带了Wi-Fi无线网卡 七彩虹 战斧 C.A88AK旗舰版配备板载Wi-Fi网卡 Wi-Fi无线网卡以往一般常见于ITX尺寸的迷你主板上面,主要为了提升主板在客厅

腾讯工程师教你玩转 RocksDB

欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 作者:腾讯云数据库内核团队 原文标题:[腾讯云CDB]教你玩转MyRocks/RocksDB-STATISTICS与后台线程篇 0. Intro 在facebook的MySQL版本(以下称为MyRocks)中,RocksDB是可选的存储引擎.相比于InnoDB引擎,RocksDB的一个重要的优势是它使用更少的磁盘空间.在生产系统中,特别是用户数在亿级以上的互联网应用,磁盘空间是其中比较大的成本之一,而能够使用更少的磁盘空间的RocksDB无

完毕port(CompletionPort)具体解释 - 手把手教你玩转网络编程系列之三

手把手叫你玩转网络编程系列之三    完毕port(Completion Port)具体解释                                                              ----- By PiggyXP(小猪) 前 言 本系列里完毕port的代码在两年前就已经写好了,可是因为许久没有写东西了,不知该怎样提笔,所以这篇文档总是在酝酿之中--酝酿了两年之后,最终决定開始动笔了,但愿还不算晚-.. 这篇文档我很具体而且图文并茂的介绍了关于网络编程模型中完毕

干货---教你玩转php环境日常更新---1---页面展示

左思又想,博主觉得初玩博客还是得分享点干货镇博! so~博主感觉也没什么能拿得出手的,便想到了自己写的更新程序,可能会对各位搞linux运维的同事有些启迪的作用. 再者因为涉及的东西比较多,我会不定时的发表博文来描述整个过程,从更新到代码的实现,用到的东西,等等等等.. 废话不多说了直接上图: 其实博主现在也是linux运维,主要运维的项目也是php这一块的,环境用的是阿里云,说实话 对于现在的公司的环境  所谓的监控 报警 都可以直接使用阿里云的服务  但唯一头疼的 也许就是更新了, 自从开发