Java基础整理

回顾Java的基础知识,不知道该从哪里开始入手,便从Java的关键字开始,由此扩展出相关知识。



Java中的关键字

1. 包引入和包声明: import, package
2. 用于类和接口的声明: class, extends, implements, interface
3. 数据类型: byte, boolean, char, double, int, long, float, short
4. 某些数据类型的可选值: flase, ture, null
5. 流程控制: break, case, continue, default, do, else, for, if, return, switch, while
6. 异常处理: catch, finally, throw, throws, try
7. 修饰符: abstract, final, native, private, protected, public, static, synchronilzed, transient, volatitle
8. 操作符: instanceof
9. 创建对象: new
10. 引用: this, supper
11. 方法返回类型: void
12. 保留字: const, goto

标识符

自定义标识符可以由大小写字母、数字、下划线(_)、美元符号($)组成,但不能以数字开头,不能是Java中的保留字或关键字。


static关键字

  1. 静态变量: 类被加在时创建,访问静态变量不需要产生类的实例对象,不能把方法体内的变量声明为静态。
  2. 静态方法: 可以用类名或实例对象访问,也可以在类的非静态方法中访问。
  3. 静态代码块: 类第一次被加载时执行,且只被执行一次,其常用来进行类属性的初始化。

注:

  1. 静态方法内不能以任何方式引用thissuper关键字。
  2. 静态方法内只能直接调用静态成员(变量和方法),而不能直接访问类中的非静态成员。

final关键字

final关键字可以修饰类、方法和属性

修饰类   : 该类不能被继承
修饰方法 : 该方法不能被覆盖(重写)
修饰属性 : 该属性为常量,只能赋值一次,必须在声明时或在构造方法中显示赋值

注:

  1. 方法中定义的内部类只能访问该方法内的final型局部变量
  2. 在Java中通常使用public static final的组合方式标识常量,这样的常量就成为了全局的常量,且只能在定义时赋值

继承相关

  1. 只能单继承,不能多继承,但可以多层继承(extends、class)
  2. 可以实现多个接口(implements、interface)
  3. 子类继承父类所有的成员变量和成员方法,但不继承父类的构造方法。
  4. 若不写构造方法,java会自动生成一个无参的构造方法,若写了任何构造方法,则不再默认生成; 子类若不通过super显式地调用父类构造方法,则默认调用父类无参构造方法,若父类没有无参构造方法,则会出错。
  5. 子类覆盖父类的方法时,不能使用比父类中被覆盖方法更严格的访问权限。

访问权限

访问控制修饰符共有四个: public、protected、(default)、private, default即为不写时的修饰。

修饰成员:

public    : 可以被所有类访问
protected : 既可以被同一包中的其他类访问, 也可以被不同包中的子类访问
default   : 只能被同一包中的其他类访问
private   : 只能在这个类的内部访问

修饰类(只有两种访问控制:publicdefault):

public    : 能被所有的类访问, public修饰的类必须与文件名一致
default   : 只能被同一包中所有的类访问

抽象类和接口

抽象类

  1. 抽象方法的写法为"abstract 返回值类型 抽象方法名 (参数列表);",只声明不实现
  2. 只要有一个抽象方法,该类就是抽象类,必须用abstract class声明
  3. 抽象类不能实例化,其子类必须覆盖所有的抽象方法后才能被实例化,否则其子类也还是抽象类
  4. abstract不能与private、static、final、native并列修饰同一个方法

接口

  1. 接口用interface声明,是一种特殊的抽象类,只包含常量和方法的定义,而没方法的实现
  2. 接口中定义的变量是全局静态常量,默认(不写)是用public static final标记的
  3. 一个类可以在继承一个父类的同时实现一个或多个接口,此时extends关键字必须位于implements关键字之前
  4. 接口中的方法默认都是public abstract类型的,即使不饰符,也是这种类型的。

instanceof操作符

可以使用instanceof操作符判断一个类是否实现了某个接口,或用来判断一个实例对象是否属于某个类。其语法格式为:对象 instanceof 类(或接口)


native关键字

JKD源码中总会看到native的方法,如:

	// Object中
	public native int hashCode();
	protected native Object clone() throws CloneNotSupportedException;
	// String中
	public native String intern();

native关键字表明其修饰的方法是一个原生态方法,方法对应的实现不是在当前文件,而是在用其他语言(如C和C++)实现的文件中。
Java语言本身不能对操作系统底层进行访问和操作,但是可以通过JNI(Java Native Interface,本机编程接口,是SDK的一部分)调用其他语言来实现对底层的访问。
怎么写JNI这里就不说了。


transient关键字

Java的序列化机制可以把实现了Serializable接口的对象进行持久存储,而被transient关键字修饰的字段,在序列化时就会被忽略。


volatitle关键字

volatitle关键字用于多线程的环境中,用volatitle修饰的变量,每次取值时都会取修改后的值,即该变量不会装入寄存器,每次改变都写入内存,每次读取都到内存中去取。
两个线程同时对int a = 0;定义好的a进行a++操作时,线程1对a自增之后未写回,线程2又对a进行了自增,就会导致与预期结果不一样。


synchronilzed关键字

synchronized关键字用于实现多线程的同步,在多线程访问的时候,所有加上synchronized的方法或块语句,同一时刻只能有一个线程能够用访问。

正好写个线程安全的单例模式(懒汉)来体现下volatitlesynchronilzed的作用

publicclass Singleton {
    private static volatile Singleton instance = null;
    private Singleton() { }
    public static Singleton getInstance() {
        if (instance == null) {  // 注意这里有两次判断,里面那个判断是必须有的,外面这个判断可提高效率
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}