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