梳理Android开发中经常用的语法糖

android实战项目app,androidstudio开发app 总之啊,家里没矿的同学们,如果你们想以后的日子过得好一些,多想想你们的业余时间怎么安排吧;技术方面的提升肯定是重中之重,但是技术外的一些“软实力”也不能完全忽视,很多时候升职确实是因为你的技术足够强,但也与你的“软实力”密切相关在这我也分享一份大佬自己收录整理的Android学习PDF+架构视频+面试文档+源码笔记,还有高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料这些都是我闲暇还会反复翻阅并给下属员工学习的精品资料。 阅读详情

语法糖(Syntactic Sugar),也称糖衣语法,指在计算机语言中添加的某种语法,这种语法对语言本身功能来说没有什么影响,只是为了方便程序员的开发,提高开发效率。说白了,语法糖就是对现有语法的一个封装。

语法糖在我们Android开发中经常遇到的我暂且归纳为以下几类:

1、 泛型

泛型我们平时会经常遇到,在写一些框架的时候是必不可少的元素。但是其一个实现机制很容易被我们忽视.

类型擦除

泛型这种语法糖,编译器会在编译期间「擦除」泛型语法并相应的做出一些类型转换动作。对于java虚拟机来说,他根本不认识Map<String, String> map这样的语法。需要在编译阶段通过类型擦除的方式进行解语法糖。

类型擦除的主要过程如下:

a、将所有的泛型参数用其最左边界(最顶级的父类型)类型替换。

b、移除所有的类型参数。

实例:

原代码
Map<String, String> map = new HashMap<String, String>();  
map.put("name", "zhufk");  
map.put("age", "28");  
解语法糖之后
Map map = new HashMap();  
map.put("name", "zhufk");  
map.put("age", "28");  
原代码
public static <A extends Comparable<A>> A max(Collection<A> xs) {
    Iterator<A> xi = xs.iterator();
    A w = xi.next();
    while (xi.hasNext()) {
        A x = xi.next();
        if (w.compareTo(x) < 0)
            w = x;
    }
    return w;
}
解语法糖之后
public static Comparable max(Collection xs){
    Iterator xi = xs.iterator();
    Comparable w = (Comparable)xi.next();
    while(xi.hasNext())
    {
        Comparable x = (Comparable)xi.next();
        if(w.compareTo(x) < 0)
            w = x;
    }
    return w;
}

总结:虚拟机中没有泛型,只有普通类和普通方法,所有泛型类的类型参数在编译时都会被擦除,泛型类并没有自己独有的Class类对象。比如并不存在List<String>.class或是List<Integer>.class,而只有List.class。

2、枚举(switch 支持 String 与枚举)

java中的swith自身原本就支持基本类型。比如int、char等。对于int类型,直接进行数值的比较。对于char类型则是比较其ascii码。所以,对于编译器来说,switch中其实只能使用整型,任何类型的比较都要转换成整型。比如byte。short,char(ackii码是整型)以及int。

那么接下来看下switch对String得支持,有以下代码:

原代码
public class switchDemoString {
    public static void main(String[] args) {
        String str = "world";
        switch (str) {
        case "hello":
            System.out.println("hello");
            break;
        case "world":
            System.out.println("world");
            break;
        default:
            break;
        }
    }
}
解语法糖之后的代码
public class switchDemoString{
    public switchDemoString(){
    }
    public static void main(String args[]){
        String str = "world";
        String s;
        switch((s = str).hashCode()){
        default:
            break;
        case 99162322:
            if(s.equals("hello"))
                System.out.println("hello");
            break;
        case 113318802:
            if(s.equals("world"))
                System.out.println("world");
            break;
        }
    }
}

看到这个代码,你知道原来字符串的switch是通过equals()和hashCode()方法来实现的。还好hashCode()方法返回的是int,而不是long。 

顺道我们来解释下枚举的基本知识

声明枚举时必须使用 enum 关键字,然后定义枚举的名称、可访问性、基础类型和成员等。

a、最基本得创建方式

public enum ColorEnum {
    RED,BLUE,GREEN
}

我们看着很熟悉,但是它内部实现的方式有注意过吗:

public final class ColorEnum extends Enum
{

    //返回存储枚举实例的数组的副本。values()方法通常用于foreach循环遍历枚举常量。
    public static ColorEnum[] values()
    {
        return (ColorEnum[])$VALUES.clone();
    }
    //根据实例名获取实例
    public static ColorEnum valueOf(String s)
    {
        return (ColorEnum)Enum.valueOf(ColorEnum, s);
    }

    //私有构造方法,这里调用了父类的构造方法,其中参数s对应了常量名,参数i代表枚举的一个顺序(这个顺序与枚举的声明顺序对应,用于oridinal()方法返回顺序值)
    private ColorEnum(String s, int i)
    {
        super(s, i);
    }

    //我们定义的枚举在这里声明了三个 ColorEnum的常量对象引用,对象的实例化在static静态块中
    public static final ColorEnum RED;
    public static final ColorEnum BLUE;
    public static final ColorEnum GREEN;
    //将所有枚举的实例存放在数组中
    private static final ColorEnum $VALUES[];

    static 
    {
        RED = new ColorEnum("RED", 0);
        BLUE = new ColorEnum("BLUE", 1);
        GREEN = new ColorEnum("GREEN", 2);
        //将所有枚举的实例存放在数组中
        $VALUES = (new ColorEnum[] {
            RED, BLUE, GREEN
        });
    }
}

 

b、增加自己的字段以及一些辅助方法

public enum ColorEnum {
    RED("red","红色"),GREEN("green","绿色"),BLUE("blue","蓝色");
    //防止字段值被修改,增加的字段也统一final表示常量
    private final String key;
    private final String value;
    
    private ColorEnum(String key,String value){
        this.key = key;
        this.value = value;
    }
    //根据key获取枚举
    public static ColorEnum getEnumByKey(String key){
        if(null == key){
            return null;
        }
        for(ColorEnum temp:ColorEnum.values()){
            if(temp.getKey().equals(key)){
                return temp;
            }
        }
        return null;
    }
    public String getKey() {
        return key;
    }
    public String getValue() {
        return value;
    }
}

内部实现同基本方式雷同我们就不一一介绍啦。

3、方法变长参数

我们在声明方法是经常会这么写:

原代码
public void printInfo(){
    print(“zhufk”,“求关注”)
}
public void print(String... strs){
    for (int i = 0; i < strs.length; i++){
        System.out.println(strs[i]);
    }
}
解语法糖之后

public void printInfo(){
{
    print(new String[] {
        "Holis", "\u516C\u4F17\u53F7"});
}

public transient void print(String strs[])
{
    for(int i = 0; i < strs.length; i++)
        System.out.println(strs[i]);

}

总结:可变参数在被使用的时候,他首先会创建一个数组,数组的长度就是调用该方法是传递的实参的个数,然后再把参数值全部放到这个数组当中,然后再把这个数组作为参数传递到被调用的方法中。

4、 for-each

增强for循环(for-each)相信大家都不陌生,日常开发经常会用到的,他会比for循环要少写很多代码,那么这个语法糖背后是如何实现的呢?

原代码
public static void main(String... args) {
    String[] strs = {"zhufk", "QQ:308585736",“求关注”};
    for (String s : strs) {
        System.out.println(s);
    }
    List<String> strList = ImmutableList.of("zhufk", "QQ:308585736",“求关注”);
    for (String s : strList) {
        System.out.println(s);
    }
}
解语法糖之后
public static transient void main(String args[])
{
    String strs[] = {
     "zhufk", "\u516C\u4F17308585736", "\u535A\u5BA2\uFF1A"
    };
    String args1[] = strs;
    int i = args1.length;
    for(int j = 0; j < i; j++)
    {
        String s = args1[j];
        System.out.println(s);
    }

    List strList =ImmutableList.of("zhufk","\u516C\u4F17308585736","\u535A\u5BA2\uFF1A");
    String s;
    for(Iterator iterator = strList.iterator(); iterator.hasNext(); System.out.println(s))
        s = (String)iterator.next();

}

for-each的实现原理其实就是使用了普通的for循环和迭代器。

5、Lambda表达式

我们在显示开发中如果用到过RxJava开发,应该很熟悉这种语法

首先我们先来了解一下Lambda:

什么叫函数式接口?他和普通接口有什么区别? 
“函数式接口”是指仅仅只包含一个抽象方法的接口(可以包含默认方法和静态方法),其他特征和普通接口没有任何区别,Java中Runnalbe,Callable等就是个函数式接口;。我们可以给一个符合函数式接口添加@FunctionalInterface注解,这样就显式的指明该接口是一个函数式接口,如果不是,编译器会直接提示错误。当然你也可以不用添加此注解。添加的好处在于,由于Lambda表达式只支持函数式接口,如果恰好这个接口被应用于Lambda表达式,某天你手抖不小心添加了个抽象方法,编译器会提示错误。

//显式指明该接口是函数式接口
@FunctionalInterface
public interface ActionListener{

    void actionPerformed(ActionEvent e);//这是一个抽象方法

    default String onDefalutMethod(){//这是一个默认方法 
        return "这是一个默认方法";
    }

    static String onStaticMethod(){
        return "这是一个静态方法";
    }

}

通常的调用方式
button.addActionListener(new ActionListener(){ 

    public void actionPerformed(ActionEvent e) {

    ShowDialog(e.tostring());

    }

})

用Lambda表达式
button.addActionListener((ActionEvent e) -> ShowDialog(e.tostring()));


待续。。。。。

2019年Android开发最新面试全攻略 曾经有个团队告诉我:“我们从来不担心内存泄漏,因为每个流都放在finally里close。” 我当时就想问:那你遇到过close()自己抛异常的情况吗?看看这个经典陷阱:try {// 读取操作...if (fis!= null) {try {// 这里也可能抛IOException!两层try-catch嵌套,丑陋不说,万一read()和close()都失败了,你根本不知道哪个才是主因。所以Java 7推出了,它的威力远不止“自动关闭”这么简单。它还能。 阅读详情

相关推荐

为了精通Kotlin语法,我花数月翻译并解析官方文档|Android开发必备

Kotlin作为一门现代编程语言,其对函数式编程范式的深度支持是其区别于Java等传统OOP语言的重要标志之一。在这一章中,将系统性地解析Kotlin中函数的定义机制、参数传递模型以及高阶函数的核心原理,并结合实际开发场景进行深入剖析。从基础语法到运行时行为,再到性能优化策略,本章旨在帮助具备5年以上经验的开发者重新审视“函数”这一基本单元在Kotlin中的演化形态。函数不再仅仅是执行逻辑的容器,而是可以被赋值、传递、组合甚至内联生成的一等公民。

weixin_35756373的博客 1082

【Android】开发中关于Ui的语法糖

介绍了一些Ui的简单语法糖,有时候还是非常有用的。

摸鱼小小虫的博客 706

安卓疫苗预约App开发实战:需求拆解到exe封装全流程

移动应用开发中,预约类App是常见的业务场景,但疫苗预约因涉及批次、针次、库存等业务约束,比普通预约更富挑战。本文从安卓开发基础出发,讲解如何用Java与SQLite构建本地数据层,通过RecyclerView实现疫苗列表与预约流程,并重点解决预约冲突校验、库存同步等核心逻辑。针对期末验收场景,文章详细介绍了将APK封装为Windows可执行exe的几种方案,让应用能一键启动演示。同时涵盖设计报告撰写、数据库表设计、测试用例等工程实践要点,帮助开发者理解安卓项目从需求拆解、技术选型到打包交付的完整链路,是一

weixin_29243279的博客 224

Android KTX语法糖

我整理的一些关于【Android,android,Kotlin】的项目学习资料(附讲解~~)和大家一起分享、学习一下:https://d.51cto.com/bLN8S1Android KTX 语法糖入门指南 在Android开发中,Kotlin是一种越来越受欢迎的语言,而Android KTX为Kotlin在Andro...

weixin_41329908的博客 141

RocketMQ 为什么要自己做一个 NameServer ?RocketMQ 5.x 版本中的 proxy、controller 和 container 分别有什么用 ?

1.独立运行的分散结构 2.简化实现,容忍部分数据不一致 Proxy:多语言支持、简化开发 Controller: 提高 Broker 的性能 Container:提高资源利用率,平衡负载

xaiobit_hl的博客 1489

基于物联网技术智慧园林绿化养护管理信息平台

近几年来,随着经济不断的发展,城市面积不断的扩大,城市管理中的园林绿化工作也在这种趋势下不断的发生着深刻改变。管养企业是否按制定的管养计划严格执行?绿化事件整改是否及时到位?绿地面积是否在稳步增长?管养的效果如何?如何客观评价管养企业的管养工作?这些都是我们各级管理者需要面对的问题。   智慧园林绿化养护管理信息平台的开发思路以“考核”为核心,整个信息平台体现出“新、快、高、全、享”五个特点。   智慧园林绿化养护管理信息平台的整个开发理念为:依托五大技术手段(全球卫星定位系统技术、地理信...

Cesium的博客QQ2252224326 2459

Kotlin语言的语法糖

语法糖”是一个计算机科学术语,指的是程序中某些语法的简化,使得代码更加易读和易写,同时不影响程序的执行功能。可以认为语法糖是一种对原本复杂或冗长的语法进行简化的手段,以便开发者能更轻松地编写代码。在Kotlin中,语法糖的使用使得程序更加优雅,减少了样板代码,提高了开发的效率。Kotlin的语法糖通过提供简化的、更易于理解的语法,让开发者能够更高效地编写高质量的代码。它不仅提高了代码的可读性和可维护性,还提高了开发的效率。

2501_90770527的博客 1004

我用两个月时间,终于把优快云付费资源项目玩明白了!

关于项目的定位,这是一个知识付费项目,根据市场研究机构的数据显示,到2023年,全球知识付费市场规模将达到2000亿美元,所以说知识付费的前景是十分广阔的,当下互联网时代信息大爆炸,80后、90后、00后群体对知识付费的认可度也大幅提升,同时这群作为知识付费的主流人群已经具备了更强的消费能力,而且对于知识付费的需求更高。目前整个知识付费领域仍然在发展起步的初期,尽快在知识付费领域布局可以帮助我们在这波红利中获得一份不错的收益。而且个人认为,

白话机器学习 2万+

“类名.this” 与 “类名.class”

类名.this “类名.this”的语法在Java语言中叫做“qualified this”。相关规定在这里:Chapter 15. Expressions - Qualified this这个语法的主要用途是:在内部类的方法中,要指定某个嵌套层次的外围类的“this”引用时,使用“外围类名.this”语法。例如说: class Foo { class Bar { Foo getFoo...

迪迦 • 奥特曼 484

在Ubuntu 22.04上从零搭建TrinityCore 3.3.5服务器:一份保姆级避坑指南

本文详细介绍了在Ubuntu 22.04系统上从零搭建TrinityCore 3.3.5服务器的完整流程,包括环境准备、源码编译、数据库配置、资源文件处理及性能调优等关键步骤。特别针对国内开发者和低配置用户优化,提供保姆级避坑指南,帮助用户高效搭建魔兽世界经典旧世版本私服。

weixin_33393017的博客 304

手把手教你用示波器测试DDR5 DRAM信号完整性(附眼图分析技巧)

本文详细介绍了如何使用示波器测试DDR5 DRAM信号完整性,包括眼图分析技巧。从DDR5的核心挑战、测试设备选型到实测工作流程,提供了全面的指导。特别强调了DFE功能验证和系统级协同测试,帮助工程师解决信号完整性问题,提升测试效率。

g2h3i4j5的博客 1152

20个Kotlin语法糖让你的Android代码更简洁

这些语法糖不仅能减少代码量,还能提升可读性和维护性,让Android开发更高效优雅!

时小雨的专栏 1333

【时时三省】tessy 集成测试:小白入门指导手册

有图有文字详细介绍 tessy 集成测试 操作方法。

时时三省的博客 2515

Kotlin 核心学习大纲(Android 开发)

本文系统梳理了Kotlin核心知识点,分为基础语法、面向对象、高阶特性、协程、Java互操作和语法糖6大模块。重点包括:空安全机制、data类、扩展函数、集合操作、协程使用(suspend函数、调度器、Flow)以及与Java互操作技巧。文章推荐1周学习路线,建议从基础语法开始,逐步掌握类与单例、扩展函数、Lambda表达式,最终结合Jetpack实战应用。特别强调协程作为Jetpack灵魂技术的重要性,以及日常开发中语法糖的效率提升作用。

xingfuyisheng的专栏 157

android13删除录屏权限提示框-去除录屏提示

在Android 13中,当应用请求屏幕录制权限时,系统会弹出一个权限提示框,要求用户明确授权。这个提示框是为了增强用户隐私保护,让用户知道有应用尝试录制屏幕。但是,在某些情况下,开发者可能希望避免显示这个提示框,以提供更流畅的用户体验。本文将介绍如何在Android 13中删除录屏权限提示框。

zhutoubenben的专栏 1880

VSCode + QMT 量化交易完整解决方案!

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 1327

kotlin学习 基础知识一览

本文介绍了在Android Studio中使用Kotlin语言的基础知识。主要内容包括:1) 创建Kotlin项目和编写main函数;2) 变量声明(val不可变,var可变)和类型推导;3) 函数定义和语法糖简化;4) 逻辑控制(if条件语句、when条件语句);5) 循环语句(for-in循环和区间操作);6) 类与对象、继承和构造函数(主构造函数和次构造函数)。通过具体代码示例展示了Kotlin的简洁语法特性,如自动类型推导、函数简化表达式等。

来来来,走一走 1331

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

客户端面试八股文-Android第三方库

3、BridgeInterceptor:桥拦截器(补全请求头,解析响应编码),上层业务与底层网络的桥梁,自动补全Content-Type,User-Agent,Accept-Encoding,响应自动解压,封装字符编码。2、RetryAndFollowUpInterceptor:重试重定向拦截器,处理IO异常重试,301/302重定向,401鉴权等,限制最大重定向次数默认20次。2、noinline:多个lambda参数时,不想某一个被内联,加noinline,该lambda保留对象引用,可当做参数传递。

qq_41652481的博客 257

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Android:弹出对话框方式梳理一览(一)

到之前为止其实都是Dialog的很基础的应用,实际上在使用过程中我们可能需要弹出一个Dialog来展示我们自己的定制化的内容,比如说一个登录页面,这个时候我们就不能用之前的简单的方法了,取而代之,我们可以调用setView方法来为我们的Dialog填充自定义的内容,这个过程实际上类似于动态添加View的过程。

Tai_Monster的博客 3902

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

2024年安卓最新Flutter 知识梳理 (Dart) - Dart 中 static, final, const 区别,阿里巴巴android面试都问些什么问题

【Android 详细知识点思维脑图(技能树)】其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。

2401_84544780的博客 612

根据最新 Android 面试知识点梳理总结的面试宝典,你get了吗?

随着Android技术的快速发展和市场需求的不断变化,Android面试知识点也在持续更新和完善。为帮助广大开发者更好地备战面试,本文特意梳理了当前最新、最热的Android面试知识点,助你一臂之力,早日收获心仪offer!要想在Android面试中脱颖而出,除了牢固掌握基础原理之外,紧跟行业发展趋势,了解并熟练运用最新技术和最佳实践显得尤为关键。赶快把这些知识点纳入你的知识宝库,向着更高的职业目标迈进吧!

star_nwe的博客 887

安卓开发进阶之路:从技术栈到性能优化与面试突围

在移动互联网进入稳态期的当下,安卓开发早已不是单纯掌握几个API就能胜任的工作。面对复杂业务场景,开发者需要理解Kotlin协程的挂起机制、Jetpack Compose的声明式UI模型以及MVVM/MVI架构状态管理背后的底层原理,以此构建起完整的知识体系。性能优化同样关键,启动速度、内存泄漏和卡顿分析是衡量工程能力的重要标尺。这些能力不仅影响App质量,也决定了面试中能否展现真正的技术深度。从原理到实践,从优化到表达,全面系统化地提升,才能在安卓开发的竞争中脱颖而出。

weixin_29011239的博客 245

Flutter双端开发实战:iOS与Android上架全流程指南

跨平台开发中,'一套代码双端运行'已从概念走向工程落地。其核心在于基于Dart语言与Skia渲染引擎的原生级性能保障,结合Platform Abstraction Layer(PAL)实现平台能力解耦,兼顾UI一致性与系统合规性。技术价值体现在开发效率提升、包体积压缩、冷启动优化及审核通过率增强;典型应用场景覆盖社交、电商、工具类App的MVP验证与规模化交付。本文聚焦Flutter双端开发中iOS上架与Android应用市场发布的关键路径、避坑要点与CI/CD自动化实践。

weixin_30542979的博客 89

安卓开发面试进阶指南:从源码原理到性能优化实战

在移动互联网技术迭代加速的今天,安卓开发早已不是简单的界面搭建,而是涉及系统机制、并发处理与架构设计的综合工程。理解Java与Kotlin的底层原理,掌握Handler消息机制、协程调度等核心知识点,是每一位开发者突破职业瓶颈的关键。性能优化作为中高级岗位的必考能力,要求开发者具备从启动耗时、内存泄漏到卡顿定位的系统化排查思路。无论是求职面试还是日常项目实践,将源码阅读与工程化思维结合,才能应对复杂的业务场景。本文围绕安卓开发岗位画像、技能体系拆解与高频面试题,深度剖析从简历投递到技术面试的全流程策略,帮助

weixin_29000991的博客 255

【Kotlin】kotlin的基本语法,谈谈Android-Binder机制及AIDL使用

很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从哪里入手去学习,对此我整理了一些资料如果你熟练掌握以下列出的知识点,相信将会大大增加你通过前两轮技术面试的几率!这些内容都供大家参考,互相学习。①「Android面试真题解析大全」PDF完整高清版+②「Android面试知识体系」学习思维导图压缩包既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

2301_82257317的博客 991

Android开发面试通关指南:从底层原理到实战策略

在移动应用开发领域,Android系统的底层机制与工具链配置始终是开发者进阶的关键。理解Handler、Binder、View绘制等原理,能够帮助开发者从“会用API”走向“懂的为什么”;而掌握Android Studio的下载安装与中文设置,则是高效开发的基础。同时,自动注入技术(如字节码插桩、依赖注入)在性能监控和框架设计中扮演重要角色。结合面试官的视角,系统梳理了从语言基础、系统框架、工具链、架构设计到性能优化的完整能力模型,并为求职者提供了一份实战面试准备指南,助力在技术考察中脱颖而出。

weixin_29185167的博客 522
上一篇: Java类加载机制
下一篇: Android配置文件中的一些小秘密
钱多多~吖
博客等级 码龄13年 4粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值