天天看点

第一季:3类和实例初始化【Java面试题】

第一季:3类和实例初始化【Java面试题】

  • ​​前言​​
  • ​​推荐​​
  • ​​第一季:3类和实例初始化​​
  • ​​题目​​
  • ​​运行结果​​
  • ​​考点?​​
  • ​​类初始化过程​​
  • ​​实例初始化过程​​
  • ​​方法的重写Override​​
  • ​​分析​​
  • ​​进阶要求:​​
  • ​​最后​​

前言

2022 9/30 10:48

路漫漫其修远兮,吾将上下而求索

本文是根据尚硅谷学习所做笔记

仅供学习交流使用,转载注明出处

第一季:3类和实例初始化

题目

第一季:3类和实例初始化【Java面试题】

运行结果

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

(5)(1)(10)(6)(9)(3)(2)(9)(8)(7)
(9)(3)(2)(9)(8)(7)      

考点?

  • 类初始化过程
  • 实例初始化过程
  • 方法的重写

类初始化过程

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

  • main方法所在的类需要先加载和初始化
//(5)(1)(10)(6)
    public static void main(String[]args){
//        Son s1=new Son();
//        System.out.println();
//        Son s2=new Son();

    }      

②一个子类要初始化需要先初始化父类

③ 一个类初始化就是执行< clinit>方法

  • < clinit>()方法由静态类变量显示赋值代码和静态代码块组成
  • 类变量显示赋值代码和静态代码块代码从上到下顺序执行
  • < clinit>()方法只执行一次

实例初始化过程

①实例初始化就是执行()方法

  • < init>()方法可能重载有多个,有几个构造器就有几个< init>方法
  • < init>()方法由非静态实例变量显示赋值代码和非静态代码块、对应构造器代码组成
  • 非静态实例变量显示赋值代码和非静态代码块代码从上到下顺序执行,而对应构造器的代码最后执行
  • 每次创建实例对象,调用对应构造器,执行的就是对应的< init>方法
  • < init>方法的首行是super()或super(实参列表),即对应父类的< init>方法

方法的重写Override

①哪些方法不可以被重写

  • final方法
  • 静态方法
  • private等子类中不可见方法

②对象的多态性

  • 子类如果重写了父类的方法,通过子类对象调用的一定是子类重写过的代码
  • 非静态方法默认的调用对象是this
  • this对象在构造器或者说< init>方法中就是正在创建的对象

分析

package test3;

/**
 * 父类的初始化<clint>:
 * (1) j = method()
 * (2) 父类的静态代码块
 * 父类的实例化方法:
 * (1) super(最前)
 * (2) i=test()   (9)
 * (3) 父类的非静态代码块  (3)
 * (4) 父类的无参构造(最后) (2)
 *
 * 非静态方法前其实有一个默认的对象this
 * this在构造器(或<init>)它表示的是正在创建的对象,因为这里是创建Son对象,所以
 * test()执行的是子类重写的代码(面向对象多态)
 *
 * 这里i=test()执行的是子类重写的test()方法
*/
public class Father {
    private int i = test();
    private static int j = method();

    static {
        System.out.print("(1)");
    }

    Father() {
        System.out.print("(2)");
    }

    {
        System.out.print("(3)");
    }

    public int test() {
        System.out.print("(4)");
        return 1;
    }

    public static int method() {
        System.out.print("(5)");
        return 1;
    }
}      
package test3;

/**
 *
 * 初始化子类<clint>
 *  (1)j = method()
 *  (2)子类的静态代码块
 *
 * 先初始化父类:(5)(1)
 * 初始化子类:  (10)(6)
 *
 * 子类的实例化方法<init>:
 * (1) super(最前)  (9) (3) (2)
 * (2) i=test()     (9)
 * (3) 子类的非静态代码块  (8)
 * (4) 子类的无参构造(最后)  (7)
 *
 * 因为创建了两个Son对象,因此实例化方法<init>执行两次
 * (9) (3) (2)  (9) (8) (7)
 */
public class Son extends Father {
    private int i = test();
    private static int j = method();

    static {
        System.out.print("(6)");
    }


    Son() {
//        super();//写或不写都在,在子类构造器之间一定会调用父类的构造器
        System.out.print("(7)");
    }

    {
        System.out.print("(8)");
    }

    public int test() {
        System.out.print("(9)");
        return 1;
    }

    public static int method(){
        System.out.print("(10)");
        return 1;

    }
    public static void main(String[]args){
        Son s1=new Son();
        System.out.println();
        Son s2=new Son();

    }
}      

进阶要求:

  • Override和Overload的区别?
  • Override重写的要求?
  • 方法名
  • 形参列表
  • 返回值类型
  • 抛出的异常列表
  • 修饰符
  • 了解《JVM虚拟机规范》中关于和方法的说明、invokespecial指令

最后

2022 9/30 11:52