Java语言

Java语言

Java基本语法

  • 大小写敏感
  • 类名:大驼峰命名法(首字母大写)
  • 方法名:小驼峰命名法(首字母小写)
  • 源文件名:类名必须和源文件名一致
  • 主程序入口:public static void main(String []args)

Java修饰符

  • 访问修饰符
修饰符 当前类 同一包内 子孙类 其他包
public Y Y Y Y
protected Y Y Y N
default Y Y N N
private Y N N N
  • 非访问修饰符
修饰符 说明
static 用来创建类方法和类变量
final 用来修饰类、方法和变量,final 修饰的类不能够被继承,修饰的方法不能被继承类重新定义,修饰的变量为常量,是不可修改的。
abstract 用来创建抽象类和抽象方法
transient 序列化的对象包含被 transient 修饰的实例变量时,java 虚拟机(JVM)跳过该特定的变量。
synchronized 主要用于线程的编程,Synchronized 关键字声明的方法同一时间只能被一个线程访问。
volatile 主要用于线程的编程,Volatile 修饰的成员变量在每次被线程访问时,都强制从共享内存中重新读取该成员变量的值。而且,当成员变量发生变化时,会强制线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。

Java数据类型

  • 内置数据类型

    • byte:8位、有符号,以二进制补码表示的整数(-2^7~2^7-1)
    • short:16位、有符号,以二进制补码表示的整数(-2^15~2^15-1)
    • int:32位,有符号(-2^31~2^31-1)
    • long:64位,有符号(-2^63~2^63-1)
    • float:32位,单精度
    • double:64位,双精度
    • boolean: 一位,true/false
    • char:单一的16位Unicode字符(0~2^16-1,\u0000~\uffff)

    可以通过程序直接获取到类型的长度和取值范围,比如:
    Integer.SIZE、Integer.MIN_VALUE、Integer.MAX_VALUE

    自动类型转换顺序:
    byte,short,char-> int -> long -> float -> double

  • 引用数据类型
    • 对象和数组都是引用类型
    • 默认值是null

Java变量类型

  • 局部变量

    • 声明在方法、构造方法或者语句块中;
    • 在方法、构造方法、或者语句块被执行的时候创建,当它们执行完成后,变量将会被销毁;
    • 访问修饰符不能用于局部变量;
    • 只在声明它的方法、构造方法或者语句块中可见;
    • 是在栈上分配的。
    • 没有默认值,所以局部变量被声明后,必须经过初始化,才可以使用。
  • 实例变量

    • 声明在一个类中,但在方法、构造方法和语句块之外;
    • 当一个对象被实例化之后,每个实例变量的值就跟着确定;
    • 在对象创建的时候创建,在对象被销毁的时候销毁;
    • 实例变量的值应该至少被一个方法、构造方法或者语句块引用,使得外部能够通过这些方式获取实例变量信息;
    • 实例变量可以声明在使用前或者使用后;
    • 访问修饰符可以修饰实例变量;
    • 对于类中的方法、构造方法或者语句块是可见的。一般情况下应该把实例变量设为私有。通过使用访问修饰符可以使实例变量对子类可见;
    • 实例变量具有默认值。数值型变量的默认值是0,布尔型变量的默认值是false,引用类型变量的默认值是null。变量的值可以在声明时指定,也可以在构造方法中指定;
    • 实例变量可以直接通过变量名访问。但在静态方法以及其他类中,就应该使用完全限定名:ObejectReference.VariableName
  • 类变量(静态变量)

    • 类变量也称为静态变量,在类中以static关键字声明,但必须在方法构造方法和语句块之外。
    • 无论一个类创建了多少个对象,类只拥有类变量的一份拷贝。
    • 静态变量除了被声明为常量外很少使用。常量是指声明为public/private,finalstatic类型的变量。常量初始化后不可改变。
    • 静态变量储存在静态存储区。经常被声明为常量,很少单独使用static声明变量。
    • 静态变量在程序开始时创建,在程序结束时销毁。
    • 与实例变量具有相似的可见性。但为了对类的使用者可见,大多数静态变量声明为public类型。
    • 默认值和实例变量相似。数值型变量默认值是0,布尔型默认值是false,引用类型默认值是null。变量的值可以在声明的时候指定,也可以在构造方法中指定。此外,静态变量还可以在静态语句块中初始化。
    • 静态变量可以通过:ClassName.VariableName的方式访问。
    • 类变量被声明为public static final类型时,类变量名称必须使用大写字母。如果静态变量不是publicfinal类型,其命名方式与实例变量以及局部变量的命名方式一致。

Java异常

  • 检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。
  • 运行时异常: 运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常可以在编译时被忽略。
  • 错误: 错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译也检查不到的。

所有的异常类是从 java.lang.Exception 类继承的子类。
Exception 类是 Throwable 类的子类。除了Exception类外,Throwable还有一个子类Error 。
Java 程序通常不捕获错误。错误一般发生在严重故障时,它们在Java程序处理的范畴之外。
Error 用来指示运行时环境发生的错误。
例如,JVM 内存溢出。一般地,程序不会从错误中恢复。
异常类有两个主要的子类:IOException 类和 RuntimeException 类。

java exception

  • throws/throw

    如果一个方法没有捕获一个检查性异常,那么该方法必须使用 throws 关键字来声明。
    throws 关键字放在方法签名的尾部。也可以使用 throw 关键字抛出一个异常,无论它是新实例化的还是刚捕获到的。

  • 自定义异常

    所有异常都必须是 Throwable 的子类。
    如果希望写一个检查性异常类,则需要继承 Exception 类。
    如果你想写一个运行时异常类,那么需要继承 RuntimeException 类。

Java数据结构和集合

  • 枚举(Enumeration)
  • 位集合(BitSet)
  • 向量(Vector)
  • 栈(Stack)
  • 字典(Dictionary)
  • 哈希表(Hashtable)
  • 属性(Properties)
  • 集合(Collection)

java collection

Java多线程

  • 线程生命周期
    java thread

  • 创建线程的方法

    • 通过实现 Runable 接口
    • 通过继承 Thread类本身
    • 通过 CallableFuture 创建线程

Java vs CSharp

  • 常量

    • Java

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      static final int K = 100; // compile time

      // 不能给常量设置set方法,也不能在构造函数中设置常量值
      class Test{
      final int afield = 5;
      final int workday = 256;
      ...
      int getAfield(){
      return afield;
      }
      }
    • C#

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      const int K = 100; // compile time
      readonly int K = 100; // runtime

      // 不能设置set方法,但是可以在构造函数中给readonly类型赋值
      class Test{
      readonly int afield;
      const byte workday = 256;

      Test(int n){
      afield = n;
      }
      ...
      int getAfield(){
      return afield;
      }
      }
  • 继承

    • Java
    1
    2
    3
    class B extends A implements Comparable{
    ...
    }
    • C#
    1
    2
    3
    class B : A,IComparable{
    ...
    }
  • 多态和重写

    • Java

      1
      2
      3
      4
      5
      6
      7
      8
      // java中所有方法都可以覆盖
      // 声明为final的方法不能被重写。声明为static的方法不能被重写,但是能够被再次声明。
      public class B extends A{
      @Override
      public void method(){
      ...
      }
      }
    • C#

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      // C#中必须严格哪些方法是虚方法
      public class A{
      public virtual void method(){
      ...
      }
      }

      public class B : A{
      public override void method(){
      ...
      }
      }
  • 单文件多类

    • Java
      java中一个文件只能有一个public类型的类,且必须跟文件保持同名

    • C#
      C#中没有严格要求,可以有多个public类

  • 导入类库

    • Java

      1
      2
      import java.io.*;
      import java.util.*;
    • C#

      1
      2
      using System;
      using System.IO;
  • 枚举(Enum)

  • 属性

    • Java

      1
      2
      3
      4
      5
      6
      7
      8
      // 必须通过get或set方法来读取或设置属性值
      public int getSize(){
      return size;
      }

      public void setSize(int size){
      this.size = size;
      }
    • C#

      1
      2
      3
      4
      // 通过get/set关键字,编译器会自动生成对应的get或set方法
      public int Size{
      get;set;
      }
  • 传递引用

    • Java
      java只能传递值类型参数给方法

    • C#
      C#通过out、ref类传递引用类型

  • 委托

    • Java
      java 没有委托,但可以通过反射来模拟
    • C#
      C#通过关键字delegate来实现
  • 事件

    • Java

    • C#

  • 内部类和匿名类

    • Java
      java 通过内部类来解决多重继承的问题。同时,内部类也是处理事件监听器的方式,因为内部类可以访问对象内部变量。

    • C#

  • 可变参数
    • Java
      1
      2
      3
      4

      public static void printMax(double ... numbers){
      ...
      }
  • C#

    1
    2
    3
    public static void printMax(params double[] numbers){
    ...
    }

Java8新特性

  • Lambda 表达式
    Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中)。
  • 方法引用
    方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器。与lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码。
  • 默认方法
    默认方法就是一个在接口里面有了一个实现的方法。
  • 新工具
    新的编译工具,如:Nashorn引擎 jjs、 类依赖分析器jdeps。
  • Stream API
    新添加的Stream API(java.util.stream) 把真正的函数式编程风格引入到Java中。
  • Date Time API
    加强对日期与时间的处理。
  • Optional 类
    Optional 类已经成为 Java 8 类库的一部分,用来解决空指针异常。
  • Nashorn, JavaScript 引擎
    Java 8提供了一个新的Nashorn javascript引擎,它允许我们在JVM上运行特定的javascript应用。

参考