Java基础整理
回顾Java
的基础知识,不知道该从哪里开始入手,便从Java
的关键字开始,由此扩展出相关知识。
Java中的关键字
关键字
包引入和包声明: import
, package
类和接口的声明: class
, extends
, implements
, interface
数据类型: byte
, boolean
, char
, double
, int
, long
, float
, short
某些数据类型的可选值: flase
, ture
, null
流程控制: break
, case
, continue
, default
, do
, else
, for
, if
, return
, switch
, while
异常处理: catch
, finally
, throw
, throws
, try
修饰符: abstract
, final
, native
, private
, protected
, public
, static
, synchronilzed
, transient
, volatitle
操作符: instanceof
创建对象: new
引用: this
, supper
方法返回类型: void
保留字: const
, goto
标识符
自定义标识符可以由大小写字母、数字、下划线(_
)、美元符号($
)组成,但不能以数字开头,不能是Java中的保留字或关键字。
static关键字
- 静态变量: 类被加在时创建,访问静态变量不需要产生类的实例对象,不能把方法体内的变量声明为静态。
- 静态方法: 可以用类名或实例对象访问,也可以在类的非静态方法中访问。
- 静态代码块: 类第一次被加载时执行,且只被执行一次,其常用来进行类属性的初始化。
注:
- 静态方法内不能以任何方式引用
this
和super
关键字。 - 静态方法内只能直接调用静态成员(变量和方法),而不能直接访问类中的非静态成员。
final关键字
final
关键字可以修饰类、方法和属性
修饰类 : 该类不能被继承
修饰方法 : 该方法不能被覆盖(重写)
修饰属性 : 该属性为常量,只能赋值一次,必须在声明时或在构造方法中显示赋值
注:
- 方法中定义的内部类只能访问该方法内的final型局部变量
- 在Java中通常使用
public static final
的组合方式标识常量,这样的常量就成为了全局的常量,且只能在定义时赋值
继承相关
- 只能单继承,不能多继承,但可以多层继承(
extends、class
) - 可以实现多个接口(
implements、interface
) - 子类继承父类所有的成员变量和成员方法,但不继承父类的构造方法。
- 若不写构造方法,java会自动生成一个无参的构造方法,若写了任何构造方法,则不再默认生成; 子类若不通过
super
显式地调用父类构造方法,则默认调用父类无参构造方法,若父类没有无参构造方法,则会出错。 - 子类覆盖父类的方法时,不能使用比父类中被覆盖方法更严格的访问权限。
访问权限
访问控制修饰符共有四个: public、protected、(default)、private
, default
即为不写时的修饰。
修饰成员:
public : 可以被所有类访问
protected : 既可以被同一包中的其他类访问, 也可以被不同包中的子类访问
default : 只能被同一包中的其他类访问
private : 只能在这个类的内部访问
修饰类(只有两种访问控制:public
和default
):
public : 能被所有的类访问, public修饰的类必须与文件名一致
default : 只能被同一包中所有的类访问
抽象类和接口
抽象类
- 抽象方法的写法为
"abstract 返回值类型 抽象方法名 (参数列表);"
,只声明不实现 - 只要有一个抽象方法,该类就是抽象类,必须用
abstract class
声明 - 抽象类不能实例化,其子类必须覆盖所有的抽象方法后才能被实例化,否则其子类也还是抽象类
abstract
不能与private、static、final、native
并列修饰同一个方法
接口
- 接口用
interface
声明,是一种特殊的抽象类,只包含常量和方法的定义,而没方法的实现 - 接口中定义的变量是全局静态常量,默认(不写)是用
public static final
标记的 - 一个类可以在继承一个父类的同时实现一个或多个接口,此时
extends
关键字必须位于implements
关键字之前 - 接口中的方法默认都是
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
的方法或块语句,同一时刻只能有一个线程能够用访问。
正好写个线程安全的单例模式(懒汉)来体现下volatitle
和synchronilzed
的作用
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;
}
}