jdk,jre,jvm

JDK是软件开发工具包,安装目录java/bin是jdk的核心包。其中最主要的可执行文件有

  1. javac—-编译器 编译命令: javac [选项] 文件名+后缀
  2. java—-解释器 即字节码文件运行程序:命令:java [选项] 文件名无后缀 apple小程序是浏览器进行解释编译得到的字节码文件
  3. jdb—-调试器
  4. appletviewer—-java Applet 解释器

java/lib目录下是函数库


JRE是java运行环境,由java虚拟机和一些标准的类别函数库(javaAPI类库)组成


JVM是java虚拟机,用于解释运行编译得到的字节码文件。jvm是java无视环境跨平台的最重要手段。只要有 Java 虚拟机的平台,就能解释执行 java 字节码程序
平台无关性的代价是降低程序的执行效率
jdk>jre>jvm
验证java环境:**java javac** 二者都可选参数:**-version**

Java语言优点

  • 强类型:强类型能约束程序员必须遵守更多的编程规定,也能让编译器检测出程序中尽可能多的错误。
  • 平台无关性
  • 自动回收:jvm有一个垃圾回收器
  • 面向对象
  • 安全性:隐藏指针。运行前检查字节码文件。applet禁止访问本地资源…
  • 分布式:C/S架构,实现数据分布(访问网络数据)与操作发布(分布计算网络获取结果)
  • 多线程:自带多线程环境

    java基础语法

    类机制

  • 一个 java源文件扩展名必须是**.java**

  • 一个源文件有多个类,那么只能有一个public类
  • 命名可见性:如果一个源文件有public类,那么源文件文件名必须与该public类名相同

包机制

  • 包名是一个目录名,即项目路径
  • 声明包:package pkg1 [. pkg2[. pkg3...]];
  • 命名包:一般使用公司域名的倒置作为包名
  • package 语句必须出现在源程序文件的起始行,表示出现在该文件中的所有类都属于这个程序包。如果有多个源程序的程序包声明使用相同的包名,则表示这些源程序文件中的全部类都属于这个程序。
  • 如果 源程序文件的首行没有 package 语句,则被默认为是无名包,存于当前目录中。

    import

  • import用于引入所需要的类或包中的成员。import必须在package后面,类的定义之前

    • 除了导入包,也可以不导包直接在代码写全所属包类。java.io.File a=new java.io.File("Test.java");麻烦很多
  • 默认使用的都是java.lang下的内容,所以java.lang下的包不需要导入

    注释

  • 单行注释//...

  • 多行注释/*...*/ 文档注释和多行注释的每一行一般还会使用一个*分隔
  • 文档注释/**...*/
    • javadoc命令可以将文件中的文档注释提取出来生成HTML格式的API文档
    • 文档注释中有如下参数信息可以填写,javadoc就会根据这些参数生成命令 ```java /**
  • @author kuangsheng 作者名
  • @version 1.0 版本号
  • @since 1.8 说明需要使用的最早jdk版本 / public class Test{ /*
  • @param name 参数名
  • @return String 返回值情况
  • @throws Exception 异常抛出情况 */ public String(String name) throws Exception{
    1. return name;
    } } //dos中执行:javadoc -encoding UTF-8 -charset UTF-8 Test.java 参数分别是设置编码和字符集为utf-8 ```

    main主函数

    主函数必须是public static void main(String agrs) {...}这样的写法。args不是固定的

    标识符

  • 由字母,下划线字符_,美元字符$,文字,数字组成。
  • 限定标识符的第一个字符不能是数字。

    命名规则

  • 一般变量名、方法名用小写英文字母开头;

  • 文字和常数用大写字母命名;
  • 类名首字母用大写字母;
  • 包名全部用小写字母

    java字符

  • Java 语言使用 Unicode 字符集(包括数字,字母,汉字,日文……,特殊字符)

    • 字符类型内部就是Unicode

      关键字

      不能作为标识符的单词(很多额外导包里的函数名不属于关键字)

      控制流

  • if-else

  • while
  • do-while
  • for
  • for-each:for(variable : collection) {// todo} collection只能是数组或者是一个实现了 Iterable 接口的类对象
  • switch:case 标签可以是:
    • 类型为 char、byte、 short 或 int 的常量表达式。还有枚举常量。
    • 从 Java SE 7 开始, case 标签还可以是字符串字面量。
  • break:退出当前循环的整个循环。break可以标签,使用标签可以跳出任意一重循环,如在最内层循环使用break标签语句跳出最外层循环
  • continue:跳过当前的一轮循环。如果已经是最后一轮循环了还执行continue语句,则跳转至循环第一轮 ```java public static void main(String[] args) {
      read_data:  //定义标签位置
     for(int i=0;i<10;i++){
         for (int  j= 0;  j< 10; j++) {
             System.out.print('a');
             break read_data;
         }
      System.out.println('b');}
    
    } } /*不使用break:输出 aaaaaaaaab aaaaaaaaab …. 使用break: ab ab ab 使用带标签break 输出 a 然后就结束了2个循环
```java
Scanner in = new Scanner(System.in);
while (sum < goal ){
    System.out.print("Enter a number: ");
    n = in.nextlntO;
    if (n < 0) 
        continue;
    sum += n; // not executed if n < 0
}

运算符

  • 几乎所有运算符都只能操作基本类型,唯一的例外是 =(赋值运算符)、==(关系运算符) 和 !=(关系运算符),它们能操作所有对象(这也是令人混淆的一个地方)

    算术运算符

  • + - * / %

    • +还有一个作用就是连接相邻的一个字符串,如sout(5+"d"); ->5x
  • 还有等于号与算术运算符结合,等同于x?=y相当于 x=x?y

    赋值运算符

  • 运算符的赋值是由符号 = 完成的。它代表着获取 = 右边的值并赋给左边的变量。右边可以是任何常量、变量或者可产生一个返回值的表达式。但左边必须是一个明确的、已命名的变量(即常数不能作为左值)。也就是说,必须要有一个物理的空间来存放右边的值。

    • 如可将一个常数赋给一个变量(A = 4),但不可将任何未知的东西赋给一个常数(比如不能 4 = A)。
  • 基本类型间的赋值只是直接复制了一个值,而对象间的复制则是在操纵引用,如String str = new String("小牛肉");String s;``s = str; s和str还是指向同一个对象

    关系运算符

  • == != >= <= >

    逻辑运算符

  • && 逻辑与 || 逻辑或 ! 逻辑非

  • &&和 || 具有短路 (short-circuiting) 特性: 整个表达式会在运算到可以明确结果时就停止并返回结果,这意味着该逻辑表达式的后半部分不会被执行到

    位运算符

  • 会把操作数转化为二进制进行运算

  • & and与 | or或 ^ xor非 ~ not异或
  • 还有移位运算符:>>右移,<<左移运算符 >>>(无<<<)暂时不知道和>>有什么区别

    三元操作符

    布尔表达式:a?b 为真返回a或者a表达式结果 为假...

    instanceof

  • 判断一个对象是否是另外一个类的对象或者子类对象。

  • 对象的类型必须和判断的类型存在关系,比如存在父子类关系,否则会报错

image.png
老师类和学生类继承自Person。
object是Student类型,object既不是Teacher和String类的对象,也不是Teacher和String子类的对象。但是二者好歹和object类型Object存在关系。所以false
person是Student类型,Student和String完全不存在关系,所以直接报错

==,!=和equals的区别

  • equals():**java.lang.Object**
  • ==和!=,equals判断基本类型时,就是判断值是否相同
  • 判断对象时:Object.equals本质上还是等同于==。不过很多类都重写了equals方法。如基本类都重写了,重写后的equals便是比较值
  • 查看基本类==基本类型时,也是只比较值

    class Value {
      int i;
    }
    public class EqualsMethod2 {
      public static void main(String[] args) {
          Value v1 = new Value();
          Value v2 = new Value();
          v1.i = v2.i = 100;
          System.out.println(v1.equals(v2));    //false
          //注意这里不是比较字段值,上面
      }
    }
    

    Objects.equals()

    //这是Object类的equals方法
    public boolean equals(Object obj) {        return (this == obj);    }
    //这是工具类java.util.Objects的equals方法
    public static boolean equals(Object a, Object b) {
          return (a == b) || (a != null && a.equals(b));   //这个equals是Object的方法
      }
    

    运算符优先级与结合性表

  • 只需记住基本的乘除>加减即可 还有=号是右结合

  • 强制类型转换运算符**(?)**的优先级为第二级
  • 实际开发中只需用括号显式的定义运算顺序即可,无需死记硬背

image.png