• (四)递归、可变参数、访问修饰符、理解 main 方法、代码块


    一、递归(P215)(蒙蔽,有时间再看下)

    1. 方法递归调用

    递归重要规则
    (1)执行一个方法时,就创建一个新的受保护的独立空间(栈空间)
    (2)方法的局部变量是独立的,不会相互影响,比如 n 变量
    (3)如果方法中使用的是引用类型变量(比如数组,对象),就会共享该引用类型的数据
    (4)递归必须向退出递归的条件逼近,否则就是无限递归,出现 StackOverflowError
    (5)当一个方法执行完毕,或者遇到return,就会返回,遵守谁调用,就将结果返回给谁,同时当方法执行完毕或者返回时,该方法也就执行完毕。

    举例说明:

    (1)猴子吃桃        P221

    (2)老鼠迷宫        P222

    (3)汉诺塔        P226

    二、可变参数

    (1)基本概念
    java允许将同一个类中多个同名、同功能参数个数不同的方法,封装成一个方法。
    (2)基本语法
    访问修饰符 返回类型 方法名(数据类型... 形参名){

    }

    1. // 可变参数,可以当做数组使用
    2. public int sum(int... nums) {
    3. int sum = 0;
    4. for (int i = 0; i < nums.length; i++) {
    5. sum += nums[i];
    6. }
    7. return sum;
    8. }

    注意事项和使用细节

    1)可变参数的实参可以为0个或任意多个。
    2)可变参数的实参可以为数组
    3)可变参数的本质就是数组
    4)可变参数可以和普通类型的参数一起放在形参列表,但必须保证可变参数在最后
    5)一个形参列表中只能出现一个可变参数

    三、访问修饰符(P279)

    1. 基本介绍

    java提供四种访问控制修饰符号,用于控制方法和属性(成员变量)的访问权限(范围):
    (1)公开级别:用 public 修饰,对外公开
    (2)受保护级别:用 protected 修饰,对子类和同一个包中的类公开
    (3)默认级别:没有修饰符号,向同一个包的类公开
    (4)私有级别:用private修饰,只有类本身可以访问,不对外公开

    四、理解 main 方法(P383)

    (1)main 方法是虚拟机调用
    (2)java虚拟机需要调用类的 main() 方法,所以该方法的访问权限必须是public
    (3)java虚拟机在执行 main() 方法时不必创建对象,所以该方法必须是static
    (4)该方法接收String类型的数组参数,该数组中保存执行java命令时传递给所运行的类的参数 
    (5)Java 执行的程序 参数1 参数2 参数3

    五、代码块(P386)

    代码块又称为初始化块,属于类中的成员【即是类的一部分】,类似于方法,将逻辑语句封装在方法体中,通过{}包围起来。

    但和方法不同,没有方法名,没有返回,没有参数,只有方法体,而且不用通过对象或
    类显式调用,而是加载类时,或创建对象时隐式调用。

    1. 基本语法

    [ 修饰符 ]{
            代码

    };
    注意:
    (1)修饰符可选,要写的话,也只能写 static
    (2)代码块分为两类,使用 static 修饰的叫静态代码块,没有 static 修饰的,叫普通代码块。
    (3)逻辑语句可以为任何逻辑语句(输入、输出、方法调用、循环、判断等)

    2. 优点

    (1)相当于另外一种形式的构造器(对构造器的补充机制),可以做初始化的操作
    (2)场景:如果多个构造器中都有重复的语句,可以抽取到初始化块中,提高代码的重用

    (3)代码块优先构造器执行

    3. 静态代码块

    (1)static代码块 也叫 静态代码块,作用就是对类进行初始化,而且它随着类的加载而执行,并且只会执行一次。如果是普通代码块,每创建一个对象,就执行。

    (2)类什么时候被加载

    ① 创建对象实例时(new)

    ② 创建子类对象实例,父类也会被加载

    ③ 使用类的静态成员时(静态属性,静态方法)

    (3)普通的代码块,在创建对象实例时,会被隐式的调用。被创建一次,就会调用一次。

    如果只是使用类的静态成员时,普通代码块并不会执行。

    (4)创建一个对象时,在一个类调用顺序是:

    ① 调用静态代码块和静态属性初始化(注意:静态代码块和静态属性初始化调用的优先级一样,如果有多个静态代码块和多个静态变量初始化,则按他们定义的顺序调用)

    ② 调用普通代码块和普通属性的初始化(注意:普通代码块和普通属性初始化调用的优先级一样,如果有多个普通代码块和多个普通属性初始化,则按定义顺序调用)

    ③ 调用构造方法

    (5)构造器的最前面其实隐含了 super() 和调用普通代码块。静态相关的代码块,属性初始化,在类加载时,就执行完毕。因此是优先于构造器和普通代码块执行的

    (6)继承关系的调用顺序

    ① 父类的静态代码块和静态属性

    ② 子类的静态代码块和静态属性

    ③ 父类的普通代码块和普通属性初始化

    ④ 父类的构造方法

    ⑤ 子类的普通代码块和普通属性初始化

    ⑥ 子类的构造方法

    (7)静态代码块只能直接调用静态成员(静态属性和静态方法),普通代码块可以调
    用任意成员。

  • 相关阅读:
    linux内核分析:docker与隔离
    nginx——不同前端项目共用一个端口
    Java如何使用反射创建动态代理(JDK原生)呢?
    优秀案例 | 以虚拟人IP“科普熊猫”,为2023成都市全国科普日注入新活力
    RPA在财务预测和分析中的应用
    cicids2017数据集训练
    LCM Sum (hard version)(树状数组,筛因子)
    07. 算法之一致性哈希算法介绍
    微信小程序开发学习——顺序、选择、循环、数学函数
    【SpringBoot整合NoSql】-----MongoDB篇
  • 原文地址:https://blog.csdn.net/yirenyuan/article/details/125686621