java平台与内存管理
java具有”平台独立性“,指的是可以在一个平台上编写编译程序,在另外的平台上运行程序。实现的机制为:“中间码(也就是字节码,后缀为.class)”和“JVM”,程序被编译之后,不是生成在硬件平台上的可执行代码,而是“中间码”,然后又不同硬件平台上的JVM来翻译”中间码“生成不同硬件平台的可以执行代码。因此JVM不具有“平台独立性”,因为每个平台的JVM都是不一样的。
顺序:java代码-》中间码-》JVM-》操作系统-》硬件
java字节码(中间码)执行分为两种方式:及时编译方式+解释执行方式(常用)。
及时编译方式:解释器先将字节码翻译成机器码,然后执行机器码
解释执行方式:解释器每次解释 并执行一小段。
JVM会将生成的.class文件从硬盘加载到内存中,并组织生成一个java应用程序。这个加载过程由类加载器完成。分为显式和隐式加载。隐式:使用new等方式创建对象。显式:直接调用class.forName()把类加载到JVM。
Java中四种线程安全的单例模式实现方式
饿汉式,懒汉式加双重检锁(本身是线程不安全的),枚举,静态内部类
面试问道:什么是单例模式,需要回答三个元素:
1. 构造方法私有化
2. 静态属性指向实例
3. public static的 getInstance方法,返回第二步的静态属性
主要掌握“饿汉式”和”懒汉式“的实现代码:
首先是饿汉式:
package charactor;
public class GiantDragon {
//私有化构造方法使得该类无法在外部通过new 进行实例化
private GiantDragon(){
}
//准备一个类属性,指向一个实例化对象。 因为是类属性,所以只有一个
private static GiantDragon instance = new GiantDragon();
//public static 方法,提供给调用者获取12行定义的对象
public static GiantDragon getInstance(){
return instance;
}
}
懒汉式:
package charactor;
public class GiantDragon {
//私有化构造方法使得该类无法在外部通过new 进行实例化
private GiantDragon(){
}
//准备一个类属性,用于指向一个实例化对象,但是暂时指向null
private static GiantDragon instance;
//public static 方法,返回实例对象
public static GiantDragon getInstance(){
//第一次访问的时候,发现instance没有指向任何对象,这时实例化一个对象
if(null==instance){
instance = new GiantDragon();
}
//返回 instance指向的对象
return instance;
}
}
两者各自的适用范围是:
饿汉式是立即加载的方式,无论是否会用到这个对象,都会加载。懒汉式,是延迟加载的方式,只有使用的时候才会加载。因此,如果业务上允许有比较充分的启动和初始化时间,就使用饿汉式,否则就使用懒汉式 。
抛InterruptedException的代表方法有:
java.lang.Object 类的 wait 方法
java.lang.Thread 类的 sleep 方法
java.lang.Thread 类的 join 方法
构造函数
1、如果没写构造函数会自动提供一个没有参数的默认的构造函数,里面什么都不执行。
2、在new之后自动调用,其名称和类名相同,但是没有返回值(因此连void也不需要加)
3、构造函数不能被继承,因此不能被覆盖(overide)。但是可以重载;因此,在父类没有提供无参数的构造函数时,子类必须显式地调用父类的构造函数;而如果父类提供了无参的构造函数,那么子类无需显式调用父类构造函数。
4、而如果子类与父类都没有定义构造函数的话,编译器会自动给他们都生成一个默认的无参构造函数。
5、注意类里面的普通方法是可以和构造函数一个名称的。区别就是构造函数无返回值,不需要加void,但是普通方法如果没有返回值需要加void。