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,final
和static
类型的变量。常量初始化后不可改变。 - 静态变量储存在静态存储区。经常被声明为常量,很少单独使用static声明变量。
- 静态变量在程序开始时创建,在程序结束时销毁。
- 与实例变量具有相似的可见性。但为了对类的使用者可见,大多数静态变量声明为public类型。
- 默认值和实例变量相似。数值型变量默认值是
0
,布尔型默认值是false
,引用类型默认值是null
。变量的值可以在声明的时候指定,也可以在构造方法中指定。此外,静态变量还可以在静态语句块中初始化。 - 静态变量可以通过:
ClassName.VariableName
的方式访问。 - 类变量被声明为
public static final
类型时,类变量名称必须使用大写字母。如果静态变量不是public
和final
类型,其命名方式与实例变量以及局部变量的命名方式一致。
- 类变量也称为静态变量,在类中以
Java异常
- 检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。
- 运行时异常: 运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常可以在编译时被忽略。
- 错误: 错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译也检查不到的。
所有的异常类是从 java.lang.Exception 类继承的子类。
Exception 类是 Throwable 类的子类。除了Exception类外,Throwable还有一个子类Error 。
Java 程序通常不捕获错误。错误一般发生在严重故障时,它们在Java程序处理的范畴之外。
Error 用来指示运行时环境发生的错误。
例如,JVM 内存溢出。一般地,程序不会从错误中恢复。
异常类有两个主要的子类:IOException 类和 RuntimeException 类。
throws/throw
如果一个方法没有捕获一个检查性异常,那么该方法必须使用 throws 关键字来声明。
throws 关键字放在方法签名的尾部。也可以使用 throw 关键字抛出一个异常,无论它是新实例化的还是刚捕获到的。自定义异常
所有异常都必须是 Throwable 的子类。
如果希望写一个检查性异常类,则需要继承 Exception 类。
如果你想写一个运行时异常类,那么需要继承 RuntimeException 类。
Java数据结构和集合
- 枚举(Enumeration)
- 位集合(BitSet)
- 向量(Vector)
- 栈(Stack)
- 字典(Dictionary)
- 哈希表(Hashtable)
- 属性(Properties)
- 集合(Collection)
Java多线程
线程生命周期
创建线程的方法
- 通过实现
Runable
接口 - 通过继承
Thread
类本身 - 通过
Callable
和Future
创建线程
- 通过实现
Java vs CSharp
常量
Java
1
2
3
4
5
6
7
8
9
10
11static 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
16const 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
3class B extends A implements Comparable{
...
}- C#
1
2
3class B : A,IComparable{
...
}多态和重写
Java
1
2
3
4
5
6
7
8// java中所有方法都可以覆盖
// 声明为final的方法不能被重写。声明为static的方法不能被重写,但是能够被再次声明。
public class B extends A{
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
2import java.io.*;
import java.util.*;C#
1
2using 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
事件
Java
C#
内部类和匿名类
Java
java 通过内部类来解决多重继承的问题。同时,内部类也是处理事件监听器的方式,因为内部类可以访问对象内部变量。C#
- 可变参数
- Java
1
2
3
4
public static void printMax(double ... numbers){
...
}
- Java
C#
1
2
3public 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应用。