专栏首页大魏分享(微信公众号:david-share)Java学习笔记第一篇:坦克大战游戏

Java学习笔记第一篇:坦克大战游戏

一、Java学习笔记系列

笔者大学时候学的编程语言是C和汇编,毕业以后并未从事过开发工作,也没有接触过Java。但近两年的PaaS、CI/CD主要是以Java应用为主,同时本着活到老学到老的态度,笔者开始学习Java。对Java比较熟悉的读者,可以忽略本系列文章。

笔者学习资料来自网络,文后会列出参考链接。由于本文是读者的学习笔记,因此不会做很多赘述性文字,会以实验为主。在语言描述上,争取一针见血把事情说清楚。文章中,Java的语法本文不做详细解释,有其他语言基础也比较好理解Java的语法。

一、Java发展史

即使对Java不熟的童鞋,我也经常听到一个词J2EE。Two是什么意思呢?指的是版本2的意思。

Java是印度尼西亚爪哇岛的英文名称,因盛产咖啡而闻名。所以Java的程序logo是一杯咖啡。。。

1995年,Java问世。

1996年,JDK 1.0发布

1999年,Java2发布。

因此,目前的J2就是代表2这个版本,虽然现在最新的JAVA版本已经到9,但2这个说法,应该是沿袭了历史习惯。

JAVA 2发布的时候,有几个产品:

  • JAVA SE: JAVA Platform, Standard Edition,主要是用于开发桌面类应用,如qq,桌面游戏等。
  • JAVA EE:JAVA Platform,Enterprise Edition,主要是用于构建企业级应用,如计费系统等。J2EE也可以开发B/S架构的应用。我们常含的J2EE就是它!
  • JAVA ME:JAVA Platform,Micro Edition,主要是用于开发移动端的应用,如手机、机顶盒等。但用的比较少。目前主流的移动端安卓,其底层其实也是JAVA开发的。

二、JDK、JRE、JVM到底是啥?

在实验过程中,为了截图方便,笔者将使用笔记本的Windows10环境。这并不代表JAVA对Linux支持不好或是笔者对Linux系统不习惯。2016年笔者是以281分通过的RHCE考试(满分300分)。

不吹牛,切入正题。

我们先了解一下JDK、JRE、JVM的关系。

JDK:Java Development KIT,Java开发工具包。这是JAVA软件的全集,包含了JRE等内容。JDK9有300多兆:

目前JDK有三个流派:Open JDK、Oracle JDK、IBM JDK。关于JDK如何选择,笔者另外一篇文章《前IT业余买手谈JDK的选择和采购》做过介绍,本文实验将使用Oracle JDK。

JRE:Java Runtime Environment, JAVA SE运行时环境。它里面包含lib和JVM等。

JVM:Java Virtual Manchine,也就是Java虚拟机。

也就说说JDK> JRE> JVM。因此,我在做实验时,会下载最全的JDK包。

JVM是干什么用的呢?

我们在讲JAVA语言的好处时,都知道它是跨平台的。但JAVA怎么实现跨平台的呢?

前些年,VMware提出了SDDC,即软件定义数据中心的概念。拿vSphere/红帽RHV来说,虚拟化技术实现了虚拟机操作系统和底层X86硬件的松耦合,虚拟机可以在不同代次的因特尔或者AMD CPU的服务器上飘逸,原因是什么?vSphere底层的VMM对CPU指令以及硬件(网卡、磁盘)进行了模拟,OS只和VMM的虚拟硬件打交道。

在windows中,我们可以直接运行.exe文件,因为.exe文件已经是计算器编码的二进制文件,但.exe只是windows的可执行文件。.exe文件中包含了CPU的指令。

那么JVM是什么呢?JVM是为了JAVA应用和操作系统类型松耦合,它模拟的是虚拟Java CPU。那么,在Java虚拟机,也就是JVM中,运行什么文件呢?

.class文件。.class文件包含了JAVA CPU的指令集。

在Java中,最原始的文件是.JAVA文件,经过Javac命令进行编译(编辑就是把写好的.java文件转化成机器码,产生.class文件),产生.class文件,然后java命令可以运行.class文件中定义的class内容。因为.class文件并不依赖于操作系统(依赖于JVM,JVM对class扮演的角色,与vSphere VMM对OS的扮演角色类似),因此Java可以跨操作系统、可移植性强。

三、编写第一个Java程序

从Oracle网站下载JDK9:

安装JDK的时候,选择JDK和JRE的安装目录,为了方便查找,笔者将目录指定到D:\java目录下。

安装完毕后,注意添加JAVA的环境变量:

接下来,我们查看JAVA目录结构,其中bin目录中的内容是JAVA的命令行:

src.zip是Java开发工具包提供的源码:

接下来,我先写一个简单的.java文件:

名字为VarDavidDemo1.java文件,实现的作用如下:

这个文件编译后执行,将会:

1.输出a,b,c的数值。

2.输出x1的数字(等于a的数字)

3.输出a+20的数值

需要注意的是,public static void main(String[] args) 是定义的是主函数,是java程序的入口地址。java虚拟机运行程序的时候首先找的就是main方法。只有有main()方法的java程序才能够被java虚拟机运行。而在一个复杂的JAVA程序中,一定会有多个JAVA文件来定义class,而其中只有一个定义了主函数的class是JVM的入口,也就是主执行程序(后面坦克大战的游戏中会涉及。)

下面代码中,VarDavidDemo1 是该程序的class名称,编译成功以后,可以通过java程序执行这个类。

class VarDavidDemo1 
{
 public static void main(String[] args) 
 {
 int a,b,c;
 a = 11;
 b = 100;
 c = 200;
        System.out.println("a="+a+" b="+b+" c="+c);
 int d = 3,e = 4, f = 5;
 System.out.println("d="+d+" e="+e+" f="+f);
 int x1 = a;
 System.out.println(x1);
 a = a + 20;
 System.out.println("a="+a);
 }
}

代码书写完毕后,通过javac进行编译:

编译成功以后,会生成该文件对应的.class文件:

但我们通过java执行class,不是执行生成的.class文件,而是执行该文件中class后面定义的类,执行结果如下:

这样,一个很简单的JAVA程序就完成了。

我们做一个稍微复杂一点的,做一个输入输出文件的程序,实现的目的如下:

1.定义了一个public类,叫DavidReadWrite(public的class要求java的文件必须要与定义的class名字一致,否则编译会报错)

2.程序向d:/david/output.txt文件中写入内容 "This is david demo"

3.程序读取d:/david/input.txt文件中的内容,并进行打印.

import java.io.*;  
public class DavidReadWrite {  
    public void writeFile() {  
        String str = "this  is a program";
        try {  
            FileOutputStream out = new FileOutputStream("d:/david/output.txt");  
            out.write(str.getBytes());  
            out.close();  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
    public void readFile() {  
        try {  
            FileInputStream in = new FileInputStream("d:/david/input.txt");
            byte bs[] = new byte[in.available()];  
            in.read(bs);  
            System.out.println("file content= " + new String(bs));  
            in.close();  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
    public static void main(String[] args) {  
        ReadWrite t = new ReadWrite();  
        t.readFile();  
        t.writeFile();  
    }  
}  

编译源码:

生成.class文件:

在执行程序之前,我们看一下程序执行的输入文件的内容:

执行程序,屏幕打印了input.txt文件中的内容。

接下来,我们看一下输出文件中的内容:

四、坦克大战游戏

网络上的牛人很多。我们看一个大牛写的坦克大战游戏,作者用MyEclipse开发的。(http://www.codesky.net/showhtml/30233.htm)

下载软件包并解压缩,查看目录结构。其中src是源码,也就是.JAVA文件等。bin目录下是可执行文件。

进入到src目录,可以看到很多.java和编译好的.class文件:

我们打开TankClient.JAVA主函数文件,该文件定义了主class:TankClient

为什么说这个类是主函数文件?因为该文件中定义了主函数main:

我们看一下这个文件中一段循环,下面定义了坦克发射子弹的规则,这段代码有调用了Bullets这个class:

而Bullets具体内容在Bullets.java文件中进行了描述:

我们如果执行一个不含有主函数的类,将会有报错:

加下来,执行TankClient这个Class:

前台跳出界面:

可以开始玩游戏了!

本文分享自微信公众号 - 大魏分享(david-share),作者:魏新宇

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-01-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 国家标准拜读-数据中心服务能力成熟度模型

    前言: 声明:本文为仅代表笔者个人观点。笔者在文中阐述国家标准,但不会对打分方法进行举例。 此前,关于IT相关的成熟度模型,国际上几套标准:COBIT5、Ga...

    魏新宇
  • 非网络专业人士看NSX--浅谈NSX架构和ARP压制

    一直以来,网络方面都不是笔者的强项,来了VMware以后,由于工作的需要,经常和客户一起交流NSX,有一些心得,自己也查了一些资料,更请教过我司的网络方面的专...

    魏新宇
  • 如何为微服务做安全加密? | 微服务系列第十一篇

    在微服务架构中实现可靠且强大的安全实现非常重要。微服务的体系结构向应用程序公开了多个入口点,并且通信可能需要多个网络跃点,因此未授权访问的风险很高。这需要比传统...

    魏新宇
  • java.sql.SQLException: The server time zone value:xx异常

    但是,我们知道,北京所以东8区。所以修改为北京时间应该是:&serverTimezone=GMT%2B8

    凯哥Java
  • 我所理解的Remoting(2):远程对象生命周期的管理[上篇]

    1.CLR的垃圾回收机制 在.NET中提到对象的生命周期,我们会不由自主地想到CLR的垃圾回收。在运行一个.NET程序过程中,我们通过某种方式,比如通过new操...

    蒋金楠
  • 为什么要在MD5加密的密码中加“盐”

    盐(Salt)在密码学中,是指通过在密码任意固定位置插入特定的字符串,让散列后的结果和使用原始密码的散列结果不相符,这种过程称之为“加盐”。

    bear_fish
  • 关于ClassLoader还可以这么做

    上次我们说到Java的双亲委托机制,导致我们不能加载到WangHouse里的Socker类。今天我们来说说怎么在不改变目录结构的情况下加载Socker。

    PhoenixZheng
  • JVM调优浅谈

    用户1263954
  • 什么是垃圾回收

    本文摘自我们几周后即将出版的Garbage Collection Handbook一书的样章。同时也让你能熟悉下垃圾回收的基础知识——这选自该书的第一章。

    哲洛不闹
  • .NET 对象生命周期

    .NET Framework 的垃圾回收器管理应用程序的内存分配和释放。每次您使用 new 运算符创建对象时,运行库都从托管堆为该对象分配内存。只要托...

    潘成涛

扫码关注云+社区

领取腾讯云代金券