Java函数知识点大全(二)

简介: 教程来源 https://www.xcfsr.cn/category/software-dev.html 本节详解Java核心编程技术:递归(含阶乘、斐波那契、汉诺塔等经典案例及尾递归、记忆化优化)、静态方法(工具类、工厂模式、单例实现)与实例方法(this用法、链式调用)。内容精炼实用,适合深入理解面向对象编程精髓。

四、递归

4.1 递归概念
递归:方法调用自身的一种编程技巧,用于解决可以分解为相同子问题的问题。
递归要素:
基线条件:停止递归的条件
递归条件:调用自身的条件

4.2 经典递归示例

public class RecursionDemo {

    // 1. 阶乘
    public long factorial(int n) {
        // 基线条件
        if (n <= 1) {
            return 1;
        }
        // 递归条件
        return n * factorial(n - 1);
    }

    // 2. 斐波那契数列
    public long fibonacci(int n) {
        if (n <= 1) {
            return n;
        }
        return fibonacci(n - 1) + fibonacci(n - 2);
    }

    // 3. 汉诺塔
    public void hanoi(int n, char from, char to, char aux) {
        if (n == 1) {
            System.out.println("移动盘子 1 从 " + from + " 到 " + to);
            return;
        }
        hanoi(n - 1, from, aux, to);
        System.out.println("移动盘子 " + n + " 从 " + from + " 到 " + to);
        hanoi(n - 1, aux, to, from);
    }

    // 4. 二分查找(递归实现)
    public int binarySearch(int[] arr, int target, int left, int right) {
        if (left > right) {
            return -1;
        }

        int mid = left + (right - left) / 2;

        if (arr[mid] == target) {
            return mid;
        } else if (arr[mid] > target) {
            return binarySearch(arr, target, left, mid - 1);
        } else {
            return binarySearch(arr, target, mid + 1, right);
        }
    }

    // 5. 目录遍历
    public void listFiles(File dir, int level) {
        File[] files = dir.listFiles();
        if (files == null) return;

        String indent = "  ".repeat(level);
        for (File file : files) {
            System.out.println(indent + file.getName());
            if (file.isDirectory()) {
                listFiles(file, level + 1);
            }
        }
    }
}

4.3 递归优化:尾递归与记忆化

public class RecursionOptimization {

    // 1. 尾递归优化(Java未原生支持,但可改写)
    public long factorialTailRec(int n, long accumulator) {
        if (n <= 1) {
            return accumulator;
        }
        return factorialTailRec(n - 1, n * accumulator);
    }

    // 2. 记忆化递归(缓存中间结果)
    private Map<Integer, Long> memo = new HashMap<>();

    public long fibonacciMemo(int n) {
        if (n <= 1) return n;

        if (memo.containsKey(n)) {
            return memo.get(n);
        }

        long result = fibonacciMemo(n - 1) + fibonacciMemo(n - 2);
        memo.put(n, result);
        return result;
    }

    // 3. 递归转迭代
    public long fibonacciIterative(int n) {
        if (n <= 1) return n;

        long prev2 = 0, prev1 = 1;
        for (int i = 2; i <= n; i++) {
            long current = prev1 + prev2;
            prev2 = prev1;
            prev1 = current;
        }
        return prev1;
    }
}

五、静态方法

5.1 静态方法特性

public class StaticMethodDemo {

    private int instanceVar = 10;
    private static int staticVar = 20;

    // 静态方法
    public static void staticMethod() {
        // 可以访问静态变量
        System.out.println(staticVar);

        // 不能直接访问实例变量(需要对象)
        // System.out.println(instanceVar);  // 编译错误

        // 可以调用其他静态方法
        anotherStaticMethod();

        // 不能直接调用实例方法
        // instanceMethod();  // 编译错误
    }

    public static void anotherStaticMethod() {
        System.out.println("另一个静态方法");
    }

    // 实例方法
    public void instanceMethod() {
        // 可以访问静态变量
        System.out.println(staticVar);

        // 可以访问实例变量
        System.out.println(instanceVar);

        // 可以调用静态方法
        staticMethod();

        // 可以调用其他实例方法
        anotherInstanceMethod();
    }

    public void anotherInstanceMethod() {
        System.out.println("另一个实例方法");
    }

    // 静态代码块(类加载时执行)
    static {
        System.out.println("静态代码块执行");
        staticVar = 100;
    }
}

5.2 静态方法的使用场景

public class StaticMethodUsage {

    // 1. 工具方法
    public static class MathUtils {
        public static int max(int a, int b) {
            return a > b ? a : b;
        }

        public static boolean isEven(int num) {
            return num % 2 == 0;
        }
    }

    // 2. 工厂方法
    public static class Person {
        private String name;
        private int age;

        private Person(String name, int age) {
            this.name = name;
            this.age = age;
        }

        public static Person of(String name, int age) {
            return new Person(name, age);
        }

        public static Person fromMap(Map<String, Object> map) {
            return new Person(
                (String) map.get("name"),
                (Integer) map.get("age")
            );
        }
    }

    // 3. 单例模式
    public static class Singleton {
        private static Singleton instance;

        private Singleton() {}

        public static Singleton getInstance() {
            if (instance == null) {
                instance = new Singleton();
            }
            return instance;
        }
    }

    // 4. main方法
    public static void main(String[] args) {
        int max = MathUtils.max(10, 20);
        Person person = Person.of("张三", 25);
    }
}

六、实例方法

6.1 实例方法特性

public class InstanceMethodDemo {

    private String name;
    private static int count;

    public InstanceMethodDemo(String name) {
        this.name = name;
        count++;
    }

    // 实例方法可以访问实例变量和静态变量
    public String getName() {
        return this.name;  // 可以使用this
    }

    public void setName(String name) {
        this.name = name;  // this区分成员变量和参数
    }

    // 实例方法可以调用其他实例方法和静态方法
    public void doSomething() {
        System.out.println(getName());  // 调用实例方法
        System.out.println(getCount()); // 调用静态方法
        helper();                       // 调用私有实例方法
    }

    private void helper() {
        System.out.println("私有辅助方法");
    }

    public static int getCount() {
        return count;
    }
}

6.2 this关键字

public class ThisDemo {

    private String name;
    private int age;

    // 1. 区分成员变量和参数
    public ThisDemo(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // 2. 调用本类的其他构造器
    public ThisDemo(String name) {
        this(name, 0);  // 调用上面的构造器
    }

    // 3. 返回当前对象(链式调用)
    public ThisDemo setName(String name) {
        this.name = name;
        return this;
    }

    public ThisDemo setAge(int age) {
        this.age = age;
        return this;
    }

    // 链式调用示例
    public void demo() {
        ThisDemo demo = new ThisDemo("初始")
            .setName("新名字")
            .setAge(25);
    }

    // 4. 将当前对象作为参数传递
    public void register() {
        Registry.add(this);  // 将当前对象传入
    }

    // 5. 内部类中访问外部类实例
    class Inner {
        public void display() {
            // 访问外部类的this
            System.out.println(ThisDemo.this.name);
        }
    }
}

来源:
https://www.xcfsr.cn/

相关文章
|
7月前
|
算法 编译器 C语言
C语言函数知识点大全(一)
教程来源 https://www.xcfsr.cn/category/cloud.html 本文系统讲解C语言函数核心知识:从基础语法(定义、声明、调用)、参数传递(值传/指针传、数组与可变参数),到返回值处理(基本类型、指针、结构体、void),涵盖库函数、递归及模块化设计思想,助力初学者构建完整知识体系,也为进阶开发者提供实用参考。
|
7月前
|
人工智能 监控 Shell
当 AI Agent 接管手机:移动端如何进行观测
本文探讨AI Agent自动化操作引发的移动端数据污染问题及检测方案,重点解析无障碍服务全控能力、注入事件特征及ADB连接状态的判定逻辑,为应对AI操作带来的数据失真提供技术监测框架。
1049 57
|
7月前
|
Java API
Java函数知识点大全(四)
教程来源 https://dnuhf.cn/ 本文系统讲解Java函数式编程核心:Lambda表达式(含语法、方法引用四种形式)、常用函数式接口(Predicate/Function/Consumer等)、Stream API(中间/终端操作、分组聚合)、异常处理技巧及方法设计最佳实践,涵盖从基础到高级的完整知识体系。
|
7月前
|
Java
Java函数知识点大全(三)
教程来源 https://ljtgc.cn/ 本文系统讲解Java面向对象核心机制:构造方法(含无参、有参、私有、拷贝及构造器链)、方法重写规则与@Override注解、抽象类与接口方法(含默认/静态/私有方法)及函数式接口,辅以典型代码示例,助你深入掌握Java OOP精髓。
|
4月前
|
canal 关系型数据库 MySQL
MySQL LIKE查询太慢?手把手搭建Elasticsearch站内搜索
本文详解MySQL模糊搜索性能瓶颈及Elasticsearch全文检索解决方案:剖析`LIKE &#39;%关键词%&#39;`全表扫描原理,对比MySQL全文索引局限,深入讲解倒排索引机制,并实战演示Logstash/Canal数据同步、IK中文分词、高亮搜索等核心环节,助你构建毫秒级站内搜索。(239字)
|
6月前
|
安全 Devops 持续交付
【微服务与云原生架构】DevOps、CI/CD流水线、GitOps 系统性知识体系
本文构建了微服务与云原生架构下DevOps、CI/CD、GitOps的系统性知识体系,以层级化、全链路、可落地为纲,厘清云原生理念、微服务范式、DevOps文化、CI/CD自动化及GitOps声明式管控的定位与协同关系,覆盖架构设计、工程实践、工具选型与演进趋势,助力企业高效、安全、规模化落地云原生。
|
6月前
|
数据采集 缓存 安全
【HTTP】HTTP协议核心体系:请求方法与状态码全结构化解析(附《思维导图》)
本文系统解析HTTP/1.1请求方法与状态码:厘清安全/幂等本质,详解9种方法语义、约束与误区;全覆盖状态码全分类(1xx/2xx/3xx/4xx/5xx核心场景)的定义、场景及关键区分(如301/308、401/403、502/504);强调RESTful实践与高频红线,助力构建健壮、规范的Web服务。
|
6月前
|
存储 缓存 NoSQL
CAS 无锁并发深度解析:从 CPU 原语、JDK 源码到生产实战与避坑指南
本文深度解析Java中CAS(Compare-And-Swap)无锁并发机制:从CPU底层LOCK+CMPXCHG指令、JDK 17源码(Unsafe/VarHandle)、原子类实现,到ABA、自旋飙升、伪共享等五大生产陷阱及避坑方案,并附3个实战案例。助你真正吃透CAS核心逻辑与最佳实践。
428 3

热门文章

最新文章