2. Java 语法

2.1 注释

  • 单行注释://

  • 多行注释:/* */

  • 文档注释:/** */

    javadoc -encoding UTF-8 -charset UTF-8

2.2 变量

  • 成员变量: 属于类

  • 局部变量:属于方法体内的

  • 实例变量:属于对象

  • 类变量:跟着类走; static 修饰符(静态)

成员变量和局部变量的区别:

  • 成员变量属于类, 局部变量属于方法; 成员变量可被public, private, static 修饰, 局部变量不可被 static 修饰, 两者都可被 final 修饰
  • 成员变量的作用域大于局部变量
  • 成员变量在内存的生存时间是由对象的创建而生, 局部变量则是由方法的调用和结束
  • 成员变量如果是非static修饰的话, 则由对象的实例化而存在与堆内存中,如果是static 修饰则随着类加载而加载,存在于方法区; 局部变量存在于 栈内存
  • 成员变量如果没有被赋值,则会由类型的默认值赋值,局部变量不会.

2.2.1 常量

  • 常量是一种特殊的变量,常量初始化之后的值无法修改
  • final 关键字 修饰 常量;常量名大写字母
  • final 变量类型 常量名 = 常量值;
  • 修饰符 不存在先后顺序

2.2.2 变量的命名规范

  • 类成员变量:首字母小写和驼峰原则

  • 局部变量:首字母小写和驼峰原则

  • 常量:大写字母和下划线

  • 类名:首字母大写和驼峰原则

  • 方法名:首字母小写和驼峰原则

字符串常量和字符常量的区别:

  • 字符常量是单引号引起的一个字符;字符串常量是双引号引起的多个字符
  • 字符常量相当于一个整型值;而字符串常量是内存中的地址

2.3 标识符

  • Java 所有的组成部分都需要名字。类名,方法名,变量名都称为 标识符
  • 关键字:被赋予特殊含义的标识符

2.3.1 关键字

abstract assert boolean break byte
case catch char class const
continue default do double else
enum extends final finally float
for goto if implements import
instanceof int interface long native
new package private protected public
return strictfp short static super
switch synchronized this throw throws
transient try void volatile while

final 关键字

final 可以用来修饰类、方法、变量

  • 修饰的变量如果是基本数据类型,初始化之后值将无法改变;如果是引用数据类型,则初始化过后对应的引用地址不可改变
  • 修饰方法,此方法不可被重写
    • 将方法锁定,以防任何继承类修改它的含义
    • 效率
  • 修饰类,表明这个类无法被继承,且类中的成员方法都隐式的声明为final方法。

static 关键字

https://gitee.com/SnailClimb/JavaGuide/blob/master/docs/java/basic/final,static,this,super.md

staitic 可以用来修饰方法、变量、代码块、内部类

  • 修饰成员变量和方法:static 修饰的变量和方法静态成员变量、方法;可以使用类名.变量来调用;只属于类本身,不属于任何对象;存储位置位于方法区中;
  • static修饰代码块;静态代码块;定义在类的方法外;先于非静态代码块被执行;且执行初始化一次;
  • 静态内部类:(static修饰类的话只能修饰内部类);静态内部类和非静态内部类的最大区别在于非静态内部类初始化后,有一个隐士的指向外围的类,静态内部类则没有;静态内部类无法使用外围类的非静态成员变量和方法
  • 静态导包:

this 关键字

this 用于引用类的当前实例

super 关键字

super 用于子类访问父类的变量和方法

总结:

1.this 和 super 不能用在 static 方法中

  • static 方法表示静态方法,它只属于类,不属于某个对象;this 表示实例对象,super 表示子类对象的父类的实例对象;static 属于类;this 和 super 属于对象

2.在构造器中使用 super() 调用父类中的其他构造方法时,必须位于首行;this 调用本类的其他构造时,也需位于首行

2.4 基本运算符

  • 算术运算符:+、-、*、/、%、++、--
  • 赋值运算符:=
  • 关系运算符:>、<、>=、<=、!=、instanceof
  • 逻辑运算符:&& 、||、 !
  • 位运算符:>> <<
  • 条件运算符:?:
  • 扩展赋值运算符:

自增自减运算符: ++ 、 --

  • 当自增自减运算符位于数字前面:则数字先完成 自增/减 后,在赋值;位于数字后面:则先赋值,在运算自增/减。

2.6 流程控制

2.6.1 顺序结构

  • Java语言的 基本结构,由上而下一步步执行
  • 它是任何一种算法都离不开的基本算法结构

2.6.2 选择结构

  • if 单选择结构

    if(){}
    
  • if 双选择结构

    if(){} else{}
    
  • if 多选择结构

    if(){} else if() {} ... else{}
    
  • if 嵌套结构

    if() { if(){} ...}
    
  • switch 选择结构

    String str = "A";
    switch (str){
        case "A":
            System.out.println("A");
            break;
        case "B":
            System.out.println("B");
            break;
        default:
            System.out.println("未知");  
    }
    

    case 穿透现象,需 break; 匹配一个具体的值

2.6.3 循环结构

  • while 循环

    while (布尔表达式){
        // 输出
    }
    // 样例
    int i=0;
    while (i<100){
        i++;
        System.out.println(i);
    }
    // 注意:需将程序停一下,已避免死循环
    
  • do ... while ... 循环

    do{
    
    }while(布尔表达式);
    
    • 注意:while 先判断条件后执行,do while 先执行后判断(循环体至少被执行一次)
  • for 循环

    for(初始化值; 布尔表达式; 更新){
        // code
    }
    ================================================================================================
    // 注:增强for循环
    for(声明语句:表达式){
        
    }
    

continue、break、return 的区别:

  • break 用于强行退出循环,不执行剩余语句;跳出循环体,剩余程序不会终止
  • continue 用于终止当次循环过程,跳过未执行的语句,接着进行下一次循环
  • return 结束方法运行

2.7 泛型

Java 泛型是 JDK5 中引入了一个新特性,泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。

泛型的本质是参数化类型,也就是所操作的数据类型被指定为一个参数。

Java 泛型是伪泛型,这是因为 Java 在编译期间,所有的泛型信息都会被擦掉,这是通常所说的类型擦除。

泛型的三种方式:泛型类、泛型接口、泛型方法。

泛型类

  • Generic<T> : 常见的 T、E、K、V 等形式的参数常用于表示泛型

  • 实例化泛型的时,必须指定具体的类型

    Generic<Integer>  num = new Generic<Integer>  ();
    

泛型接口

泛型方法

常用的通配符:T E K V ?

  • ? 表示不确定的 java 类型
  • T (type) 表示具体的一个java类型
  • K V (key value) 分别代表java键值中的Key Value
  • E (element) 代表Element

2.8 == 和 equals 的区别

  • == 判断两个对象的地址是不是相等,即判断是否为同一对象
    • 基本数据类型:== 比较的是值
    • 引用数据类型:== 比较的是内存地址

因为Java 只有 值传递,所以,对于 == 来说,不管是比较基本数据类型,还是引用数据类型,其本质都是比较值,只是引用类型变量存的值是对象的地址

  • equals:判断两个对象是否相等,但不能作为基本数据类型的比较

    • equals 是 Object 类的方法

      public boolean equals(Object obj) {
              return (this == obj);
      }
      
    • equals 的两种使用情况

      1. 不重写 Object 的 equals
      2. 重写 Object 的 equals
    • String 方法重写了 equals 方法

      • Object 的 equals 比较的对象的内存地址
      • String 的 equals 比较的是对象的值

2.9 hashCode 和 equals

2.9.1 概念

hashCode 的作用是获取哈希码,也就是散列码,本质为 int 整数。他的作用是确定该对象在哈希表中的索引位置。

Object 的hashCode 方法,意味着所有的Java方法都有此方法。hashCode 方法是一个本地方法,也就是通过 C或者 C++ 实现的,该方法通常用来将对象的内存地址转换为整数后返回。

public native int hashCode();

散列表存储是键值对(key-value),它的特点是可以根据key 快速找到对应的 value. 其中就利用了 散列码

2.9.2 为什么要有 hashCode?

以 HashSet 如何检索重复 为例:

HashSet 存储对象的时候,会先计算对象的 hashCode 值,将 hashCode 去已加入对象hashCode中进行检索和比较,当找不对相等的hashCode时,则加入散列到其他位置;但是如果匹配到了就会使用 equals 方法来检查 hashCode 相等的对象是否真的相等。

以此大大减少了 equals 的次数,提升了效率。

2.9.4 为什么重写 equals 时必须重写 hashCode 方法?

两个相等的对象,他们的 hashCode 也必然是相等的。两者分别执行equals ,皆为 true.

但是就算hashCode相等的对象,也不一定是相等。

2.9.5 为什么相同的hashCode的对象,也不一定相等?

因为hashCode所使用的杂凑算法业务刚好会让多个对象拥有相同的杂凑值。

原文地址:https://www.cnblogs.com/blackBlog/p/13451137.html