【Java基础】泛型+反射+枚举+Lambda表达式 知识点总结

news2024/12/22 17:15:39

【大家好,我是爱干饭的猿,本文重点介绍Java基础:泛型、反射、枚举、Lambda表达式知识点总结。

后续会继续分享其他重要知识点总结,如果喜欢这篇文章,点个赞👍,关注一下吧】

上一篇文章:《【web】Java虚拟机(JVM)(重点:JVM 执行流程&垃圾回收相关算法)》


🤞目录🤞

💳1. 泛型

1.1 什么是泛型?

1.2 泛型类和泛型方法

1.3 extends类型边界

1.4 类型擦除

1.5 通配符

1. 通配符-上界

2. 通配符-下界

💳2. 反射

2.1 定义

2.2 用途 

2.3 反射基本信息

2.4 反射相关的类

1. Class类(反射机制的起源 ) 和 Class类中的相关方法

2. 反射示例(使用)

2.5 反射优点和缺点

💳3. 枚举

3.1 背景及定义

3.2 使用

3.3 枚举优点缺点

3.4 枚举是否可以通过反射,拿到实例对象呢?

💳4. Lambda 表达式

4.1 背景

1. Lambda表达式的语法

2. 函数式接口

4.2 Lambda表达式的基本使用

4.3 Lambda在集合当中的使用

4.4 优点和缺点


 

💳1. 泛型

1.1 什么是泛型?

作用参数校验,将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参)然后在使用/调用时传入具体的类型(类型实参)。

也就是说在泛型使用过程中,操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。

为什么会增加泛型机制呢?

  • 对于集合的使用更为规范。
  • 使用了泛型就解决了元素不确定性。

1.2 泛型类和泛型方法

泛型类:就是一个具有多种类型变量的类。

泛型方法:就是在调用方法的时候指明泛型的具体类型 。

一个最普通的泛型类:

public class Test {
    public static void main(String[] args) {
        IMessage<String> message = new MessageImpl1<String>();
        message.printMsg("123");
        IMessage message1 = new MessageImpl2();
        message1.printMsg(123);
    }
}

interface IMessage<T> {
    // 泛型方法
    <T> void printMsg(T t);
}

class MessageImpl1<T> implements IMessage<T> {

    @Override
    public <T1> void printMsg(T1 t1) {
        System.out.println(t1);
        System.out.println("是泛型类");
    }
}

class MessageImpl2<Integer> implements IMessage<Integer> {

    @Override
    public <T> void printMsg(T t) {
        System.out.println(t);
        System.out.println("是普通类");
    }
}

1.3 extends类型边界

在定义泛型类时,有时需要对传入的类型变量做一定的约束,可以通过类型边界来约束。泛型的限定符extends限定符,就是字面意思,限定了他的范围,即缩小泛型的类型范围。

public class demo1 {
    public static void main(String[] args) {
        MyArray<Number> myArray = new MyArray();
        MyArray<Integer> myArray1 = new MyArray<>();
    }
}

class MyArray<T extends Number> {
    // ...
}

1.4 类型擦除

泛型是作用在编译期间的一种机制,实际上运行期间是没有这么多类的,那运行期间是什么类型呢?这里就是类型擦除在做的事情。 

class MyArray<E> {
    // 类型擦除为 Object
}

class MyArray2<E extends Number> {
    // 类型擦除为 Number
}

class MyArray3<E extends Comparable<E>> {
    // 类型擦除为 Comparable
}

类型擦除主要看其类型边界而定。

编译器在类型擦除阶段在做什么?

1. 将类型变量用擦除后的类型替换,即 Object 或者 其他 

2. 加入必要的类型转换语句

3. 加入必要的 bridge method 保证多态的正确性

1.5 通配符

? 用于在泛型的使用,即为通配符

public class Demo2 {
    public static void printAll(MyArrayList<?> list){}

    public static void main(String[] args) {
        // 可以传入任意类型的 MyArrayList
        printAll(new MyArrayList<Integer>());
        printAll(new MyArrayList<String>());
        printAll(new MyArrayList<Object>());
    }
}

class MyArrayList<E> {}

1. 通配符-上界

<? extends 上界>

用 extends 关键字声明,表示参数化的类型可能是所指定的类型,或者是此类型的子类。

public class Demo2 {
    // 可以传入类型实参是 Number 子类的任意类型的 MyArrayList
    public static void printAll(MyArrayList<? extends Number> list){}

    public static void main(String[] args) {
        printAll(new MyArrayList<Integer>());
        printAll(new MyArrayList<Number>());
        printAll(new MyArrayList<Double>());
    }
}

class MyArrayList<E> {}

2. 通配符-下界

<? super 下界>

用 super 进行声明,表示参数化的类型可能是所指定的类型,或者是此类型的父类型,直至 Object。

public class Demo2 {
    // 可以传入类型实参是 Integer 父类的任意类型的 MyArrayList
    public static void printAll(MyArrayList<? super Integer> list){}

    public static void main(String[] args) {
        printAll(new MyArrayList<Integer>());
        printAll(new MyArrayList<Number>());
        printAll(new MyArrayList<Object>());
    }
}

class MyArrayList<E> {}

a. 泛型的限制

1. 泛型类型参数不支持基本数据类型

2. 无法实例化泛型类型的对象

3. 无法使用泛型类型声明静态的属性

4. 无法使用 instanceof 判断带类型参数的泛型类型

5. 无法创建泛型类数组

6. 无法 create、catch、throw 一个泛型类异常(异常不支持泛型) 7. 泛型类型不是形参一部分,无法重载

b. 常用的 T,E,K,V,?

本质上这些个都是通配符,没啥区别,只不过是编码时的一种约定俗成的东西。

通常情况下:

  • ? 表示不确定的 java 类型
  • T (type) 表示具体的一个java类型
  • K V (key value) 分别代表java键值中的Key Value
  • E (element) 代表Element
  • S, U, V 等等 - 第二、第三、第四个类型

💳2. 反射

2.1 定义

Java的反射(reflection)机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性,既然能拿到那么,我们就可以修改部分类型信息;这种动态获取信 息以及动态调用对象方法的功能称为java语言的反射(reflection)机制。

2.2 用途 

1、在日常的第三方应用开发过程中,经常会遇到某个类的某个成员变量、方法或是属性是私有的或是只对系统应 用开放,这时候就可以利用Java的反射机制通过反射来获取所需的私有成员或是方法 。

2、反射最重要的用途就是开发各种通用框架,比如在spring中,我们将所有的类Bean交给spring容器管理,无论 是XML配置Bean还是注解配置,当我们从容器中获取Bean来依赖注入时,容器会读取配置,而配置中给的就是类 的信息,spring根据这些信息,需要创建那些Bean,spring就动态的创建这些类。

2.3 反射基本信息

Java程序中许多对象在运行时会出现两种类型:运行时类型(RTTI)和编译时类型,例如Person p = new Student();这句代码中p在编译时类型为Person,运行时类型为Student。程序需要在运行时发现对象和类的真实 信心。而通过使用反射程序就能判断出该对象和类属于哪些类。

2.4 反射相关的类

dfca84cba1c54f71a97e5ff85707c5ae.png

1. Class类(反射机制的起源 ) 和 Class类中的相关方法

Class帮助文档代表类的实体,在运行的Java应用程序中表示类和接口. Java文件被编译后,生成了.class文件,JVM此时就要去解读.class文件 ,被编译后的Java文件.class也被JVM解析为 一个对象,这个对象就是 java.lang.Class .这样当程序在运行时,每个java文件就最终变成了Class类对象的一个 实例。我们通过Java的反射机制应用到这个实例,就可以去获得甚至去添加改变这个类的属性和动作,使得这个类成为一个动态的类。

常用获得类相关的方法 

9157a378418247c1aea09c4296819d59.png

常用获得类中属性相关的方法

d21b9b3a4b70404ba39d8b4eaf3e6ba9.png获得类中注解相关的方法

9880266523ce40b4b842dc36f757a00c.png获得类中构造器相关的方法

cc27f2ea011e48a29cc7bf665c72c4ca.png

获得类中方法相关的方法

0e543ed409334aee9778a701b913e993.png

2. 反射示例(使用)

a. 获得Class对象的三种方式

在反射之前,我们需要做的第一步就是先拿到当前需要反射的类的Class对象,然后通过Class对象的核心方法,达 到反射的目的,即:在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象, 都能够调用它的任意方法和属性,既然能拿到那么,我们就可以修改部分类型信息。

第一种,使用 Class.forName("类的全路径名"); 静态方法。 前提:已明确类的全路径名。

第二种,使用 .class 方法。 说明:仅适合在编译前就已经明确要操作的 Class。

第三种,使用类对象的 getClass() 方法。

b. 反射的使用

注意:所有和反射相关的包都在 import java.lang.reflect 包下面。

Son 类

public class Son {
    private String name;
    private int age;
    public int aa;
    int bb;

    Son(){
        System.out.println("我是包无参构造");
    }
    private Son(String name) {
        System.out.println("我是私有有参构造 name = " + name);
    }
    public Son(String name, int age){
        System.out.println("我是公有有参构造 name = " + name + "age" +age);
    }

    void method1(){
        System.out.println("我是无参方法");
    }
    private void method2(String dd){
        System.out.println("我是包访问权限有参方法" + dd);
    }
    public void method3(String dd, String cc){
        System.out.println("我是公共有参方法" + dd);
    }
}

使用

public class Test {
    public static void main(String[] args) throws Exception{
        // 得到class
        Class<Son> c1 = Son.class;
        Class<? extends Son> c2 = new Son().getClass();
        Class<?> c3 = Class.forName("Object.reflect.Son");

        System.out.println(c1 == c2);
        System.out.println(c2 == c3);

        // 得到构造方法
        Constructor<?>[] constructors = c1.getConstructors();
        System.out.println(Arrays.toString(constructors));
        Constructor<?>[] declaredConstructors = c1.getDeclaredConstructors();
        System.out.println(Arrays.toString(declaredConstructors));

        // 得到方法
        Method[] methods = c1.getMethods();
        System.out.println(Arrays.toString(methods));
        Method[] declaredMethods = c1.getDeclaredMethods();
        System.out.println(declaredMethods);

        // 得到属性
        Field[] fields = c1.getFields();
        System.out.println(fields);
        Field[] declaredFields = c1.getDeclaredFields();
        System.out.println(declaredFields);

        // 使用反射使用对象私有的构造方法
        Class<?> clSon = Class.forName("Object.reflect.Son");
        Constructor<?> constructor = clSon.getDeclaredConstructor(String.class);
        constructor.setAccessible(true);
        Object hh = constructor.newInstance("hh");
        Son son = (Son) hh;
        System.out.println(son);

        // 使用反射设置对象私有的属性
        Class<Son> sonClass = Son.class;
        Field field = sonClass.getDeclaredField("name");
        field.setAccessible(true);
        Son son1 = sonClass.newInstance();
        field.set(son1, "dd");
        System.out.println(field.get(son1));

        // 使用反射使用对象私有方法
        Class<Son> sonClass1 = Son.class;
        Method method2 = sonClass1.getDeclaredMethod("method2", String.class);
        method2.setAccessible(true);
        Son son2 = sonClass1.newInstance();
        method2.invoke(son2, "李四");
    }
}

2.5 反射优点和缺点

优点:

1. 对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法

2. 增加程序的灵活性和扩展性,降低耦合性,提高自适应能力

3. 反射已经运用在了很多流行框架如:Struts、Hibernate、Spring 等等。

缺点:

1. 使用反射会有效率问题。会导致程序效率降低。

2. 反射技术绕过了源代码的技术,因而会带来维护问题。反射代码比相应的直接代码更复杂 。


💳3. 枚举

枚举的使用

3.1 背景及定义

枚举是在JDK1.5以后引入的。主要用途是:将一组常量组织起来,在这之前表示一组常量通常使用定义常量的方式。

优点:将常量组织起来统一进行管理

场景:错误状态码,消息类型,颜色的划分,状态机等等....

本质:是 java.lang.Enum 的子类,也就是说,自己写的枚举类,就算没有显示的继承 Enum ,但是其默认继承了 这个类。

3.2 使用

1. switch语句

public enum Enum1 {
    Red, Blue, Pink;

    public static void main(String[] args) {
        Enum1 enum1 = Enum1.Red;
        switch (enum1){
            case Red:
                System.out.println("Red"); break;
            case Blue:
                System.out.println("Blue"); break;
            case Pink:
                System.out.println("Pink"); break;
        }
    }
}

2. 常用方法

Enum 类的常用方法

a22fd191ecec4632a3cca82062eafa44.png

public enum Enum2 {
    Red, Blue, Pink;

    public static void main(String[] args) {
        Enum2[] values = Enum2.values();
        // 得到枚举成员及其索引位置
        for (Enum2 value : values) {
            System.out.println("枚举成员:" + value +" 索引位置:"+value.ordinal());
        }
        // 将普通字符串转换为枚举实例
        System.out.println(Enum2.valueOf("Red"));

        // 得到成员实例
        Enum2 red = Enum2.Red;
        Enum2 blue = Enum2.Blue;

        // compereTo比较两个枚举成员在定义时的顺序
        System.out.println(red.compareTo(blue));
        System.out.println(Red.compareTo(Blue));
        System.out.println(Pink.compareTo(Blue));
    }
}

 Java当中枚举实际上就是一个类

public enum Enum3 {
    Red("red",1), Blue("blue",2), Pink("pink", 3);

    private String name;
    private int key;

    private Enum3 (String name,int key) {
        this.name = name;
        this.key = key;
    }
    public static Enum3 getEnumKey (int key) {
        for (Enum3 t: Enum3.values()) {
            if(t.key == key) {
                return t;
            }
        }
        return null;
    }

    public static void main(String[] args) {
        System.out.println(Enum3.getEnumKey(1));
    }
}

3.3 枚举优点缺点

优点:

1. 枚举常量更简单安全 。

2. 枚举具有内置方法 ,代码更优雅

缺点:

1. 不可继承,无法扩展

3.4 枚举是否可以通过反射,拿到实例对象呢?

我们刚刚在反射里边看到了,任何一个类,哪怕其构造方法是私有的,我们也可以通过反射拿到他的实例对象,那么枚举的构造方法也是私有的,我们是否可以拿到呢?

不能。

没有对应的构造方法,我们所有的枚举类,都是默认继承与 java.lang.Enum,继承了父类除构造函数外的所有东西,并且子类要帮助父类进行构造! 而我们写的类,并没有帮助父类构造!

枚举被过滤了,所以不能通过反射获取枚举类的实例!这道题是2017年阿里巴巴曾经问到的一个问题。原版问题是:为什么枚举实现单例模式是安全的?

用枚举实现一个单例模式 

public enum TestEnum {
    INSTANCE;
    public TestEnum getInstance(){
        return INSTANCE;
    }
    public static void main(String[] args) {
        TestEnum singleton1=TestEnum.INSTANCE;
        TestEnum singleton2=TestEnum.INSTANCE;
        System.out.println("两个实例是否相同:"+(singleton1==singleton2));
    }
}

💳4. Lambda 表达式

4.1 背景

Lambda表达式是Java SE 8中一个重要的新特性。lambda表达式允许你通过表达式来代替功能接口。 lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码 块)。Lambda 表达式(Lambda expression)可以看作是一个匿名函数,基于数学中的λ演算得名,也可称为闭 包(Closure)。

1. Lambda表达式的语法

基本语法: (parameters) -> expression 或 (parameters) ->{ statements; }

Lambda表达式由三部分组成:

1. paramaters:类似方法中的形参列表,这里的参数是函数式接口里的参数。这里的参数类型可以明确的声明 也可不声明而由JVM隐含的推断。另外当只有一个推断类型时可以省略掉圆括号。

2. ->:可理解为“被用于”的意思

3. 方法体:可以是表达式也可以代码块,是函数式接口里方法的实现。代码块可返回一个值或者什么都不反 回,这里的代码块块等同于方法的方法体。如果是表达式,也可以返回一个值或者什么都不反回。

2. 函数式接口

要了解Lambda表达式,首先需要了解什么是函数式接口,函数式接口定义:一个接口有且只有一个抽象方法 。

注意:

1. 如果一个接口只有一个抽象方法,那么该接口就是一个函数式接口

2. 如果我们在某个接口上声明了 @FunctionalInterface 注解,那么编译器就会按照函数式接口的定义来要求 该接口,这样如果有两个抽象方法,程序编译就会报错的。所以,从某种意义上来说,只要你保证你的接口 中只有一个抽象方法,你可以不加这个注解。加上就会自动进行检测的。

@FunctionalInterface
interface IMessage{
    void printMessage(String msg);

    default void printOther(){
        System.out.println("接口中的普通方法");
    }
}

4.2 Lambda表达式的基本使用

// 无返回值无参
interface NonReturnNonParameter{
    void test();
}

// 无返回值有参
interface NonReturnHasParameter{
    void test(String name, int age);
}

// 有返回值无参
interface HasReturnNonParameter{
    String test();
}

// 有返回值有参
interface HasReturnHasParameter{
    String test(String name, int age);
}

public class LambdaUsage {
    public static void main(String[] args) {
        NonReturnNonParameter i1 = () -> System.out.println("Lambda 无返回值无参");
        i1.test();

        NonReturnHasParameter i2 = (name, age) -> System.out.println("Lambda 无返回值有参");
        i2.test("张三", 18);

        HasReturnNonParameter i3 = () -> "Lambda 有返回值无参";
        System.out.println(i3.test());

        HasReturnHasParameter i4 = (name, age) -> "Lambda 有返回值有参";
        System.out.println(i4.test("张三", 18));
    }
}

4.3 Lambda在集合当中的使用

为了能够让Lambda和Java的集合类集更好的一起使用,集合当中,也新增了部分接口,以便与Lambda表达式对接。

1ff07e092f484b2ba8daa74f999bd8cf.png

4.4 优点和缺点

优点:

1. 代码简洁,开发迅速

2. 方便函数式编程

3. 非常容易进行并行计算

4. Java 引入 Lambda,改善了集合操作

缺点:

1. 代码可读性变差

2. 在非并行计算中,很多计算未必有传统的 for 性能要高

3. 不容易进行调试


分享到此,感谢大家观看!!!

如果你喜欢这篇文章,请点赞关注吧,或者如果你对文章有什么困惑,可以私信我。

🏓🏓🏓

 

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

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

相关文章

Redis安装与配置 LInux Centos

1.介绍Redis Redis 是完全开源免费的&#xff0c;遵守BSD协议&#xff0c;内存中的数据结构存储系统&#xff0c;它可以用作数据库、缓存和消息中间件。 特点&#xff1a; 支持数据的持久化&#xff0c;可以将内存中的数据保存到硬盘&#xff0c;在重启后再次加载使用。 支持…

Navigation 组件使用入门

Navigation 组件使用入门https://developer.android.google.cn/guide/navigation/navigation-getting-started 添加依赖 dependencies {def nav_version "2.5.2"implementation "androidx.navigation:navigation-fragment:$nav_version"} 创建导航图 …

LeetCode 752. 打开转盘锁

今天在看bfs模板的时候看到了一个题目&#xff0c;解密码锁的这道题&#xff0c;半天也没啥思路和行动力&#xff0c;看了人家的java版的注释&#xff0c;花了40分钟才搞懂这个题&#xff0c;也真的是菜。写完之后发现这个题目还可以去优化&#xff0c;用双向bfs去解决&#xf…

Android App开发超实用实例 | 约束布局

从多个角度介绍约束布局设计中的控件定位。 01、约束布局基础 从 Android Studio 2.3版本起&#xff0c;约束布局是Android Studio布局文件的默认布局。其他布局方式在实现复杂一些的布局设计时存在多种或多个布局嵌套的情况&#xff0c;设备调用这样的布局文件就需要花费更多…

(未整理完)十月每日一题打卡

每日打卡 10.1 [重新格式化电话号码 lc1694](1694. 重新格式化电话号码 - 力扣&#xff08;LeetCode&#xff09;) 模拟题&#xff1a;特殊情况就是在最后划分完全部三个之后&#xff0c;还剩四个需要变成aa-bb class Solution { public:string reformatNumber(string number…

Redis系列:Redis主从、哨兵、集群介绍

本篇内容包括&#xff1a;Redis 主从架构、Redis 哨兵架构、Redis 集群架构 的介绍等内容&#xff5e; 文章目录一、Redis 主从架构1、Redis 主从架构2、主从架构原理二、Redis 哨兵模式1、Redis 哨兵模式2、Redis 哨兵模式工作过程三、Redis 集群模式1、Redis 集群模式2、Redi…

【树莓派不吃灰】基础篇⑲ 搭建usb摄像头MJPG-streamer图片流监控,支持远程视频监控访问

目录1. 前言2. 识别摄像头3. MJPG-streamer方案3.1 什么是 MJPG&#xff1f;3.2 MJPG 的优点&#xff1f;3.2 MJPG 的缺点&#xff1f;4. 搭建usb摄像头监控4.1 开启树莓派摄像头开关4.2 查看设备文件4.3 安装必要的库4.4 下载 mjpg-streamer 安装文件4.5 切换到 /mjpg-streame…

基于51单片机的温度甲烷监测报警串口上报proteus仿真原理图PCB

功能介绍&#xff1a; 0.本系统采用STC89C52作为单片机 1.LCD1602液晶实时显示当前温度和甲烷浓度 2.超过甲烷浓度阈值&#xff0c;蜂鸣器报警 3.按键可更改甲烷浓度阈值上限和启动/暂停检测 4.020%浓度&#xff0c;绿色LED点亮 20%~阈值上限&#xff0c;黄色LED点亮&#xff0…

C#操作modbus

modbus使用范围广泛&#xff0c;广泛应用于各类仪表&#xff0c;PLC等。 modbus的好处是免费&#xff0c;属于应用层协议&#xff0c;底层硬件基于485/以太网。 modbus协议本质还是自定义协议。 modbus调试软件&#xff1a; mthings: modbuspoll: 主站/从站&#xff0c;客…

前端静态页面基本开发思路(一)

有不少刚入门前端的同学经常问我前端布局的问题&#xff0c;总是跟我说在面对学校布置的作业或者想自己搭建博客的时候不知道怎么下手&#xff0c;不知道怎么去写静态的页面&#xff0c;每当我解决了一个又一个同学的问题的时候&#xff0c;又有新的同学来问&#xff0c;故思来…

nginx 配置防盗链(了解)

一 防盗链 1.1 防盗链概念 网站上页面的一些静态资源&#xff0c;不想让本站点的静态资源被他人盗取访问。使用nginx判断请求连接的头部refer中是否含有内容以及合法性来进行处理。 referer表示第二次资源的来源地址 1.2 配置规则 valiad_referers none|blocked|server_na…

Spring--IOC基于XML管理bean

IOC容器 IOC思想 IOC&#xff1a;Inversion of Control 即反转控制 获取资源的传统方式 自己做饭&#xff1a;买菜、洗菜、择菜、改刀、炒菜&#xff0c;全过程参与&#xff0c;费时费力&#xff0c;必须清楚了解资源创建整个过程中的全部细节且熟练掌握。 在应用程序中的组件…

Antd表格性能优化

今天来分享一个实际项目的性能优化的内容。 文章目录一、背景介绍二、性能问题原因及解决方案一、背景介绍 国内React项目大多数人选择配套的UI库的时候都会选择Antd。如果是非常简单的页面用Antd的话其实是完全没问题的&#xff0c;性能感觉不到什么瓶颈&#xff0c;样式也还…

计算机网络

目录 介绍 组成部分 工作方式 功能组成 网络范围分类 传输技术&#xff1a; 总结 标准化工作 RFC文档的作用&#xff1a; 速率&#xff0c;带宽 有容量和速率的区别 带宽 吞吐量 时延&#xff0c;时延带宽积 1.发送时延&#xff1a; 2.传播时延&#xff1a; ​编辑 3.…

Vant组件库 引入 阿里矢量图 添加自己喜欢的 ICON

&#x1f4c3;目录跳转一.矢量图下载&#x1f4a8;使用CDN方式&#x1f389;下载本地&#xff08;推荐&#xff09;二.Vant引入Icon&#x1f5fa;️&#x1f383; 使用方式&#x1f680; 运行效果&#xff1a;一.矢量图下载 &#x1f4a8;使用CDN方式 当然你也可以使用官方的C…

【编程题】【Scratch三级】2021.12 分身术

分身术 1. 准备工作 (1)删除小猫角色、添加角色“Monkey”,Money位于舞台的中心; (2)添加背景Light; (3)新建变量“编号”。 2. 功能实现 (1)程序开始时,Monkey说:“我会分身术!变!!!”2秒; (2)每隔2秒克隆出一个位置随机、大小随机、颜色随机的Monke…

python easygui修改窗口位置

EasyGui是一个十分简单的Python图形界面库&#xff0c;支持窗口文本显示、图片显示、按钮、文本框、选项栏、文件选择等等必要的组件且操作十分简单。但也因如此&#xff0c;导致EasyGui甚至不能手动调整窗口位置、按钮位置、名字等&#xff0c;因为EasyGui是基于Tkinter编写的…

VMware三种网络模式详解

VMware三种网络模式 linux重启网络服务命令&#xff1a; service network restart 一、桥接模式 原理&#xff1a;VMware和宿主机&#xff0c;处于同一网段、两者地位平等。&#xff08;无需虚拟网卡&#xff09; 1.1、使用方法 虚拟网络编辑器 虚拟机设置-适配器 上面两…

<Linux> 编译器与调试器—gcc/g++/gdb 的使用

< Linux > 编译器与调试器—gcc/g/gdb 的使用 文章目录< Linux > 编译器与调试器—gcc/g/gdb 的使用一、Linux编译器 - gcc/g 使用1. 编译程序的四个过程背景知识预处理编译汇编链接2. 链接方式与函数库2.1 动态链接与静态链接2.2.函数库2.3.动态库与静态库3. gcc/…

干货分享:谷歌主动搜索开发客户的万能公式

大家在用谷歌(Google)开发是不是也有以下常见问题&#xff1a; 关键词不准&#xff0c;搜索到的都是零售商&#xff0c;B2C平台搜索到的客户太大&#xff0c;已经被开发多次&#xff0c;开发信不回复搜索到的客户找不到邮箱搜索到的客户与工厂不匹配&#xff0c;无法合作 其实…