static、 静态导入、成员变量的初始化、单例模式、final 常量(Content)、嵌套类、局部类、抽象类、接口、Lambda、方法引用

static

static 常用来修饰类的成员:成员变量、方法、嵌套类

成员变量

  • static修饰:类变量、成员变量、静态字段
    • 在程序中只占用一段固定的内存(存储在方法区),所有对象共享
    • 可以通过实例、类访问 (一般用类名访问和修改,不建议用实例修改),但是不能通过类名访问实例变量和实例方法
  • 没有被static修饰:实例变量
    • 每个实例都有一份内存
package com.hxw.demo4;public class Person {public static  int count = 0;public int age;
}
package com.hxw.demo4;
public class Main {public static void main(String[] args) {Person.count = 20;Person p1 = new Person();p1.age = 20;System.out.println(p1.count);Person p2 = new Person();p2.age = 30;System.out.println(p2.count);}
}

控制台输出

20
20

方法

  • static修饰:类方法、静态方法
    • 可以通过实例、类访问
    • 内部不可以使用this
    • 可以直接访问类变量、类方法
    • 不可以直接访问实例变量和实例方法
  • 没有被static修饰:实例方法
    • 只能通过实例访问,不可以通过类访问
    • 内部可以使用this
    • 可以直接访问实例变量和实例方法
package com.hxw.demo4;public class Person {public static int count = 0;public int age;// 实例方法public void run1(){// 实例方法中可以使用this调用其他实例方法this.run2();//实例方法可以直接访问类变量和类方法System.out.println(count);test1();System.out.println(this.age);}public void run2(){System.out.println("void run2");}public static void test1(){System.out.println("static void test1");test2();System.out.println(count);}public static void test2(){System.out.println("static void test2");}
}
package com.hxw.demo4;public class Main {public static void main(String[] args) {Person person = new Person();person.age = 18;person.run1();Person.test1();}
}

总结:
在这里插入图片描述

静态导入

使用了静态导入之后,就可以省略类名来访问静态成员(成员变量、方法、嵌套类)

在这里插入图片描述

静态导入的经典应用

为了避免每一次都是用Math.PI,可以考虑使用静态导入,其他的Math方法也是一样的道理。
在这里插入图片描述

成员变量的初始化

  • 编译器会自动为未初始化的成员变量设置初始值
  • 如何手动给实例变量提供初始值
    • 在声明中:定义变量的时候直接给其设置初始值
    • 在构造方法中:在构造方法内部利用this进行初始化
    • 在初始化中 :这个情况看下面代码,了解一下,
package com.hxw.dmeo6;public class Person {public static int count;public int age = 1; //申明中public Person(){age = 20;// 在构造方法中,但是先执行初始化中的代码}//在初始化中{age = 18;}
}

一般很少使用初始化代码,方法如下 公共初始化代码一般放到参数最多的构造方法中

package com.hxw.dmeo6;public class Person {public static int count;public int age = 1; //申明中public Person(){this(0, 0);}public Person(int age){this(age, 0);}public Person(int age, int no){// 公共初始化代码一般放到参数最多的构造方法中}//    //在初始化中
//    {
//        age = 18;
//    }
}
  • 如何手动给类变量提供初始值
    • 在声明中
    • 在静态初始化代码块中:当一个类初始化的时候(也就是一个类第一次被主动使用时,JVM会对类进行初始化),就会执行静态初始化代码块,且只会执行一次。
      • 可以有多个静态初始化块,按照在源码中出现的顺序被执行

在这里插入图片描述

初始化块和静态初始化块

这里实际的执行顺序和自己想的不一样,要先初始化完父类,再初始化子类
在这里插入图片描述

单例模式

如果一个类设计为单例模式,那么程序运行过程,这个类只能创建一个实例

  • 饿汉单例模式:一开始就创建了对象
  • 懒汉单例模式:等到该创建对象的时候创建对象,懒汉单例模式会有线程安全问题如果三个对象同时构建实例,那么会创建多个对象,但是最终创建的才会赋值给instance,所以总的说来还是单例模式

Rocket.class

package com.hxw.demo7;/*** 饿汉式单例模式:一上来就new了一个对象*/
//public class Rocket {
//    //私有的静态(唯一内存)实例变量
//    private static Rocket instance = new Rocket();
//
//    // 构造方法私有化 在Main中就不能new Rocket()
//    private Rocket(){
//
//    }
//
//    //公共的静态方法,返回唯一的静态实例
//    public static Rocket getInstance(){
//        return instance;
//    }
//}/*** 懒汉式单例模式*/public class Rocket {public static Rocket instace = null;private Rocket(){}public static Rocket getInstance(){//用到的时候再new对象if(instace == null){instace = new Rocket();}return instace;}
}

Main.class

package com.hxw.demo7;public class Main {public static void main(String[] args) {Rocket r1 = Rocket.getInstance();Rocket r2 = Rocket.getInstance();Rocket r3 = Rocket.getInstance();//r1 r2 r3 都是同一个instanceSystem.out.println(r1 == r2);System.out.println(r2 == r3);}
}

控制台输出

true
true

final和常量

  • final修饰的类不能被继承
  • final修饰的成员方法不能被重写
  • final修饰的变量,只能进行一次赋值,而且需要初始化,如果定义的时候没有初始化,那么在构造函数中一定要初始化

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

常量(Content)

  • 常量的写法: public static final double PI = 3.14159265358979323846;,一般名字全部用大写
  • 如果将基本类型或字符串定义为常量,并且在编译时就能确定值,编译器就会使用常量值代替各处的常量名(类似于C语言的宏替换),这样可以减少访问内存的次数,提高代码运行的效率

嵌套类

内部类(Inner Class,非静态嵌套类)

  • 嵌套类:定义在另一个类中的类
  • 外部类:在嵌套类外层的类
  • 顶级类:最外层的外部类
  • 内部类:没有被static修饰的嵌套类,非静态嵌套类。
    • 跟实例变量、实例方法一样,内部类与外部类的实例相关联**,必须先创建外部类实例,然后再用外部类实例创建内部类实例**。
    • 内部类不能定义除了除编译时常量以外的任何static成员
    • 内部类可以直接访问外部类中的所有成员(即使被申明为static)因为先创建了外部类实例,再创建内部类实例。
    • 外部类可以直接访问内部类实例的成员变量、方法
      外部类、内部类如下
package com.hxw.demo9;public class OuterClass {// 静态嵌套类static class StaticNestedClass {}// 非静态嵌套类(内部类)class InnerClass{}class A{class B{class C{}}}}

在这里插入图片描述
对应的内存图如下
在这里插入图片描述

静态嵌套类

  • 静态嵌套类:被static修饰的嵌套类
  • 静态嵌套类在行为上就是一个顶级类,只是定义的代码写在了另一个类中
  • 对比一般的顶级类,静态嵌套类多了一些特殊权限
    • 可以访问外部类中的成员(即使被申明为static)

在这里插入图片描述
在这里插入图片描述

什么情况使用嵌套类

情况一:如果类A只用在类C内部,可以考虑将类A嵌套到类C内部

  • 封装性更好
  • 程序包更加简化
  • 增强可读性、维护性

情况二:如果类A需要经常访问类C的非公共成员,可以考虑将类A嵌套到类C中

  • 另外也可以根据需要将类A隐藏起来,不对外暴露

情况三:如果需要经常访问非公共的实例成员(而且需要现有外层,后有内层的关系,例如现有公司Company 后有员工Employee),设计成内部类(非静态嵌套类),否则设计成静态嵌套类
- 如果必须现有C实例,才能创建A实例,那么可以将A设计为C的内部类

情况一案例:
在这里插入图片描述
在这里插入图片描述

局部类

  • 局部类:定义在代码块(包含{},可以在里面写代码的块)中的类(可以定义在方法中,for循环中,if语句中)
  • 局部类不能定除编译时常量以外的任何static成员
  • 局部类只能访问final或者有效final(只赋值一次,没有被第二次赋值)的局部变量
  • 局部类可以直接访问外部类的所有成员
    • 局部类只有定义在实例相关的代码块中,才能直接访问外部类中的实例成员(实例变量、实例方法)

由于局部类是定义在代码块中的,所以其作用域也只局限于代码块中,因此,什么时候会用到局部类呢?当一个类是在一个代码块中使用的时候

package com.hxw.demo10;public class Person {static {class A{}}{int age = 10;class A{}}public void test(){for (int i = 0; i < 10; i++) {class A{}}if(true){class A{}}else{class A{}}{class A{}}}
}

在这里插入图片描述

抽象类

抽象方法(Abstract Method)

  • 抽象方法:被abstract修饰的方法
    • 只有方法申明,没有方法实现
    • 不能是private权限(因为定义抽象方法的目的就是为了让子类去实现
    • 只能是实例方法,而不能是类方法
    • 只能定义在抽象类,接口中
package com.hxw.demo11;public abstract class Main {public static void main(String[] args) {}public abstract void test();
}

抽象类

  • 抽象类:被abstract修饰的类
    • 可以定义抽象方法
    • 不能实例化,但是可以自定义构造方法
    • 子类必须实现抽象父类中的所有抽象方法(除非子类也是一个抽象类)
    • 可以向非抽象类一样定义成员变量、常量、嵌套类型、初始化块、非抽象方法等,也就是,抽象类也可以完全不定义抽象方法

常见使用场景

  • 抽取子类的公共实现到抽象父类中,要求子类必须要单独实现的去定义成抽象方法

接口(Interface)

联想到日常笔记本电脑的接口,不同厂商的USB长得都是一样的,这是他们遵守相同的标准

  • API(Application Programming Interface

    • 应用编程接口,提供给开发者调用的一组功能(无需提供源码)
  • java中的接口

    • 一系列方法申明的集合
    • 用来定义规范、标准

抽象类(abstract)是通过子类继承来实现其抽象方法,接口(Interface)是通过其他类实现该接口来实现其抽象方法

家教案例引入接口概念

有一个小孩,需要应聘家教,应聘要求:

  • 会教授编程
  • 会教踢足球
    涉及的人群可能有:在校的学生,在校的老师、出租车司机

首先看没有使用接口:

  • 定义一个孩子类
package com.hxw.demo12;public class Child {private String name;private Student jiajiao;public Child(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Student getJiajiao() {return jiajiao;}public void setJiajiao(Student jiajiao) {this.jiajiao = jiajiao;}public void study(){jiajiao.jiaoBianCheng(this);jiajiao.jiaoZuQiu(this);}}
  • 定义一个学生类
package com.hxw.demo12;public class Student {public void jiaoBianCheng(Child child){System.out.println("Student教" + child.getName() + "编程");}public void jiaoZuQiu(Child child){System.out.println("Student教" + child.getName() + "足球");}}
  • 主函数
package com.hxw.demo12;public class Main {public static void main(String[] args) {Child child = new Child("Jack");child.setJiajiao(new Student());child.study();}
}

如果希望老师教学生的话,按照这种方式就需要再创建一个Teacher类…教课的人身份众多,都需要单独修改Child类中的jiajiao属性,以及本类中的方法,这样很繁琐,但是这些类本质上都是实现了两个方法,招人的要求是满足这两个要求,但是对于这个人其他的特征,其实不用了解。此时,就可以将这两个行为定义到接口当中,各种身份的家教去实现这个接口即可。

  • 创建JiaJiaoable接口,将原来Student中的方法复制过去,并改写为抽象方法。
package com.hxw.demo12;public interface JiaJiaoable {public abstract void jiaoBianCheng(Child child);public abstract void jiaoZuQiu(Child child);
}

Student类、Teacher类分别实现JiaJiaoable接口中的方法

package com.hxw.demo12;public class Student implements JiaJiaoable{@Overridepublic void jiaoBianCheng(Child child) {System.out.println("Student教" + child.getName() + "biancheng");}@Overridepublic void jiaoZuQiu(Child child) {System.out.println("Student教" + child.getName() + "zuqiu");}
}
package com.hxw.demo12;public class Teacher implements JiaJiaoable{@Overridepublic void jiaoBianCheng(Child child) {System.out.println("Teacher教" + child.getName() + "biancheng");}@Overridepublic void jiaoZuQiu(Child child) {System.out.println("Teacher教" + child.getName() + "zuqiu");}
}

修改孩子类的家教属性为借口类型

package com.hxw.demo12;public class Child {private String name;private JiaJiaoable jiajiao;public Child(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}public JiaJiaoable getJiajiao() {return jiajiao;}public void setJiajiao(JiaJiaoable jiajiao) {this.jiajiao = jiajiao;}public void study(){jiajiao.jiaoBianCheng(this);jiajiao.jiaoZuQiu(this);}}

调用Main方法:

package com.hxw.demo12;public class Main {public static void main(String[] args) {Child child = new Child("Jack");child.setJiajiao(new Student());child.study();child.setJiajiao(new Teacher());child.study();}
}

控制台输出

Student教Jackbiancheng
Student教Jackzuqiu
Teacher教Jackbiancheng
Teacher教Jackzuqiu

接口中可以定义的内容

  • 可以定义:抽象方法、常量、嵌套类型,从java8开始定义
    • 上述可以定义的内容都是隐式public的,因此可以省略public关键字
    • 从java9开始可以定义private方法
  • 常量可以省略staticfinal
    • 接口中没有成员变量,写出来就是常量
  • 抽象方法可以省略abstract
  • 不能自定义构造方法、不能定义初始化块、不能实例化

接口的细节

  • 接口名称可以在任何使用类型的地方使用
  • 一个类可以通过implement关键字实现一个或者多个接口
    • 实现接口的类必须接口中定义的所有抽象方法,除非它也是一个抽象类
    • 如果一个类实现的多个接口中有相同的抽象方法,只需要实现此方法一次
    • extendsimplement可以同时使用,但是implements必须写在extends后面
    • 当父类、接口中的方法签名(方法名称和参数列表)一样,那么返回值类型也必须一样

一个接口可以通过extends关键字继承一个或者多个接口

  • 当多个父接口方法签名一样的时候,那么返回值类型也必须一样

定义保姆类

package com.hxw.demo12;public interface BaoMuable {void cook(Child child);
}

学生不仅想应聘家教,也想应聘保姆

package com.hxw.demo12;public class Student implements JiaJiaoable, BaoMuable{@Overridepublic void jiaoBianCheng(Child child) {System.out.println("Student教" + child.getName() + "biancheng");}@Overridepublic void jiaoZuQiu(Child child) {System.out.println("Student教" + child.getName() + "zuqiu");}@Overridepublic void cook(Child child) {}
}

由上述案例,可以看出 一个类可以通过implement关键字实现一个或者多个接口

定义一个Animal类

package com.hxw.demo12.test;public class Animal {public void eat(String name){}
}

定义一个吃东西的接口

package com.hxw.demo12.test;public interface Eatable {void eat(String name);
}

定义了一个小狗类,这个类继承了Animal.class并且实现了Eatable接口

package com.hxw.demo12.test;public class Dog extends Animal implements Eatable{@Overridepublic void eat(String name) {}public static void main(String[] args) {Dog dog = new Dog();dog.eat("bone");}}

抽象类和接口的对比

抽象类和接口的用途有些类似,该如何选择?

抽象类:
1. 继承:A extends D (A 是 D)接口:
2.实现:A implement D(A会D中的行为)
  • 何时选择抽象类
    • 在紧密相关的类之间共享代码(例如人、老师都吃东西)
    • 需要除public以外的访问权限
    • 需要定义实例变量、非finial的静态变量(接口中只能定义常量)
  • 何时选择接口
    • 不相关的类实现相同的方法 (例如人、狗都吃东西)
class Student{public void eat(){// 代码1// 代码2}
}
class Teacher{public void eat(){// 代码1// 代码2}
}
StudentTeacher中的eat()代码一样,就可以将其共享出来,选择抽象类

接口的升级问题

  • 如果接口需要升级,比如增加新的抽象方法
    • 会导致大幅度的代码改动,以前实现的接口类都得改动
  • 若想在不改动以前实现类的前提下进行接口升级,从java8开始有两种方案
    • 默认方法(Default Method):将接口中新增的方法定义为默认方法,默认方法是允许有实现的
    • 静态方法(Static Method)

Lambda

Lambda Expression

  • Lambda 表达式是从java8才开始有的语法。
  • 函数式接口(Funxtional Interface):只包含一个抽象方法的接口
    • 可以在接口上加上@FunctionalInterface注解,表示其是一个函数式接口
  • 当匿名类实现的是函数式接口时, 可以使用Lambda表达式进行简化

函数式接口

Lambda注意事项

  • Lambda只能访问finial或者有效finial的局部变量
  • Lambda没有引入新的作用域

定义一个OuterClass

package com.hxw.demo13;public class OuterClass {private int age = 1;public class InnerClass{private int age = 2;void inner(){Testable t = v -> {System.out.println(v);System.out.println(age);System.out.println(this.age);System.out.println(InnerClass.this.age);System.out.println(OuterClass.this.age);};t.test(3);}}public static void main(String[] args) {new OuterClass().new InnerClass().inner();}
}

方法引用

  • 如果Lambda中的内容仅仅是调用这个方法,可以使用方法引用(method Reference)来简化

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/56851.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenHarmony(1)开发环境搭建

一&#xff1a;开源项目 OpenHarmony是由开放原子开源基金会&#xff08;OpenAtom Foundation&#xff09;孵化及运营的开源项目&#xff0c;目标是面向全场景、全连接、全智能时代&#xff0c;基于开源的方式&#xff0c;搭建一个智能终端设备操作系统的框架和平台&#xff0…

使用SQL在PostGIS中创建各种空间数据

#1024程序员节&#xff5c;征文# 一、目录 1. 概述 2. 几何&#xff08;Geometry&#xff09;类型 创建点 创建线 创建面 3. 地理&#xff08;Geography&#xff09;类型 地理点&#xff08;GEOGRAPHY POINT&#xff09; 地理线串&#xff08;GEOGRAPHY LINESTRING&#xff…

Redis 单机、主从、哨兵和集群架构详解和搭建

目录 前言 单机部署 检查安装 gcc 环境 下载安装 Redis 启动 Redis 关闭 Redis 配置Redis 主从部署 整体架构图 主从复制配置 重启 Redis 验证 主从复制的作⽤ 主从复制缺点 哨兵部署&#xff08;Sentinel&#xff09; 整体架构图 哨兵模式配置 启动哨兵 验证…

MySQL-32.索引-操作语法

一.语法 二.代码实现 指定某个字段为主键&#xff0c;其实就是建立一个主键索引。而指定某个字段唯一&#xff0c;就是建立一个唯一索引。 -- 索引 -- 创建&#xff1a;为tb_emp表的name字段建立一个索引 create index idx_emp_name on tb_emp(name);-- 查询&#xff1a;查…

【智能大数据分析 | 实验四】Spark实验:Spark Streaming

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈智能大数据分析 ⌋ ⌋ ⌋ 智能大数据分析是指利用先进的技术和算法对大规模数据进行深入分析和挖掘&#xff0c;以提取有价值的信息和洞察。它结合了大数据技术、人工智能&#xff08;AI&#xff09;、机器学习&#xff08;ML&a…

基于java的山区环境监督管理系统(源码+定制+开发)环境数据可视化、环境数据监测、 环境保护管理 、污染防治监测系统 大数据分析

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

《Python游戏编程入门》注-第3章3

《Python游戏编程入门》的“3.2.4 Mad Lib”中介绍了一个名为“Mad Lib”游戏的编写方法。 1 游戏玩法 “Mad Lib”游戏由玩家根据提示输入一些信息&#xff0c;例如男人姓名、女人姓名、喜欢的食物以及太空船的名字等。游戏根据玩家输入的信息编写出一个故事&#xff0c;如图…

Postgresql 配置数据库表添加主键自增id

#1024程序员节&#xff5c;征文# 在 PostgreSQL 数据库中&#xff0c;如果你想创建一个自增的 ID 字段&#xff0c;通常会使用序列&#xff08;sequence&#xff09;配合默认值或者使用带有自动递增特性的 SERIAL 类型。以下是两种常见的方法来实现自增 ID&#xff1a; 使用 …

图论BFS

 D1. The Endspeaker (Easy Version) time limit per test 2 seconds memory limit per test 256 megabytes  This is the easy version of this problem. The only difference is that you only need to output the minimum total cost of operations in t…

Docker 部署 Jaeger

Jaeger 的主要作用如下&#xff1a; 分布式追踪 Jaeger 是一个开源的分布式追踪系统&#xff0c;用于监控和排查微服务架构中的复杂问题。它可以跟踪请求在不同服务之间的传播路径&#xff0c;帮助开发者理解系统中各个组件之间的调用关系。 性能分析 通过收集和分析请求的执行…

基于Gin和GORM的在线判题系统后端

项目地址&#xff1a;基于Gin和GORM的在线判题系统后端 一、开发环境与API测试工具 开发环境 Go1.23,VSCode,Gin框架&#xff0c;GORM框架 gin-swagger swagger是一个用于描述和文档化 RESTful API 的开源工具&#xff0c;它可以帮助开发者生成交互式文档&#xff0c;并且…

【C++】—— 模板进阶

【C】—— 模板进阶 1 非类型模板参数1.1 什么是非类型模板参数1.2 非类型模板参数对比宏的优势1.3 array 简单了解 2 模板的特化2.1 引子2.2 函数模板特化2.3 函数模板特化的坑2.4 类模板的特化2.4.1 全特化2.4.2 偏特化&#xff08;半特化&#xff09;2.4.3 选择2.4.4 偏特化…

Conda 安装与使用指南

Conda 是一个开源的软件包管理和环境管理系统&#xff0c;主要解决一个系统上同时要使用python2&#xff0c;python3等等多个python环境的切换问题&#xff0c;支持多种编程语言&#xff08;如 Python、R 等&#xff09;&#xff0c;可以在 Windows、macOS 和 Linux 上运行。它…

Java最全面试题->Java基础面试题->JavaEE面试题->Web应用服务器面试题

文章目录 Web应用服务器面试题Tomcat是什么?Tomcat缺省端口是多少&#xff0c;如何修改&#xff1f;Tomcat 有那几种Connector 运行模式&#xff1f;什么是Servlet&#xff1f;Servlet请求过程&#xff1f;Tomcat执行流程&#xff1f;Tomcat部署方式?什么是JBoss ?在JBoss 7…

C++的const关键字

在 C 中&#xff0c;const 关键字用于声明常量&#xff0c;表示某个变量或对象的值在初始化后不可改变。const 可以应用于多种上下文&#xff0c;包括变量、函数参数、成员函数和指针等。下面详细介绍 const 的各种用法&#xff1a; 1. 常量变量 const 可以用来声明常量变量&…

FPGA搭建PCIE3.0通信架构简单读写测试,基于XDMA中断模式,提供3套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的PCIE方案本博客方案的PCIE2.0版本 3、PCIE基础知识4、工程详细设计方案工程设计原理框图XDMA配置及使用XDMA中断模块数据缓存架构用户逻辑Windows版本XDMA驱动安装Linux版本XDMA驱动安装测试应用程序工程源码架构PCIE上板…

ICM20948 DMP代码详解(100)

接前一篇文章:ICM20948 DMP代码详解(99) 上一回解析到inv_set_hw_smplrt_dmp_odrs函数的以下代码片段: // switch between low power and low noise at 500Hz boundaryif (minDly != 0xFFFF) {// above 500Hz boundary, force LN modeif (minDly==1) {if (s->base_state…

实测体验Claude 3.5升级版:AI首次实现直接操控电脑!

前言 就在10月22日晚上&#xff0c;Anthropic发布重大升级&#xff0c;发布Claude 3.5 Sonnet和Claude 3.5 Haiku新版本。 新的 Claude 3.5 Sonnet 在所有指标上都优于其他模型&#xff0c;包括 OpenAI 的 GPT-4 和谷歌的 Gemini 1.5 Pro。 Claude 3.5 Haiku 与之前的顶级 C…

【C++开篇】

首先初阶的数据结构相信大家已经学习的差不多了&#xff0c;关于初阶数据结构排序的相关内容的总结随后我也会给大家分享出来。C语言和C有许多相同的地方&#xff0c;但也有许多不相同的地方。接下来的C部分&#xff0c;我们主要是针对C与C语言不同的地方来与大家进行分享。其中…

gin入门教程(7): 使用 Logrus + Lumberjack 创建日志中间件

结合 Logrus 和 Lumberjack&#xff0c;可以创建一个高效的日志中间件&#xff0c;用于记录请求和响应。以下是实现步骤&#xff1a; 1. 安装依赖 首先&#xff0c;确保安装了 Logrus 和 Lumberjack&#xff1a; go get github.com/sirupsen/logrus go get gopkg.in/natefin…