Qingquan-Li / blog

My Blog
https://Qingquan-Li.github.io/blog/
132 stars 16 forks source link

Java 基础知识点 #33

Open Qingquan-Li opened 7 years ago

Qingquan-Li commented 7 years ago

静态语言 / 动态语言

编译型语言 / 解释型语言

前者由于程序执行速度快,同等条件下对系统要求较低,因此像开发操作系统、大型应用程序、数据库系统等时都采用它,像 C/C++ 、 Pascal/Object Pascal(Delphi) 等都是编译语言,而及辅助开发接口这样的对速度要求不高、对不同系统平台间的兼容性有一定要求的程序则通常使用解释性语言,如Java、JavaScript、Perl、Python、Ruby 等等。

Java 是编译型语言语言还是解释型语言?

  • 编译型:因为所有的Java代码都是要编译的, .java 不经过编译就无法执行。 一种朴素的判定方式:「如果翻译器部分较为简单,我们说这个语言是解释型,反之如果翻译器部分很复杂,我们就说这个语言是编译型。」 这里有一条启发性原则用以判断语言的类型:「如果翻译器对程序进行了彻底的分析而非某种机械的变换,而且生成的中间程序与源程序之间没有很强的相似性,我们就认为这个语言是编译的。彻底的分析和非平凡的变换,是编译方式的标志性特征。」
  • 解释型:因为java代码编译后不能直接运行,它是解释运行在 JVM 上的,所以它是解释型的。 对于 C 和 C++ ,它们经过一次编译之后,可以由操作系统直接执行(如 Windows 编译成 exe 文件, Linux 编译成 erp 文件),所以它们是编译型语言。 而 Java 不一样,它首先由编译器编译成 .class(字节码)文件 ,然后在通过 JVM 从 .class文件 中读一行解释执行一行(也因此性能较低),所以它是解释型的语言。也正是由于 java 对于多种不同的操作系统有不同的 JVM ,所以实现了真正意义上的跨平台。
  • 既是编译型又是解释型:因为“编译”其本质就是“把一个相对高级的语言转换为另一个相对低级的语言”,而由 java -> class 文件的编译已经满足了这个特征;然而说 JVM 是“解释执行”的,那其实硬件对于机器码又何尝不是“解释执行”呢?
  • 总结:现在,编译型语言和解释型语言的边界已经很模糊,就像虚拟机( Java 中用以解释 .class 字节码二进制文件 的解释器称为虚拟机 JVM ,JVM 包含在 Java 的运行环境 JRE 中,除了包含 JVM 之外,还包含类加载器、字节码校验器、大量的基础类库)和解释器( Python 中运行环境称为解释器,用以解释 .pyc 字节码二进制文件)的边界已经很模糊,但是我们一般地,称 Java 为解释型语言。 Java-compile-interpret JVM PythonWork

编译型语言不如解释型语言跨平台性好。

  • 编译型语言例如 C 语言:用 C 语言开发了程序后,需要通过编译器把程序编译成机器语言(即计算机识别的二进制文件,因为不同的操作系统计算机识别的二进制文件是不同的),所以 C 语言程序进行移植后,要重新编译。(如 Windows 编译成 exe 文件, Linux 编译成 erp 文件)。
  • 解释型语言,例如 Java 语言, Java 程序首先通过编译器编译成 .class 文件,如果在 Windows 平台上运行,则通过 Windows 平台上的 Java 虚拟机(VM)进行解释。如果运行在 Linux 平台上,则通过 Linux 平台上的 Java 虚拟机进行解释执行。所以说能跨平台,前提是平台上必须要有相匹配的 Java 虚拟机。如果没有 Java 虚拟机,则不能进行跨平台。

Java 环境变量配置

参考: http://www.runoob.com/java/java-environment-setup.html

  1. ① JDK 安装,安装完成后,添加 JAVA_HOME 环境变量,该环境变量指向 JDK 安装路径, eg : ~\Java\jdk1.7.0_01 ② 添加 CLASSPATH 环境变量( JDK1.5 开始可以省略),该环境变量的值为 .;%JAVA_HOME%/lib/tools.jar;%JAVA_HOME%/lib/dt.jar;(记得前面有个 . ) ③ 如果为了可以编译和运行 Java 程序,还应该在 PATH 环境变量中增加 %JAVA_HOME%/bin ,(路径最好放在 Path 所有路径最前面,英文分号 ; 隔开)。
  2. 验证 Java 环境变量是否配置: 命令行 → java -version 查看版本。
  3. 命令行输入 javac 回车看到一堆字符即为已安装 jdk 可以 java 编译了。(若 “javac不是内部或外部命令” ,其他一切正常,尝试重新配置环境变量,PATH 中的 %JAVA_HOME%/binJAVA_HOME 改成绝对路径,能 javac 后再改回来。)

在 命令行编译和运行Java代码

首先在命令行 cd 到 Java 文件存放的目录,然后输入,例如: javac HelloWorld.java ,敲击回车,这个命令会将 java 文件编译(compiling)成 class 文件,然后输入 java HelloWorld 敲击回车就能输出 java 文件的输出结果。

Java源文件( *.java 文件) → 使用 javac 编译 → 字节码文件(编译生成 *.class 文件) 使用 java (虚拟机 JVM )解释执行 → 特定平台的机器码

注意:

Java 数据类型

所谓的引用数据类型就是对一个对象的引用。 引用数据类型:数组、类(含String类)、接口。

数据类型:

控制循环结构

  1. break :结束当前循环,跳出循环体,开始执行循环之后的代码;
    for(int i = 0;i < 10;i++){
    System.out.println("i 的值是:"+i);
    if(i == 2){
        break;
    }
    } 
    System.out.println("break 作用:完全结束该循环,执行循环之后的代码");
    /*输出:
    i 的值是:0 
    i 的值是:1 
    i 的值是:2 
    break 作用:完全结束该循环,执行循环之后的代码
    */
  2. continue :忽略本次循环剩下的语句,开始下一次循环,并不会终止循环
    for(int i = 0;i < 3;i++){
    System.out.println("i 的值是:"+i);
    if(i == 1){
        continue;
    }
    System.out.println("continue 作用:继续循环,忽略本次循环剩下的语句");
    }
    /*输出:
    i 的值是:0 
    continue 作用:继续循环,忽略本次循环剩下的语句 
    i 的值是:1 
    i 的值是:2 
    continue 作用:继续循环,忽略本次循环剩下的语句
    */
  3. return :结束方法,循环也随之结束
    for(int i = 0;i < 10;i++){
    System.out.println("i 的值是:"+i);
        if(i == 1){
            return;
        }
    System.out.println("return 作用:直接结束整个方法,不管 return 处在多少层循环之内");
    }
    /*输出:
    i 的值是:0 
    return 作用:直接结束整个方法,不管 return 处在多少层循环之内 
    i 的值是:1
    */

JDK / JRE / JVM

参考:http://docs.oracle.com/javase/8/docs/

Java8概念图描述

Java内存

参考: http://www.cnblogs.com/xiohao/p/4278173.html http://tutorials.jenkov.com/java-concurrency/java-memory-model.html https://www.tutorialspoint.com/java/java_multithreading.htm