【Java面试高频】i++和++i的区别,单例模式的多种实现以及区别,类和实例初始化顺序,不看血亏

1.i++和++i的区别

image-20201026170404151

分为局部变量表和操作数栈

i++和++i的操作是直接修改的是局部变量表中的值

2.单例模式

要点:

  1. 一个类只能有一个实例
    • 私有化构造器
  2. 该单例类必须自主的创建这个实例
    • 该类必须有一个静态变量来保存这个实例
  3. 该类需要自行的向整个系统提供这个实例
    • 直接暴露
    • 调用静态变量的get方法

饿汉式:直接创建出这个类的单例,不管需不需要使用

  • 直接实例化饿汉式(简介直观)
public class Singleton1 {
    //静态变量保存这个类的单例
    public static final Singleton1 INSTANCE = new Singleton1();
    //私有化构造器
    private Singleton1(){

    }
}

  • 枚举式
public enum Singleton2 {
    INSTAANCE
}
  • 静态代码块的方式
/**
 * 使用静态代码块的方式创建单例模式
 */
public class Singleton3 {
    public static final Singleton3 INSTANCE ;
    static {
        INSTANCE = new Singleton3();
    }
    private Singleton3(){
        
    }
}

懒汉式:需要的时候再创建该类的单例,不需要就不创建

  • 线程不安全的方式(适用于单线程的情况)
public class Singleton4 {
    static  Singleton4 INSTANCE;
    private Singleton4(){

    }
    public static Singleton4 getInstance(){
        if (INSTANCE ==null){
            INSTANCE = new Singleton4();
        }
        return INSTANCE;
    }
}
  • 线程安全的方式(适用于多线程的情况)
/**
 * @author 雷雨
 * @date 2020/10/26 18:49
 */
public class Singleton5 {
    static Singleton5 INSTANCE;
    private Singleton5(){

    }
    public static Singleton5 getInstance(){
        //为了效率
        if (INSTANCE ==null){
            //为了线程安全
            synchronized (Singleton5.class){
                if (INSTANCE ==null){
                    INSTANCE = new Singleton5();
                }
            }
        }
        return INSTANCE;
    }
}

3.类初始化顺序

由父及子,静态先行,由上到下

  • 有main方法的类优先初始化,但是如果该类是子类,那需要先初始化其父类
  • 静态分为:静态变量和静态代码块,如果既有静态变量又有静态代码块,那么谁的位置靠上,谁先初始化

类初始化方法就是执行< clinit >()方法

4.实例初始化顺序

实例初始化方法就是执行< init >()方法

  • < init >()方法可能重载有多个,有几个构造器就有几个< init >()方法
  • < init >()方法由非静态实例变量显示赋值代码和非静态代码块,对应构造器代码组成

顺序:

  • 非静态实例变量显示赋值代码和非静态代码块代码从上到下顺序执行,而对应的构造器的代码最后执行
  • 每次创建实例对象,调用对用构造器,执行的就是对应的< init >()方法
  • 除此之外如果该类是子类,那么父类的相关实例初始化先执行

也就是说:

子类的实例初始化方法:

  1. super()
  2. 顺序执行子类的非静态变量显示赋值语句和非静态代码块
  3. 子类的无参构造

影响初始化顺序的还有:重写方法

  • 非静态方法前面有一个默认的对象this
  • this在构造器(< init >()),它表示正在创建的对象,如果此时创建的是子类的对象,那么执行的就是子类的非静态方法

哪些方法不能被重写?

  1. final方法
  2. 静态方法
  3. private等子类中不可见的方法

重写和重载的区别和联系?

重写的要求

  • 方法名
  • 形参列表
  • 返回值类型
  • 抛出的异常
  • 修饰符

时创建的是子类的对象,那么执行的就是子类的非静态方法

哪些方法不能被重写?

  1. final方法
  2. 静态方法
  3. private等子类中不可见的方法

重写和重载的区别和联系?

重写的要求(和下面这些是否有关系,有什么关系,希望读者能够自己也想一想)

  • 方法名
  • 形参列表
  • 返回值类型
  • 抛出的异常
  • 修饰符

我是一名普二本的软件工程专业学生,秋招中拿到了一些offer,但是自己想要冲击一下自己的极限,所以在春招之前再总结一下,给自己补充补充能量,查漏补缺。

如果本文对您有益,强烈建议关注我的专栏或者博客

©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页