1. 变量命名

标识符只能由数字、字母、下划线、$构成,并且标识符的第一个只能是数字、字母、下划线或$。标识符也不能含有空白字符(换行符、空格和制表符)。变量名区分大小写。

2. final、finally、finalize区别

  • final用于声明属性、方法和类,分别表示属性不可变、方法不可被覆盖和类不可被继承。

final属性:被final修饰的变量不可变。指的是引用不可变

编译通过运行结果为helloworld
public class Test {
	public static void main(String[] args) {
		final StringBuffer s=new StringBuffer("hello");
		s.append("world");
		System.out.println(s);
	}
}
编译出错
public class LinkComponent {
	public static void main(String[] args) {
		final StringBuffer s1=new StringBuffer("hello");
		s1=new StringBuffer("helloworld");
	}
}

因此final指的是引用不可变性,即它只能指向初始化时指向的那个对象,而不关心指向内容的变化。所以被final修饰的变量必须初始化。
final修饰的变量初始化方法

  • 在定义的时候初始化
  • final成员变量可以在初始化块中初始化,但不可在静态初始化块中初始化
  • 静态final成员变量可以在静态初始化块中初始化,但不可在初始化块中初始化
  • 在类的构造器中初始化,但静态final成员变量不可在构造函数中初始化。

final方法
final方法不允许子类重写,但子类仍可以使用该方法。另外当调用一个被声明为final的方法时,直接将方法主体插入到调用处,而不是进行方法调用,可以提高程序效率(内联机制)。
final类
final类不能被继承,所有方法都不能被重写。但这并不表示final类的成员变量也是不可变的,要想做到final类的成员变量不可改变,必须给成员变量增加final修饰。注意:一个类不能既被声明为abstract又被声明为final

  • finally用在try catch语句中,表示这段语句最终一定会被执行,经常被用在需要释放资源的情况下。
  • finalize是Object类的一个方法,在垃圾回收器执行时会调用被回收对象的finalize方法,可以覆盖此方法来实现对其他资源的回收,例如关闭文件等。需要注意的是,一旦垃圾回收器准备好释放对象占用的空间,将首先调其finalize方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。

Java中String、StringBuffer等类是不能继承的

3.assert作用

断言assert作为一种软件调试的方法,提供了一种在代码中进行正确性检查的机制。
主要作用:对一个boolean表达式进行检查。一个正确运行的程序必须保证这个boolean表达式的值为true,若boolean表达式的值为false,则说明程序已经处于一种不正确的状态,系统需要提供警告信息并且退出程序。
assert包括两种表达式:assert ex1与assert ex1:ex2。其中ex1表示一个boolean表达式,ex2表示一个基本类型或者一个对象

public class Test {
	public static void main(String[] args) {
		assert 1+1==2;
		System.out.println("assert1 ok");
		assert 1+1==3: "assert failed,exit";
		System.out.println("assert2 ok");
	}
}

当执行javac Test.java与java Test时,程序输出

assert1 ok
assert2 ok

当执行javac Test.java与java -ea Test时,程序输出

assert1 ok
Exception in thread "main" Java lang AssertionError:assert failed,exit
at Test.main(Test.java:5)

4. static作用

static成员变量

  • static修饰的变量为静态变量,非static修饰的为实例变量。
  • 静态变量属于类,在内存中只有一个复制(所有实例都指向同一个内存地址),只要静态变量所在的类被加载,这个静态变量就会被分配空间。
  • 对静态变量的引用方式:类.静态变量和对象.静态变量。
  • 实例变量属于对象,只有对象被创建后,实例变量才会被分配空间,才能被使用,在内存中有多个复制。只能用对象.实例变量引用。
  • Java中不能在方法体中定义static变量

static成员方法

  • static方法是类的方法,不需要创建对象就可被调用。非static方法是对象的方法。
  • static方法中不能使用this和super关键字,不能调用非static方法,只能访问所属类的静态成员变量和静态方法,不能访问非static类型的变量。因为static方法被调用时,这个类的对象可能还没被创建,即使已经被创建也无法确定调用哪个对象的方法。
  • static一个很重要的用途:实现单例模式。单例模式的特点是该类只能有一个实例,为了实现这一功能,必须隐藏类的构造函数,即把构造函数声明为private,并提供一个创建对象的方法。由于构造函数被声明为private,外界无法直接创建这个类型的对象,只能通过该类提供的方法来获取类的对象,要达到这样的目的只能把方法声明为static。
class Singleton{
	private static Singleton instance=null;
	private Singleton() {}
	public static Singleton getInstance() {
		if(instance==null) {
			instance=new Singleton();
		}
		return instance;
	}
}
  • 用public修饰的static变量和方法本质上是全局的,若static变量前用private修饰,则表示这个变量可以在类的静态代码块或者类的其他静态成员方法中使用,但不能在其他类中通过类名来引用。

static 代码块
静态代码块在类中是独立于成员变量和成员函数的代码块的。它不在任何一个方法体内,JVM在加载类时会执行static代码块,如果有多个static代码块,JVM将会按顺序来执行。经常被用来初始化静态变量,只会被执行一次。
static内部类
不依赖于外部类实例而被实例化,不能与外部类有相同的名字,不能访问外部类的普通成员变量,只能访问外部类中的静态成员和静态方法(包括私有类型)。只有内部类才能被定义为static。
实例变量、局部变量、类变量、final变量
实例变量归对象所有(只有在实例化对象后才可以),各个对象中的实例变量互不影响。
局部变量是在方法中定义的变量使用前必须初始化。
类变量归类所有。所有实例化对象共享该变量。不能在成员函数内部定义static变量
final变量表示这个变量是常量不可以被修改。
对于变量若使用static final修饰则表示一旦被赋值就不可修改,并且通过类名可访问。
对于方法若使用static final修饰则表示该方法不可覆盖,并且可以通过类名直接访问。

5. switch

switch(expr)

expr只能是一个枚举常量(内部也由整型或字符型实现)或一个整数表达式。其中整数表达式可以是int或Integer或者能够隐式转换为int类型的类型(short 、byte、char)。但是float、double、long、String类型不能隐式的转换为int类型,因此不能用作switch的表达式。从Java7开始expr可以是String类型。
从本质上来讲,switch对字符串的支持,其实是int类型值的匹配。实现原理:通过对case后面的String对象调用hashCode方法,得到一个int类型的hash值,然后用这个hash值来唯一标识这个case。当匹配时,先调用这个字符串的hashCode方法,获取一个hash值,用这个hash值来匹配所有case,若匹配成功则会调用字符串的String.equals方法匹配。所以String变量不能为null case子句使用的字符串也不能为null。
case语句后可以是直接的常量数值也可以是一个常量计算式还可以是final型的变量(final变量必须是编译时的常量)。但不能是变量或带有变量的表达式例如i*2。更不能是浮点类型的数。一般在case语句结尾添加break语句。

6. volatile

被volatile类型定义的变量,系统每次用到它时都是直接从对应的内存当中存取,而不会利用缓存。在使用了volatile修饰成员变量后,所有线程在任何时候所看到变量的值都是相同的。
但是volatile不能保证操作的原子性,因此一般情况下volatile不能代替sychronchized

7.strictfp

strict float point的缩写,确保浮点数运算的准确性。
一旦用strictfp来声明一个类、接口或者方法,那么在所声明的范围内,java编译器以及运行环境会完全依照IEEE二进制浮点数算术标准(IEEE754)来执行,在这个关键字声明的范围内的所有浮点数的计算都是精确的。
当一个类被strictfp修饰时,所有方法都会自动被strictfp修饰。因此strictfp可以确保浮点数运算的准确性,而且在不同的硬件平台上都会有一致的运行结果。