
首先,单纯的学习一门语言是灰常无聊的,
所以为了陶冶节操,
我们将通过一个 坦克大战 的项目来了解简单的 Java 开发。
既然是坦克大战,
第一步必须是先把“坦克”建好,
在接下来的文章里再介绍“大战”的内容。
初步规划,
坦克大战1.0为单人单机版本。
坦克大战2.0为双人单机版本。
坦克大战3.0为多人联网版本。
坦克大战4.0为3D效果的版本。
那么,下面就开始万里长征第一步:
如何建好一个坦克。
在建造坦克之前,
我们先要建好安置坦克的地方。
那么在项目中就体现为一块长方体的空旷场地。
当一个新的工程建成后,
我们把它命名为TankWar0.1,
里面应该有一个简单的java文件。
既然是坦克大战,那么我们就把它命名为TankClient
那么翻译成中文就是 坦克客户端。
听起来很高端有没有?
其实随便叫什么啦,名字只是一个代号。
在java里面,对文件的命名没有太多的规范,
但是有几点约定俗成的好习惯在这里介绍给大家。
1.尽量使用英语。
这个基本是很多老师都有讲过的,
当时我也非常不解为什么要用英语,
用中文多好啊,
还能顺便宣扬我们优秀的传统文化,
让全世界都学中国话。
但是后来我渐渐发现了问题所在。
举个栗子。(不准吃 – -)
坦克 坦克一只 = new 坦克();
坦克一只.setHeight(12);
坦克一只.setWidth(13);
坦克一只.发射();
感觉有一种嚼着大蒜和咖啡的感觉。
然后我又想,那用汉语拼音不就可以了吗。
那么再举一个栗子。
Tank tank = new Tank();
tank.name = “Zheng Er”;
对呀,这样不是很好吗?
好个毛线。
那么这个坦克的名字是叫郑二还是叫正二呢?
这就是个问题了。
所以综上所述,
还是建议大家都采用英语单词命名的模式。
1.骆驼式命名法
骆驼 式命名法的命名规则可视为一种惯例,
并无绝对与强制,
为的是增加识别和可读性。
——BaiduBaike
一般来说,类的名称采用首字母大写的命名规范。
举一袋栗子。
ZhengEr
ZhengZhiChun
ZhengBuChun
而具体事例和方法的名称采用驼峰规则。
神马是驼峰?
没骑过骆驼,
总归是见过骆驼跑的吧。
驼峰就是这个样子的。
———–+———————+——————–+———————–
———+–+——————+-+—————–+–+——————–
——-+——+————–+—–+————-+——+—————–
—–+———-+———-+———+———+———-+—————
—+————–+——+————-+—–+————–+————–
-+——————+–+—————–+-+——————+————
+———————+——————–+———————+————
虽然作为一只骆驼要长出这么标准的峰部是非常困难的。
但是这张图生动形象的告诉了我们什么是驼峰规则。
再举一袋栗子。
zhengEr
zhengZhiChun
zhengBuChun
这就是区别啦。
把这两者结合到实例里,
我们再次以郑二为例。
ZhengEr zhengEr = new ZhengEr();
zhengEr. characteristic = “He is a bt”;//假定characteristic 是郑二变量的属性之一
System.out.println(zhengEr.characteristic);
这样便非常的清晰啦。
那么下面进入到坦克大战的开发案例。(闲话扯得有点远 – – )
上回我们说到,这个项目叫做TankClient。
建好后,java文件内部应该是这个样子。
public class TankClient {
}
这光秃秃的一片,
叫我们的坦克如何落脚呢?
阿不,坦克没有脚。
这光秃秃的一片,
叫我们的坦克如何落轮呢?
我们需要一片巨大的坦克决斗场!
首先,先写好一个main方法,
public class TankClient {
public static void main(String[] args) {
}
}
这就相当于是奥运会的开幕式入口,
程序的所有运行过程,
都将从这个入口进入。
但是会不会被稀里糊涂的带出会场,
就不得而知了。
一般来说,
如果main方法里面的所有语句逻辑都执行完了,
java程序会自动退出。
但是如果想人为的退出程序,
可以使用以下代码。
System.exit(0);
那么这么零蛋是个什么意思呢?
如果
System.exit(+2);
那又会怎么样呢?
这个问题,其实我也不大清楚。
感兴趣的同学可以按住ctrl键在eclipse中点击该方法,
便会自动跳转到该方法的定义中,
仔细研究便可以知道具体status的含义。
在此我就介绍一下
System.exit(0);
与
System.exit(1);
与
return ;
与
dispose();
的区别。
System.exit(0)会把整个java虚拟机里的所有内容都停止。
简单来讲,连JVM都已经关闭了。所以也就是释放了所有的内存。
效果类似于,格式化。
而System.exit(1)或者说非0(比如说+2)表示非正常退出程序
而 return只是返回到上一层而已。
exit与之相比便是返回到了最高层。
而dispose()会把当前的窗口关闭,
是让当前component不再显示,
但是没有停止整个项目的进度。
效果类似于,删除。想拿出来的时候回收站里捡回来就行了。
一不小心又扯远了。
到现在连个场地还没建好。
那么下面开始建造场地啦~
坦克决斗场,走起!
要想要有一篇方形的决斗场,
自然而然的便要使用到java的Frame类。
当然,也可以使 JFrame 类。
至于两者有什么区别嘛。
简单来说,
Frame在awt里面,
JFrame在swing里面,
他们内容上的区别并不大,
Jframe好看罢了 – – 、
但是从深层次来说,
JFrame对Frame做了较大改进,
这就涉及到awt和swing纠缠不清的感情瓜葛了。
那么我们本着淳朴归真回归自然的态度,
采取Frame进行坦克大战开发。
public class TankClient extends Frame {
public static void main(String[] args) {
}
}
这样写,
java稳稳的会报错,
因为它不知道
Frame是个毛毛线。
所以还需要在头部引包。
import java.awt.*;
public class TankClient extends Frame {
public static void main(String[] args) {
}
}
这个引包的概念,就是引包的意思。
引进一个大包。
你可以把包里的东西取出来,然后再放进程序里,
比如:
import java.awt.frame;
也可以直接把一个包塞进去,
比如:
import java.awt.*;
理论上事推荐第一种方案,
条理清晰倒是其次,
主要是可以延长代码量,
鼠标滚了半天,
满眼整齐划一的import语句,
像是军训似的,
岂不是很炫!
但是考虑到汪海有点懒,
所以还是采用第二种方案。
万事俱备,下面可以开始码代码啦。
我们既然把TankClient作为了坦克大战的场地,
那么首先要新建一个TankClient来放置坦克。
import java.awt.*;
public class TankClient extends Frame {
public static void main(String[] args) {
TankClient tc = new TankClient();
this.setLocation(400, 300);//场地想要放在屏幕的什么位置,通过这个语句实现
this.setSize(800, 600);//编者译:setSize设置尺寸。
setVisible(true);//前面的只是规划蓝图,这句话才是揭幕的神圣时刻。
}
}
此时可以将项目存档,
命名为TankWar0.1即可。
一个好的编程习惯会让后期维护事半功倍。
简单的四行代码,
运行后便可以得到一篇长方形的空旷场地。
但是很快我们便会发现如此空旷的窗口无法实现关闭功能。
于是乎,我们需要在这里给程序添加一个监听:
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
通俗的翻译,
就是当你点击了关闭按钮的时候,程序知道你想让它做什么。
正如前面所说,main方法是个入口,
但是想像以下场景,
如果你有2件衣服,
1条裤子,
你会如何收拾?
显然是直接放在一起。
但是如果你是20件衣服10条裤子再加30来双袜子全家桶,
如果还是放在一起的话,
很难避免某天晕乎乎的抓着袜子就往身上穿的情形出现。
所以,封装便显得尤为重要。
衣服一个包,
裤子一个包,
袜子一个包,
某些强迫症还可以在上面贴上标签,
虽然看上去麻烦,
但是为以后的维护工作做了很好的铺垫。
所以我们的坦克大战也要这个样子。
import java.awt.*;
import java.awt.event.*;
public class TankClient extends Frame {
public void lauchFrame() {
this.setLocation(400, 300);
this.setSize(800, 600);
this.setTitle(“TankWar”);
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
this.setResizable(false);
setVisible(true);
}
public static void main(String[] args) {
TankClient tc = new TankClient();
tc.lauchFrame();
}
}
封装好了后,
条理清晰的main方法让人一目了然。
“哦,新建了个坦克基地,”
“哦,坦克基地搭好了框架。”
只要看main方法的几个方法名便可以知道具体的程序进展。
此刻便体现了上文讲到的命名规范是多么的重要。
而如果debug过程中出现了问题,
直接按住ctrl点击方法名便可以立即跳转,
实乃是方便之际,
居家旅行,杀人越货,必备良药。
将项目复制一份,
并且改名为TankWar0.2,
效果图如下:


那么,
这便是坦克大战的第一个步骤,