欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

高频面试题总结第一天

程序员文章站 2022-05-06 18:47:51
...

高频面试题

Java高级

1.单例设计模式(Singleton):

某个类在整个系统中只能有一个实例对象可以被获取和使用的代码模式。要点:某个类只能有一个实例,它必须自行创建这个实例(含有一个该类的静态变量来保存这个唯一的实例),它必须自行向整个系统提供这个实例(对我提供获取该实例对象的方式:直接暴露,用静态变量的get方法获取)。

常见形式:饿汉式:直接创建对象,不存在线程安全问题:

a、直接实例化饿汉式(简洁美观):不管是否需要都会创建

public class Singleton1{
    /**final修饰方法使其不能被更改(类的private方法会隐式地被指定为final方法
    一、final关键字的功能概述
  	    final关键字可以用来修饰引用、方法和类。
  	    1、 用来修饰一个引用
 			如果引用为基本数据类型,则该引用为常量,该值无法修改;
 			如果引用为引用数据类型,比如对象、数组,则该对象、数组本身可以修改,但指向该对象或数组的地址的引用不能修改。
 			如果引用时类的成员变量,则必须当场赋值,否则编译会报错。
 		2、用来修饰一个方法
    		当使用final修饰方法时,这个方法将成为最终方法,无法被子类重写。但是,该方法仍然可以被继承。
    	3.用来修饰类
 			当用final修改类时,该类成为最终类,无法被继承。简称为“断子绝孙类”。
 	静态变量和静态方法

static关键字最基本的用法是:

1、被static修饰的变量属于类变量,可以通过类名.变量名直接引用,而不需要new出一个类来

2、被static修饰的方法属于类方法,可以通过类名.方法名直接引用,而不需要new出一个类来
 */
	public static final Singleton1 INSTANCE =new Singleton1();
	private Singleton1(){
	
	}
}

b、枚举式(最简洁)

/*
 * 枚举类型:表示该类型对象是有限的几个
 * 我们限定一个就是单例
 * 枚举类型构造器全部为私有
 */
public enum Singleton2(){
    INSTANCE
}

c、静态代码块饿汉式(适合复杂实例化)

/*
 * 适合复杂实例化,比如初始化数据
 */
public class Singleton3{
    public static final Singleton3 INSTANCE;
    
    static{
        INSTANCE=new Singleton3();
    }
    
    private Singleton3(){
        
    }
    
}

懒汉式:延迟创建对象:

/*
 * 懒汉式:延迟创建
 * 1.构造器私有化
 * 2.用一个静态变量声明这个唯一的实例
 * 3.提供一个 静态方法来获取这个实例对象
 */
public class Singleton4{
    private static Singleton4 instance;
    private Singleton4(){
        
    }
    public static Singleton4 getInstance(){
        if(instance == null){
            instance=new Singleton4();
        }
        return instance;
    }
}

a、线程不安全(适用于单线程)

b、线程安全(适用于多线程): 加类锁(synchronized(Singleton4.class)) 延迟加载

c、静态内部类形式(适用于多线程)

/*
 *内部类加载被加载时和初始化时,才会进行创建
 *静态内部类不会随着外部类的加载和初始化而初始化。他是要单独和初始化
 *因为实在内部类加载和初始化创建的,所以是线程安全的
 */
public class Singleton5{
    private Singleton5(){
        
    }
    private static class Inner(){
        private static final Singleton5 instance=new Singleton5();
    }
    public static Singleton5 getInstance(){        
        return Inner.instance;
    } 
}

2.类初始化和实例初始化

(1)类初始化过程

​ 1、一个类要创建实例需要先加载并初始化该类

​ a.main方法所在的类需要先加载和初始化

​ 2、一个子类要初始化有先初始化父类

​ 3、一个类初始化就是执行()方法

​ a.()方法由静态类变量显示赋值代码和静态代码块组成

​ b.类变量显示赋值代码和静态代码块依次执行

​ c.该方法只执行一次

2、实例初始化过程

3、方法的重写