Java不走弯路教程(2.Hello,Java!)

2.Hello,Java!
欢迎来到Java的世界,在上一章,我们已经完成了DOS的基本操作学习和Java的环境搭建,在本章中我们Java来完成一个简单的DOS程序。

2.1 Hello,Java!
首先,我们创建一个文件名为MyNotepad.java,保存到c:\work\001下,
文件内内容如下:(注意文件名与文件内容的大小写,以后不再提示)

然后启动DOS环境,输入如下命令:
cd c:\work\001
javac MyNotepad.java
java MyNotepad

可以看到输出:Hello,Java!
再次执行java MyNotepad,则无需再次编译。

OK,我们完成了简单的DOS程序,请认真地理解这个过程,因为本教程接下来的内容,将是对这个过程的不断扩展,直至完成Java的学习。

2.2 查看文件内容
现在有一个简单的需求:
输入如下命令来查看文件a.txt的内容:
java MyNotepad a.txt

我们来简单的介绍一下刚才写的MyNotepad.java

在上述程序中,分号代表以行的结束,大括号代表一个区块的结束。
MyNotepad为类名,main为类入口,String[] args用来接收程序的参数,因为程序会有多个参数名比如
java MyNotepad a.txt b.txt c.txt
所以变量args的类型定义为一个可以接收多个字符串(String)的数组用来接收多个参数,如下图所示:

我们用[]表示该参数为数组。
可以用如下的方法来取得数组中每一个元素的值:
args[0],args[1],args[2]...

注:Java中第一个元素下标为0

我们试着来先来接收输入的参数,并输出到DOS界面:

注:加号用来连接两个字符串

编译后运行:java MyNotepad a.txt
输出Hello,a.txt

/////////////////////////////////////
休息一下,我们来看看这个过程是如何完成的:
1.建立文件MyNotepad.java,并写入程序。
2.输入命令javac MyNotepad.java来把程序编译成class文件(MyNotepad.class)
我们称MyNotepad.java为源文件,MyNotepad.class为目标文件(执行文件)
编译过程如下图所示

这时大家可以把MyNotepad.java删除,因为程序执行是通过解析目标文件(.class文件)来完成的。
我们用记事本打开.class文件看看其中内容,看不懂。。。,对,因为这是机器读的。相对于人来说,
机器读class文件比读java文件更容易。
所以我们需要一个编译过程来把java文件翻译成class文件,同样把class文件翻译成java文件的过程们称为反编译,本教程不讨论反编译的内容。

3.我们运行Java程序,传入参数 MyNotepad a.txt
这个过程中Java程序首先根据传入的参数MyNotepad去环境变量CLASSPATH中查找名为MyNotepad的类定义,即class MyNotepad的定义,
因为我们设置了当前目录.在环境变量CLASSPATH中,所以Java程序在当前目录下找到了MyNotepad的类定义,然后调用该类的固定入口main方法,
并将后续参数a.txt传入给main的args变量。
注:在新版本的JDK中,无需设置环境变量CLASSPATH,编译器会自动查找相关的库文件,以后不再说明。

4.main中将args的第一个传入参数args[0](a.txt)和之前的字符串Hello 拼接到一起,生成新的字符串Hello a.txt,然后作为参数
传递给Syste.out.println方法,该方法将传递的参数"Hello a.txt"输出到DOS界面。

总结:
到目前为止我们接触了如下概念:
类,函数/方法,参数
注:函数和方法是同一概念
可以用下图表示:
public class 类名{
-函数1
-函数2
-函数3
...
-主函数main
}

其中函数定义如下
public static 返回值 函数名(参数类型 参数名){}

其中{}表示一个区块的开始和结束,比如类定义,函数定义。
在如下命令来运行Java程序时,系统会默认调用名称为main的函数并将后续参数传递给main函数。(我们称main为主函数/主方法)
java 类名

函数的返回值我们将在后面介绍.

//////////////////////////////////////////////

接下来我们继续扩展这个程序

对于System.out.println,我们将在后续章节中说明,因为本阶段我们理解不了这句话的具体含义,所以我们将他暂时隐藏起来。
隐藏我们不想看到的内容,首先想到的就是把他变成方法调用,于是我们的程序变成这样:

对于调用某个类的静态(static)函数,一般直接用 类名.函数名() 格式, 如果当前类则可以省略类名,如上面的程序。
我们改称正式的格式如下:
注:静态函数即函数定义中加入static关键字,我们将在后续章节中说明。

还是觉得不够清晰,我想把这个方法放到别的类中。
新建一个文件MyUtil.java如下:

修改MyNotepad.java如下:

分别编译MyUtil和MyNotepad,并测试运行。
注:只编译MyNotepad也可以,因为会自动编译关联的MyUtil。

OK,程序基本上清晰了,可生成的文件还是在同一目录下,我想把这种工具类或者称为帮助函数放到单独的文件夹中,作为类库来使用。
我们继续扩展:
当前目录为c:\work\001
我们在当前目录下创建新目录util和main
然后将MyUtil.java放入util目录中,MyNotepad.java放入main目录中

我们称目录c:\work\001为工程根目录,程序的运行也要在工程的根目录下,因为CLASSPATH中设置了从当前路径(.)开始查找类文件。
在编译和执行的时候我们要将目录名加入到类名前,如下所示:
javac main\MyNotepad.java
java main.MyNotepad

先不要运行,还没说完。

大家看到javac后面跟的是文件的路径,所以用windows的目录格式来定位文件。
java后面跟的是类名,因为Java程序会自动地加载.class类文件。
类名前的目录名我们称为包(package)名,这样防止了不同目录下相同文件无法定位的问题。

所以正式的类名为 包名.类名

所以我们要程序中声明自己所在的包(目录),修改MyNotepad.java如下:

注:同时对MyUtil的调用也要用全名

修改MyUtil如下:

编译,运行:
javac main\MyNotepad.java
java main.MyNotepad a.txt
输出:Hello a.txt

观察MyNotepad.java中对util.MyUtil的调用,如果有许多个对util.MyUtil的调用,我们则要每次都写全名util.MyUtil。
考虑程序的简洁性,我想只写MyUtil,那么需要在文件的头部加入声明:
import util.*

意思为导入util包(目录)下的的所有类文件

于是程序变成这样:

OK,现在我们完全不用关心System.out.println这种输出的实现,只需要做函数/方法调用即可。

继续扩展我们的程序:
对于如下语句
MyUtil.println("Hello "+args[0]);
我们可以修改成:
String message = "Hello "+args[0];
MyUtil.println(message);

在上面的语句中我们完成了变量的声明与赋值,即声明变量message为String类型,并且将"Hello "+args[0]的结果赋给message。

变量声明的格式如下:
变量类型 变量名;

变量赋值的格式如下:
变量名 = 值;

其中变量的声明和赋值可以写在一起即:
变量类型 变量名 = 值;

Java中有三大类型,基本类型,自定义类型,String
注:由于String比较特殊和常用,所以我们暂时把他单独提出为一个类型。
基本类型包括:char,boolean,byte,short,int,long,float,double
其中我们暂时只需要关注:char,boolean,int(全部小写)
自定义类型即为class声明的类名,默认以大写字母开头,其中包括众多系统类,在此不一一列举。

所以我们暂时关注的类型为:String,char,boolean,int,自定义类(包括众多系统类)
我们的程序变成了这个样子:

我在MyUtil中加入了读文件的方法,定义如下:
public static String getFileContent(String fileName)
他可以根据传入的文件名,读取当前目录下的文件并返回文件内容。
我们不用关心具体实现,只需要调用即可。MyUtil代码如下:

 1 package util;
 2
 3 import java.io.*;
 4
 5 public class MyUtil {
 6
 7     public static void println(String message){
 8         System.out.println(message);
 9     }
10
11     public static String getFileContent(String fileName) {
12         StringBuffer content = new StringBuffer();
13         InputStream fis = null;
14         InputStreamReader isr = null;
15         BufferedReader br = null;
16         try {
17             fis = MyUtil.class.getResourceAsStream("/"+fileName);
18             if (fis == null) {
19                 System.out.println("File not found:[" + fileName + "]");
20                 return content.toString();
21             }
22             isr = new InputStreamReader(fis, "UTF-8");
23             br = new BufferedReader(isr);
24             String line = null;
25             while ((line = br.readLine()) != null) {
26                 content.append(line);
27                 content.append("\r\n");
28             }
29         } catch (Exception e) {
30             e.printStackTrace();
31             return "";
32         } finally {
33             try {
34                 if (br != null) {
35                     br.close();
36                 }
37                 if (isr != null) {
38                     isr.close();
39                 }
40                 if (fis != null) {
41                     fis.close();
42                 }
43             } catch (Exception e) {
44                 e.printStackTrace();
45             }
46         }
47         return content.toString();
48     }
49 }

MyUtil.java

于是我们完成本章的目标,修改程序如下:

将a.txt放入c:\work\001下,编译运行程序如下:
javac main\MyNotepad.java
java main.MyNotepad a.txt
输出:abc

很简单?是的,因为类似于读文件,输出内容等操作都被封装到工具类中,所以到这里,你只需要掌握环境搭建,运行,变量的声明,赋值和函数的调用。
大家暂时不要关心我封装到MyUtil里的是什么东西,怎么写的,写的对不对,好不好。
你只需要知道如何调用,传入什么参数,返回什么结果,就可以了。
因为程序制造是一个庞大的工程,需要团队协同工作,一个程序员不可能理解所有的东西,所以你更需要关心的是自己的程序的正确性,输入输出,如何调用别人提供的接口,而不是关心全部。
保证全部理解自己范围内的程序,并且保证写出程序的优雅和简洁性是很重要的。

注:本教程只串讲Java学习主线内容和学习方法,如果大家对本教程涉及的知识感到吃力,请在阅读过程中自行补充相关的知识点。

版权声明:本教程版权归java123.vip所有,禁止任何形式的转载与引用。

原文地址:https://www.cnblogs.com/java123vip/p/8973744.html

时间: 2024-10-12 17:33:58

Java不走弯路教程(2.Hello,Java!)的相关文章

Java不走弯路教程(1.环境搭建)

1.环境搭建在开始写第一个Java程序之前,我们需要做一些简单的准备工作. 1.1 还记得DOS吗 我们可以通过图形界面来操作我们的电脑.但作为程序员,你首先需要学会用命令行的方式来操作电脑,因为不是所有的电脑都提供图形界面的. Windows环境下可以通过DOS来执行命令. 你只需要记住大概5个命令,即可完成电脑的基本操作. 我们首先启动DOS环境:在文件浏览器的地址栏中输入cmd,回车,如下图所示. 光标左边显示的是当前所在目录. 本教程实例均在C盘下操作,所以如果不是C盘,输入c:回车,切

Java不走弯路教程(1.前言)

本教程基于Windows开发,所以你需要有一台安装Windows操作系统的电脑. 1.前言本教程将带你完成Java的初学和WEB框架的开发,学完本教程,你将完成对Java的入门并且对下一步不再迷茫.学习本教程的前提:希望你简单的掌握程序语言,数据库,计算机网络知识.当然这不是必要条件,我将尽可能让你可以零基础完成本教程的学习.借用一句古言:[授人以鱼不如授人以渔],计算机的世界中每隔一段时间就会产生出新的程序语言,新的开发框架,新概念并且淘汰一些旧的程序语言,开发框架,概念等.所以掌握一个学习能

Java学习不走弯路教程(1.DOS环境搭建)

DOS环境搭建在开始写第一个Java程序之前,我们需要做一些简单的准备工作. 1.1 还记得DOS吗我们可以通过图形界面来操作我们的电脑.但作为程序员,你首先需要学会用命令行的方式来操作电脑,因为不是所有的电脑都提供图形界面的.Windows环境下可以通过DOS来执行命令.你只需要记住大概5个命令,即可完成电脑的基本操作. 我们首先启动DOS环境:在文件浏览器的地址栏中输入cmd,回车,如下图所示. 光标左边显示的是当前所在目录.本教程实例均在C盘下操作,所以如果不是C盘,输入c:回车,切换到C

java学习教程之代码块

学编程吧java学习教程之代码块发布了,欢迎通过xuebiancheng8.com来访问 java中的代码块包括下面几种: 1.普通代码块 2.构造代码块 3.静态代码块 1.普通代码块很简单看下面这个例子: public class Test{ public static void main(String args[]){ { //此处就是普通代码块,普通代码块中的代码按顺序执行 System.out.println("hello"); } } } 2.构造代码块 public cl

Java正则表达式教程及示例

本文由 ImportNew - ImportNew读者 翻译自 journaldev.欢迎加入翻译小组.转载请见文末要求. [感谢 @CuGBabyBeaR  的热心翻译.如果其他朋友也有不错的原创或译文,可以尝试投递到 ImportNew.] 当我开始我的Java职业生涯的时候,对于我来说正则表达式简直是个是梦魇.本教程旨在帮助你驾驭Java正则表达式,同时也帮助我复习正则表达式. 什么是正则表达式? 正则表达式定义了字符串的模式.正则表达式可以用来搜索.编辑或处理文本.正则表达式并不仅限于某

Java快速教程

Java快速教程 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Java是面向对象语言.这门语言其实相当年轻,于1995年才出现,由Sun公司出品.James Gosling领导了Java的项目小组.该项目的最初只想为家电设计一门容易移植的语言.然而,在获得了Netscape浏览器支持后,Java快速推广,应用广泛. Java受到C和C++的强烈影响.Java与C++相近,都是静态类型,但移除了C++中容易出错的一些特征,比

《Java基础教程完整版》电子版书正式发布,欢迎大家免费下载

截止目前,Java系列教程已更新完毕.内容覆盖了:JavaSE基本知识点.UML建模.单元测试等.希望对想学习Java语言的朋友能够提供帮助.在编写的过程中,难免会出现一些错误,希望大家能多多提些意见. 由于本书都是从笔者CSDN博客中摘抄过来的,基本没有经过什么正规的校验,所以难免会出现一些不对的地方.欢迎各位大牛对本书提出批评. 作者博客:http://blog.csdn.net/lhy_ycu 作者邮箱:[email protected] 笔者声明:该电子书由ITeye提供电子书DIY功能

Java快速教程--vamei 学习笔记(基础篇)

链接:http://www.cnblogs.com/vamei/archive/2013/03/31/2991531.html java快速教程第1课 从HelloWorld到面向对象 学习网址:http://www.cnblogs.com/vamei/archive/2013/03/14/2958654.html java快速教程第2课 方法与数据成员 学习网址:http://www.cnblogs.com/vamei/archive/2013/03/25/2964430.html java快

Java基础教程 - 组合

1. 什么是组合? 如果一个类的对象和另一个类满足"has-a"关系的话,我们就可以在一个类中,把另一个类的对象作为其对象成员. 什么是"has-a"关系,举个例子:现在有一个类LapTop.class,还有一个是Moniter.class.好显然,Laptop "has-a" Moniter,也就是说,他们是满足"has-a"关系的.这时候,我们就可以把Moniter作为Laptop的一个数据成员. class Laptop