u01-基础入门

194 阅读9分钟

1. 概念入门

概念: Java是印度尼西亚爪洼岛的英文名称,这个岛因为盛产咖啡而闻名于世。

  • 概念总结:
    • 名字由来:Green - OAK(橡树) - Java(爪洼岛)
    • 诞生年份:1995年
    • 所在公司:Sun -> Oracle
  • 历史发展:
    • 90年:Sun公司为了一个叫Green的项目,基于C++,开发了一种新型语言,叫Oak,但被SGI打败,从此一蹶不振。
    • 95年:Oak改名为Java,涉及web领域,并正式发布Java和HotJava浏览器,同年,很多公司获得了Java许可证。
    • 96年:Sun公司成立JavaSoft部门,以开发、销售Java技术产品,并推出第一款开发工具包—JDK1.0。
    • 98年:java的下载量超过二百万。
    • 04年:Java历史上的又一里程碑,为了表示该版本的重要性,将J2SE1.5更名为JavaSE5.0。
    • 05年:Java各版本均被更名,如J2ME改为JavaME。
    • 09年:Oracle公司收购Sun,并获得Java版权。
    • 10年:Oracle发布java7.0正式版。
  • 语言特色:
    • 简单高效潜力无限:简单高效,Java是基于C++起来的,但是去除了很多C++的难点。
    • 平易近人粉丝泛滥:面向对象(更接近人类的思维),强大类库(各种拓展包)。
    • 身体健壮安全可靠:不容易使系统崩溃,不容易中毒(不支持指针)。
    • 走哪都是掌声一片:跨平台,平台可移植性,平台无关性。
  • 跨平台特性:
    • 源码与机器码:我们能看懂源代码,但是机器看不懂,机器只能看懂二进制的机器码。
    • 编译过程:编译的过程就是将我们能看懂的代码,翻译成机器能看懂的代码。
    • C语言不能跨平台:C语言的源代码,经过不同的系统平台的编译之后,产生的机器码是不同的,无法跨平台。
    • java语言可以跨平台:java语言拥有自己的虚拟系统平台,叫做JVM,java源代码其实是在JVM上进行的编译,编译的结果也并不是机器码,而是一种叫做字节码的中间码。
    • 字节码:字节码跟底层操作系统无关,可以跨平台,字节码在运行的时候,会根据不同的底层操作系统,转换为对应的机器码,然后再执行。

C语言运行图

image.png

java语言运行图

image.png

2. 环境搭建

概念: 本教程推荐使用JDK8版本JDK

  • Java Development Kits:java开发工具箱,包括了JRE和一些EXE可执行程序。
  • Java Runtime Environment:java运行时环境,包括了JVM和一些类库。

JDK安装的默认路径中有空格,建议换一个合适的路径,路径中不要有中文和特殊符号,然后一直下一步到完成即可。

2.1 命令行检查

概念: JDK中常用的两个可执行程序:

  • javac.exe:负责java程序的编译。
  • java.exe:负责java程序的运行。

流程: win + r - cmd:开启命令行窗口:

  • cmd: java -version:查看jdk版本。
  • cmd: java -help:可以查看更多java命令。

cmd常用命令如盘符切换,路径切换,展示当前目录结构,清屏等,需要自行百度并掌握。

2.2 配置path变量

概念:

  • CMD在执行命令的时候,会自动去path中配置的所有路径下寻找,所以配置path意义就是让CMD快速找到java的可执行程序。
  • 计算机右键 > 属性 > 高级系统设置 > 高级 > 环境变量 > 用户变量下新建Path > 填入你的命令的所在目录(bin文件夹的绝对路径)。
  • path变量是你系统中本身就存在的变量,我们的操作是将变量值添加到原值串的最前面,并且用英文分号隔开,千万不要将path的原值删除。
  • 配置完任何操作,都需要重启CMD使其生效。
  • JDK在安装过程中会自动生成一个Path值,该值下面也有个 java.exe,如果你不配置path,默认执行的 java 使用的是这个可执行程序:
    • C:\Program Files (x86)\Common Files\Oracle\Java\javapath
  • 在cmd命令行中使用javac命令进行测试。

2.3 配置JAVA_HOME

概念: JAVA_HOME 的作用有两点:

  • 归一原则。
  • 其他软件可能会用到 JAVA_HOME

流程:

  • 计算机右键 - 属性 - 高级系统设置。
  • 高级 - 环境变量 - 用户变量下新建 JAVA_HOME - 填入你的JDK的根目录。
  • 重新找到Path变量,并将之前的值修改为 %JAVA_HOME%\bin;

3. Java的运行三部曲

概念:

  • 编写: 我们写代码文件,叫做源文件,后缀是 .java
  • 编译: 就是把我们能看懂的 .java 文件编译成JVM能看懂的 .class 文件。
  • 运行: 在JVM上运行 .class 文件中的代码。

运行三部曲流程图

3.1 HelloWorld小程序

流程:

  • 在桌面新建 .txt 文件,键入如下方 HelloWorld.java 码段:
  • .txt 文件的后缀改为 .java
  • 启动cmd命令行,键入 cd desktop 切换到桌面,注意不要使用管理员方式进入 cmd
  • 使用 javac HelloWorld.java 命令,对java文件进行编译。
  • 使用 java HelloWorld 命令,来运行程序。
  • 所以如果你使用 java HelloWorld.class 的方式来运行程序,JVM会默认去HelloWorld包下寻找class这个类,当然会报错。

源码: desktop/HelloWorld.java

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

3.2 java命令为何不能加后缀?

概念: JVM有一个特殊的规定,它规定java运行命令后面的格式是:包名.类名

流程:

  1. 将HelloWorld.java文件放入一个文件夹ok中(java中包,相当于系统中的文件夹)。
  2. 在代码第一行添加 package ok; 声明这个包的存在。
  3. 进入cmd命令行,重新编译:javac ok/HelloWorld.java
  4. 重新运行:java ok.HelloWorld ,得出正确的结果,说明java运行命令后的格式,确实是 包名.类名

4. 类与方法

概念:

  • 类的三要素是class关键字、类名和类体。
    • public是修饰符,一个.java文件中,只能有一个被public修饰的类。
    • class是关键字,一个.java文件中,是可以同时存在有多个类的。
    • main方法是必须写在被public修饰的类中。
  • 方法的四要素是返回值、方法名、形参列表和方法体。
    • 方法名:方法的一种标识,必须有。
    • 返回值:方法返回给调用者的东西,必须存在,即使没有返回值也要标记为 void
    • 参数列表:调用者支付给方法的东西,不必须有。
    • 方法体:方法做的事情,对于普通方法来说,必须有。

伪代码: 班长.java

public class 班长{
    void 唱歌(){
        张嘴闭眼, 开始唱!
    }

    void 唱歌( 交5块钱 ){
        张嘴闭眼, 开始唱!
    } 

    唱片 唱歌( 交500块钱 ){
        张嘴闭眼, 开始唱!
        边唱边录制!
        将录成的唱片返回!
    } 
}

5. 详解HelloWorld代码

概念:

  • 编码三大规矩:
    • java代码(不是文本中)中不会出现任何中文符号。
    • java代码中的括号(包括小括号,中括号,大括号)都是成对儿出现的,还有单引号双引号也是一样。
    • java代码中,遇到左大括号,下一行必须缩格。
  • public class HelloWorld{}
    • 一个java文件中可以编写多个class,但是只能有一个public class,此时一个java文件将会产生多个.class文件。
    • main方法只能写在public class中才可以被调用。
    • class是关键字,用来标识HelloWorld是一个类。
    • {} 叫做类体,成对出现,顾名思义,就是一个类的身体。
    • HelloWorld是类的名字,要和文件名一致,首字母大写驼峰制,尽量英文名词,类名不能重复。
  • public static void main(String[] args){}
    • 为什么是public的?为了保证JVM在任何情况下都可以访问到这个入口。
    • 为什么是static的?静态,共享且唯一,为了让JVM调用起来更方便。
    • 为什么返回void?因为main方法结束了,程序就结束了,方法的返回值没有任何意义,所以设计为void。
    • 为什么非叫main?因为JVM只认main为入口的名字
    • 必须要String[] args吗?可以变化,但是意义不大,可以使用 java HelloWorld aa bb ,来测试传入的数组。
  • System.out.println("Hello World!");
    • Java程序中的输出语句,括号中的内容就是输出的内容。
    • 每条语句后,都要以分号结尾。

6. 代码编辑器和IDEA

概念:

  • 代码编辑器 Code Editor:一种可以将记事本的功能进行增强的软件。
  • 集成开发环境 Integrated Development Environment:简称IDE,就是集成了代码编写功能、分析功能、编译功能、调试功能等等的功能的一款一体化软件。
    • Eclipse:它是一个开源的、基于Java的软件。
    • MyEclipse:是基于eclipse之上,丰富了更多的插件和功能的软件。
    • NetBeans:Sun公司自己家研发的IDE。
    • IDEA:全称IntelliJ IDEA,业界被公认为最好的java开发工具。

7. 使用IDEA创建父子工程

流程:

  • 开启IDEA软件,在启动界面,点击 Create New Project 创建项目。
  • 在创建工程界面左侧,点击 Empty Project,它将作为我们所有工程的父工程。
  • 指定项目名 Project name 和项目位置 Project location ,这里要注意,项目内容会直接在你指定的目录中铺开,所以建议多创建一层文件夹。
  • 点击 Finish 完成创建。
  • 为父工程添加一个java模块(modules)。
  • 在创建工程界面左侧,点击 Java,这个是我们父工程的第一个子模块。
  • 在右侧界面中选择自己的JDK版本,当然也可以使用IDEA自带的JDK11。
  • 指定项目名 Project name,其余的内容会自动生成。
  • 点击 Finish 完成创建。
  • 创建项目结构
    • 项目:全小写,破折现风格,如 my-java-project
    • 包:java中的包(package)和系统中的文件夹是一个作用,就是为了分类,需要遵循域名倒置原则,如 com.joezhou.start
    • 类:包括main方法和输出代码的java最小封装单元,首字母大写驼峰,名词,如 AppPerson 等。
  • 在main方法左侧点击运行按钮,选择以debug方式运行HelloWorld,然后再控制台(console)查看运行结果。

源码: /javase-start/

  • src: c.y.start.HelloWorld
/**
 * @author yap
 */
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}

8. Junit单元测试

概念: Junit是Java中的一个单元测试的技术。

  • Junit方法可以单独进行运行,互相之间独立。
  • Junit方法一般返回值为void,没有参数。
  • Junit方法必须挂载 @Test 注解,否则就是一个普通方法。
  • Junit测试类的建议命名后缀为 Test
  • 默认IDEA中没有Junit库,自行添加 Junit4 的类库到环境中。
  • @Before 修饰的方法会在每个Junit方法执行前执行一次,方法名随意。
  • @After 修饰的方法会在每个Junit方法执行后执行一次,方法名随意。

源码: /javase-start/

  • src: c.y.start.JunitTest
/**
 * @author yap
 */
public class JunitTest {

    @Before
    public void before() {
        System.out.println("junit-before");
    }

    @Test
    public void methodA() {
        System.out.println("methodA!");
    }

    @Test
    public void methodB() {
        System.out.println("methodB!");
    }

    @After
    public void after() {
        System.out.println("junit-after");
    }
}