Java入门基础:Java多态考题解析之一(那些年的Java多态考题)

Java基础-多态实现原理 多态是面向对象编程里面的概念,一个接口的多种实现不同的实现方式,即为多态这里的接口不应理解得太死板,比如在 Java 里面,继承一个类和实现一个接口本质上都是一种继承行为,因此都可以理解为多态的体现。从静态和动态的角度进行划分,多态可以分为编译时多态和运行时多态。编译时多态是静态的,主要是指方法的重载,它是根据参数列表的不同来区分不同的方法,编译之后会变成两个不同的方法。而运行时多态是动态的,是通过动态绑定来实现的,也就是大家通常所说的多态性,本篇博客主要讨论运行时多态。 阅读详情

起因:为什么写这篇文章,是因为网上看到一道笔试题,作者的解析是错误的,所以在此探讨一下。

题目如下,选择以下代码的输出结果:

class A{    
    public String s = "A";    
    public void setS(String s){     
        this.s = s;     
    }     
    public String getS(){     
        return this.s;     
    }      
}    
     
public class B extends A{     
    public String s = "B";    
    public void setS(String s){     
        this.s = s;     
    }     
    public String getS(){     
        return this.s;     
    }    
    public static void main(String[] args){     
        A a = new A();     
        B b = new B();     
        a.setS("[AA]");     
        b.setS("[BB]");     
        a = b;    
        System.out.print(a.s);    
        System.out.print(b.s);     
        System.out.print(a.getS());     
        System.out.print(b.getS());     
    }    
}  

A.AB[AA][BB]
B.[AA][BB][AA][BB]
C.A[BB][BB][BB]
D.A[BB]][AA][BB]

跑一下代码,我们马上能够得出结果肯定是选C,但是为什么选C呢?

本题有三个关键点:

1、B继承了A类,但是A和B类中都同时定义了s成员变量

2、B类中的setS重写了A类中的setS方法

3、a = b这条语句的意义

解析:

第一个关键点:

B b = new B();其实存在两个s,在内存中小b引用的对象其实有两个s,父类的s=“A",子类的s=”B“,这个特性其实就是Java中的类的成员属性是静态绑定的,父类和子类中可以定义重名的成员变量,各自独立,不会覆盖,内存结构如下:

第二个关键点不用解释,Java多态技术的基础,存在继承和重写

第三个关键点,也是最重要的关键点就是a = b后的内存结构,此时new A()已经没有用了,此时a和b两个变量其实都指向了new B()的内存

首先,需要理解Java多态定义的前提,因为变量a是A类型的,只能访问它实际类型中的成员,所以:

 System.out.print(a.s);     // a.s此时访问的是b对象父类的s,就是创建b对象时初始化为父类A时的s
 System.out.print(b.s);     // b.s此时方法的是b对象B类定义的s,但是这个s被b.setS("[BB]")重新赋值为[BB]了,得到[BB]
 System.out.print(a.getS());    // 这里是因为多态机制,调用的是b对象B类定义的getS方法,返回b的s,[BB]
 System.out.print(b.getS());     // 这里就没啥可说的了,b调自己的方法,返回b的s,[BB]

以上就是此题完整解释,谢谢

 

 

【Java基础知识 1】Java入门级概述 优快云最强Java专栏,包含全部Java基础知识点、Java8新特性、Java集合、Java多线程、Java代码实例,理论结合实战,实现Java的轻松学习。 阅读详情

相关推荐

Java零基础-多态详解

在上一期的文章中,我们探讨了Java中的继承机制。继承允许类之间共享属性和方法,为我们提供了代码重用和功能扩展的手段。继承是面向对象编程(OOP)的核心概念之一,而多态则是另一项重要的OOP特性,它允许我们以不同的方式使用相同的接口或方法。本文将深入解析Java中的多态机制,探讨其定义、实现方法及实际应用。本文将全面讲解Java中的多态机制,包括多态的基本概念、如何实现多态、以及多态的优缺点。通过源码解析和实际案例分享,我们将展示多态的具体应用,并分析其在不同应用场景下的表现。

喵手的博客 1151

9、多态作业

多态作业 一、选择题 关于Java中的多态,以下说法不正确的为( B )。(选择一项) A 多态不仅可以减少代码量,还可以提高代码的可扩展性和可维护性 B. 把子类转换为父类,称为向下转型,自动进行类型转换 C. 多态是指同一个实现接口,使用不同的实例而执行不同的操作 D. 继承是多态的基础,没有继承就没有多态 编译运行如下Java代码,输出结果是( D )。(选择一项) class Base { public void method(){ System.out.print (“Base m

友培的博客 2714

java多态练习题

java多态、继承练习题,包含题目与答案,............................................................................................................

Java多态例题

一、代码如下: class A { public String show(D obj)...{ return ("A and D"); } public String show(A obj)...{ return ("A and A"); } } clas

天空之城 891

【RK3399】Android平台增加一款声卡设备(ES7210+ES8156),进行录音/播放测试。

文章目录前言一、开发环境二、概述三、硬件介绍1、ES72102、ES81563、数字麦克风阵列4、音频示意图四、下载SDK五、编译、烧写1、u-boot2、kernel3、Android SDK4、烧写分区5、烧写固件六、声卡驱动1、添加codec代码2、修改Kconfig3、修改Makefile4、修改rockchip_defconfig5、修改DTS七、声卡调试1、查看声卡注册信息2、使用tinycap/tinyplay录音和放音3、使用示波器观测八、修改HAL层1、修改默认capture/playba

rentong123的博客 2万+

别再手动翻译PDF了!手把手教你用Zotero PDF Translate插件搞定外文文献(附最新GitHub下载链接)

本文详细介绍如何利用Zotero PDF Translate插件高效翻译外文文献,包括插件安装、配置及多引擎对比。通过划词翻译、段落翻译和全文翻译功能,显著提升科研工作效率,特别适合处理大量英文PDF文献的研究人员。

weixin_33712987的博客 773

java练习题之多态练习

public void eat(){ System.out.println("人的吃饭方法");6:(多态)在继承题目的基础上,定义一个 Person 类型的数组,存储多个不同类型的子类型对象,(1) 统计并打印输出数组中所有学生干部的个数(2) 打印输出所有学生的信息。

zhzjn的博客 3126

大规模SoC芯片Hierarchical Flow Calibre LVS教程

大规模SoC芯片Hierarchical Flow Calibre物理验证LVS实现教程

weixin_37584728的博客 1200

Java 继承,多态,接口练习

Java 继承,多态,接口练习

wangjh11234的博客 3156

【ROS2】机械臂MoveIt2

navigation2 专注于移动机器人的导航与定位,处理大范围空间的底盘运动;MoveIt2 专注于机械臂的操作规划,处理多关节协同的末端执行器运动。在复合机器人(如,移动机械臂)navigation2 负责移动到目标区域,MoveIt2 负责机械臂抓取。官网:https://moveit.picknik.ai/main/index.html。

郭老二 597

药物相关 PK(药代动力) 、PD(药效)指标知识

PK代表药物的药代动力学,指的是药物在体内的吸收、分布、代谢和排泄等过程,包括药物的药代动力学参数如Cmax(最大血药浓度)、Tmax(最大血药浓度出现的时间)、t1/2(半衰期)、AUC(药物曲线下面积)等。PD代表药物的药效学,指的是药物与生物体相互作用所产生的药理效应,包括药物的药效学参数如EC50(半数最大有效浓度)、ED50(半数最大效应剂量)、Emax(最大效应)等。PD(Pharmacodynamics)则研究药物的药效学特性,如药物的作用机制、效力、最大疗效、最小毒性等。

weixin_42357472的博客 2万+

java 多态性详解及常见面试题

java多态性 多态分两种: (1) 编译时多态(设计时多态):方法重载。 (2) 运行时多态:JAVA运行时系统根据调用该方法的实例的类型来决定选择调用哪个方法则被称为运行时多态。(我们平时说得多的事运行时多态,所以多态主要也是指运行时多态) 运行时多态存在的三个必要条件: 一、要有继承(包括接口的实现);二、要有重写;三、父类引用指向子类对象。 多态的好处: 1.可...

weixin_30596023的博客 1166

在 SAP S/4HANA 本地部署和私有云里预览 RAP Travel App:为什么 ADT 发不出去,以及如何用 /IWFND/V4_ADMIN 正确发布 OData V4 Service

在SAP S/4HANA On-Premise/Private Cloud环境中,通过ADT直接发布RAP服务的本地端点常会失效。这是因为系统治理策略要求必须通过SAP Gateway Foundation(事务码/IWFND/V4_ADMIN)发布Service Group,而非开发者本机测试模式。本文详解了该流程的必要性:Service Group是OData V4服务的发布单元,涉及后端登记(/IWBEP/V4_ADMIN)和前端发布(/IWFND/V4_ADMIN)两个环节。提供了从ADT跳转SAP

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 269

【Java 基础】:三大特征之多态

本文详细介绍了Java中的多态性,包括多态的基本概念、继承、多态的实现条件、重写、向上转型等。多态性允许父类引用指向子类对象,提供了代码的灵活性和可扩展性,但也存在不能使用子类特有功能的缺点。通过实例展示了如何实现和利用多态性。

island1314的博客 2781

LVGL 蜂巢气泡菜单(Hex Menu)

h。

摸鱼专家 177

华为OD技术面真题 - 数据库Mysql - 1

汇总华为OD技术面高频Mysql相同问题,提供详细解答。

qq_45776114的博客 1085

零基础入门Java之多态

本文详细介绍了Java中的多态特性及其实现方式。多态是指同一行为在不同对象上产生不同结果,主要通过继承体系、方法重写和父类引用调用实现。文章重点讲解了方法重写的规则与注意事项,区分了重写与重载的差异,并通过代码示例演示了向上转型和向下转型的应用场景及安全性问题。同时分析了多态的优势(降低代码复杂度、提高可扩展性)和局限性(运行效率降低、属性无多态性等),特别强调了在构造函数中使用实例方法可能引发的问题。最后总结了使用多态时的最佳实践,帮助开发者更好地理解和运用这一面向对象编程的核心特性。

su17643217590的博客 6191

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

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

Java基础-多态

多态是Java面向对象编程中非常重要的特性,它提高了代码的可扩展性和可维护性。通过多态,我们可以:编写更通用的代码更容易扩展系统功能降低模块间的耦合度提高代码的复用性。

Jianshu_Ma的博客 1701

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Java基础之Java的多态

在本文中,我们深入探讨了Java多态性的概念、实现方式以及它在面向对象编程中的重要性。多态性是Java语言的核心特性之一,它允许我们通过父类引用调用子类的方法,从而增强了代码的灵活性和可扩展性。我们学习了多态的两种类型:编译时多态和运行时多态,以及它们在实际编程中的应用。编译时多态主要通过方法重载和重写实现,而运行时多态则依赖于继承和方法重写。同时,我们也指出了多态的一些限制,例如无法访问子类特有的方法和属性。

daadaddc的博客 2311

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

详解 Java 基础的多态机制

多态(Polymorphism)是面向对象编程(OOP)的三大核心特性之一,指同一操作作用于不同对象时,可以产生不同的行为。编译时多态:方法重载(Overload),根据参数列表在编译时确定调用哪个方法。运行时多态:方法重写(Override),通过继承和接口实现,在运行时动态绑定具体方法(本文重点// 父类:动物基类// 抽象方法:强制子类实现叫声// 子类:狗@OverrideSystem.out.println(getName() + ":汪汪汪!");// 特有方法。

qq_45729306的博客 1万+

深入浅出 Java 多态:从原理到实践的全面解析

子类对象可以赋值给父类引用变量,通过父类引用调用方法时,实际执行的是子类重写后的方法。简单来说,就是 “编译时看父类,运行时看子类// 父类:交通工具// 统一行为:行驶System.out.println("交通工具正在行驶");// 子类:汽车(继承交通工具)// 重写行驶行为:汽车的实现@OverrideSystem.out.println("汽车靠四个轮子滚动行驶");// 子类:自行车(继承交通工具)// 重写行驶行为:自行车的实现@Override。

asad6的博客 1377

Java多态性:Java什么是多态?

多态性是面向对象编程的又一个重要特征,它是指在父类中定义的属性和方法被子类继承之后,可以具有不同的数据类型或表现出不同的行为,这使得同一个属性或方法在父类及其各个子类中具有不同的含义。 对面向对象来说,多态分为编译时多态和运行时多态。其中编译时多态是静态的,主要是指方法的重载,它是根据参数列表的不同来区分不同的方法。通过编译之后会变成两个不同的方法,在运行时谈不上多态。而运行时多态是动态的,它是通...

jijiangpeng的博客 5550

Java基础之多态深入解析

Java之多态详解 多态的基本概念 同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。简单的说:就是用基类的引用指向子类的对象。 多态的优点 消除类型之间的耦合关系 可替换性 可扩充性 接口性 灵活性 简化性 多态存在的三个必要条件 继承 重写 父类引用指向子类对象 比如:Parent p = new Child(); 1. 当使用多态方式调用方法时...

努力努力再努力L 312

[Java入门] 多态

我们将子类对象向上转型后就不能再使用子类特有的方法了,但是,有时我们需要调用子类特有的方法,那么仅需将向上转型后的子类对象再次强转为子类引用,就可以使用子类特有的方法了,这就是向下转型。这就体现出了向下转型的不安全,所以Java中为了提高向下转型的安全性,引入了 instanceof ,如果该表达式为true,则可以安全转换。:也称为后期绑定(晚绑定),即在编译时,不能确定方法的行为,需要等到程序运行时,才能够确定具体调用那个类的方法。与前面的代码是类似的,它们都是通过方法传参的方式实现向上转型的。

DerrictC的博客 833

Java基础_多态

父类的引用指向了子类的对象语法:父类类型引用名 = new 子类类型();在向上转型时,父类引用指向了子类的对象,但是不能访问子类中特有的属性和方法,所以可以将父类引用向下转型,这样编译类型和运行类型就都是子类了,访问属性和方法的顺序恢复:都是从子类开始找,如果找不到再从父类找数组的定义类型为父类类型,里面保存的实际元素类型为子类类型。

Sun的个人博客 1260

Java多态全面解析:从入门到精通

摘要:多态是面向对象三大特性之一,指同一行为具有不同表现形式。其实现需要继承/实现关系、方法重写和父类引用指向子类对象。多态使用时遵循"编译看左,运行看左(变量)或右(方法)",但无法直接调用子类特有方法,需通过向下转型实现。转型分向上转型(自动)和向下转型(强制),后者可能引发ClassCastException,可用instanceof进行类型检查。案例展示如何通过多态简化代码,使一个方法能处理多种子类对象,同时调用各自特有方法。

sxjaaa的博客 693
上一篇: Java设计模式:深入理解面向接口编程(那些年的面向接口编程,DIY电脑为例)
下一篇: Python纯手写版本的KMeans算法实现,没有使用numpy库,使用matplotlib可视化测试
猿说猿道
博客等级 码龄8年 120粉丝 55原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值