ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java类初始化、实例初始化、方法重写、重载

2022-06-18 17:36:17  阅读:146  来源: 互联网

标签:初始化 java 子类 Father System Son println 重载


一、类的初始化

1、类的初始化如何触发

  a、new一个类的实例对象之前,需要进行类加载和初始化;

  b、访问类的静态变量或者对类的静态变量进行赋值;

  c、类的静态方法的调用;

  d、使用反射机制进行上面1、2、3的操作;

  e、main()方法所在的类需要先加载和初始化;

  f、子类进行加载和初始化之前需要对父类进行加载和初始化;

  g、jdk1.7中的动态语言执行过程。

2、类的初始化过程

  a、类的初始化其实就是对<clinit>方法的执行

  b、<clinit>由类的静态变量显示赋值代码(静态方法的调用)和静态代码块组成,按顺序执行

  c、<clinit>方法在类的初始化过程中只执行一次

3、类的初始代码演示

  a、父类代码

public class Father {
    private int i = test();
    private static int j = method();

    static {
        System.out.println("Father 1");
    }
    public Father() {
        System.out.println("Father 2");
    }
    {
        System.out.println("Father 3");
    }

    public int test(){
        System.out.println("Father 4");
        return 1;
    }
    public static int method(){
        System.out.println("Father 5");
        return 1;
    }
}

  b、子类代码

public class Son extends Father {

    private int i = test();
    private static int j = method();

    static {
        System.out.println("Son 6");
    }

    public Son() {
        System.out.println("Son 7");
    }
    {
        System.out.println("Son 8");
    }

    public int test(){
        System.out.println("Son 9");
        return 1;
    }
    public static int method(){
        System.out.println("Son 10");
        return 1;
    }

    public static void main(String[] args) {
        
    }
}

  c、子类Son中的main方法直接调用运行,子类的初始化之前要先执行父类的初始化

    ①、Father类初始化【执行Father类中的静态变量显示赋值代码及静态代码块】

    ②、子类初始化【执行Son类中的静态变量显示赋值代码及静态代码块】

  d、执行结果如下

Father 5
Father 1
Son 10
Son 6

二、对象的实例化

  1、对象的实例化方式

    ①、new关键字创建对象;

    ②、工厂方法返回对象:String str = String.valueOf(23);

    ③、通过反射方法创建对象,Clazz.newInstance();

    ④、通过对象的clone()方法克隆,对象实例中的成员变量为引用类型时为浅拷贝;

    ⑤、通过I/O流创建对象,如运用反序列化手段,调用java.io.ObjectInputStream对象的 readObject()方法。

  2、对象的实例化过程

    ①、对象的实例化过程,其实就是<init>()方法的执行,类中有多少个构造器,就有多少个<init>()方法的重载;

    ②、<init>由非静态成员变量的显示赋值代码、非静态代码块、构造函数组成,按从上到下的顺序执行,其中构造函数最后执行

    ③、<init>()的方法首行是super()或者super(参数),即父类的<init>()方法;

    ④、每创建一个对象就会调用一次<init>方法;

  3、this关键字的特殊性

    遇到this关键字(也就是构造函数调用自身其他的构造函数时)不插入构造代码块(构造代码块的出现就是为了提取构造函数的共同量,减少各个构造函数的代码而产生的);

    子类中对父类方法进行了重写,进行子类对象实例创建的时候,非静态方法的默认对象是this(即正在创建的子类对象实例),所以在父类非静态成员变量的显示赋值代码中调用的是子类重写之后的方法。如下运行结果所示:Son 9打印了两次。

  4、对象的实例化过程代码演示

public static void main(String[] args) throws Exception {
        Son son1 = new Son();
        System.out.println("---------");
        Son son2 = new Son();
    }

  代码执行结果:

Father 5
Father 1
Son 10
Son 6
Son 9
Father 3
Father 2
Son 9
Son 8
Son 7
---------
Son 9
Father 3
Father 2
Son 9
Son 8
Son 7

三、方法的重写

  final、private、static修饰的方法不可被子类重写;

  对象的多态性:子类重写父类方法,子类对象调用的是子类重写后的方法。

四、方法的重载

  同一个类中,方法名相同,但是方法的参数列表不一致(参数类型、参数个数、参数排列顺序),与方法的返回值无关。 

标签:初始化,java,子类,Father,System,Son,println,重载
来源: https://www.cnblogs.com/8593l/p/16388793.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有