自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(61)
  • 收藏
  • 关注

原创 如何在 VSCode 中禁止滚动超出最后一行

在默认的VSCode设置中,当你滚动到一个文件的最后一行时,你还可以继续向下滚动,将最后一行代码滚动到编辑器窗口的上方。VSCode是一款强大的代码编辑器,其自定义设置的灵活性使得每个开发者都能根据自己的习惯配置出最合适的工作环境。通过上述简单的步骤,你就可以实现禁止在VSCode中滚动超出最后一行的设置。点击左上角的 “文件(File)” 菜单,然后选择 “首选项(Preferences)”,在弹出的子菜单中选择 “设置(Settings)”。你只需要取消这个选项的勾选,就可以禁止滚动超出最后一行了。

2023-05-14 21:25:15 759

原创 理解纯is-a关系和is-like-a关系

这段文字的目的是让你了解在设计类的继承结构时,可能会遇到这两种不同的情况。在日常开发过程中,根据问题的具体需求,你可能会遇到这两种情况。关键是理解这两种关系的优缺点,并在实际情况中做出合适的设计选择。这种方法在某些情况下也是有用的,但它有一个缺点。在某些情况下,你可能需要重新发现对象的确切类型,以便访问该类型的扩展方法。这段文字主要在讨论两种不同的继承关系:纯 is-a 关系和 is-like-a 关系。标签: #Java #多态 #继承 #is-a关系 #is-like-a关系。

2023-05-13 00:29:58 235

原创 避免接口组合时的方法名冲突

如果多个接口中有相同的方法名,但实现逻辑相同,可以使用Java 8引入的默认方法特性,在接口中提供默认实现。将通用的方法放在基本接口中,然后让更具体的接口继承这些基本接口。这样可以减少方法名冲突的可能性,同时提高代码的可读性和可维护性。:在团队中制定并遵循一致的命名规范,例如在方法名前加上接口名称的缩写,以区分不同接口中的方法。:确保接口方法的命名清晰明了,尽量表达出方法的作用和所属领域。通过采用这些策略,可以在很大程度上避免接口组合时方法名冲突,提高代码的可读性和可维护性。时间:2023-04-18。

2023-05-13 00:29:28 309

原创 理解接口(Interface)的抽象概念

我注意到一件事,在我们学习 onjava8这本书的时候,里面是不是的会提及接口(interface)这一概念,但是有的时候似乎并不是说的关键字 interface,而是一种抽象概念的接口—用以表达的是一个类对外开放的那些实现的方,是一种基于 java 面向对象思想而设计的一种抽象层面,即,对外提供接口而不暴露具体实现的这么一种思想,的表述。创建的接口类型,我们可以定义一组方法,表示一种规范或协议,实现该接口的类需要遵循这个规范。总之,Java中的接口(interface)既可以表示一种具体的类型(关键字。

2023-05-13 00:28:47 209

原创 面向对象设计-开闭原则

遵循开闭原则可以使软件更容易适应变化,因为在添加新功能时,不需要对现有代码进行大量修改。然而,作为一种理念,开闭原则提醒我们在设计软件时要关注可维护性和可扩展性,尽量降低对现有代码的修改。这意味着在设计软件时,应当允许在不修改现有代码的情况下,添加新功能或者行为。抽象和封装:通过定义抽象类或接口,将可变的部分与不可变的部分分离,使得在不修改现有代码的情况下,可以通过继承或实现接口来扩展功能。组合和聚合:通过将不同的功能模块组合在一起,可以在不修改现有代码的情况下,为系统添加新功能。

2023-05-13 00:27:21 87

原创 如何在 Python 中实现字符串的分割、判断与去重

要判断字符串是否满足特定条件,可以使用 Python 提供的一些内置方法,如 isdigit ()、isalpha () 等。这些方法返回一个布尔值,表示字符串是否满足相应条件。本文将介绍如何在 Python 中实现字符串的分割、判断与去重,以帮助您在实际项目中更高效地处理字符串数据。Python 提供了 split () 方法,用于将字符串分割成多个子字符串。Python 提供了丰富的字符串处理方法,可帮助您轻松实现字符串的分割、判断和去重操作。标签: #Python #字符串 #分割 #判断 #去重。

2023-05-13 00:26:34 956

原创 抽象方法与接口在概念上的异同

在一定程度上,我是否可以理解为一个父类中的抽象方法就是这个父类承诺的这个类的子类们自身要实现的所有方法,如果将接口比喻成一个标签用以表示一个类承诺实现了这个标签所代表的所有方法,那么抽象方法本身也是一种形式的标签。与接口相比,抽象方法在父类中定义,而接口是一种独立的结构,可以被多个类实现。接口也可以看作是一种"标签",表示实现了该接口的类承诺实现了接口中定义的所有方法。标签: #Java #抽象类 #抽象概念 #接口 #约束机制 #继承 #抽象方法 #父类 #子类。时间:2023-04-14。

2023-05-13 00:26:04 54

原创 抽象类的目的和作用

在这种模式中,抽象类定义了一个算法的框架,将一些具体的实现步骤延迟到子类中。这样,子类可以在不改变算法结构的情况下,重定义某些特定的实现步骤。:抽象类可以包含一些共享的状态(属性)和方法实现,这些代码可以被子类继承和复用。这样,我们可以把一些通用的功能放在抽象类中,减少重复代码,提高代码的可维护性。:抽象类可以包含抽象方法,这些方法定义了子类应该实现的接口规范。:抽象类可以作为一种多态机制的实现手段。通过让子类重写抽象类中的方法,我们可以在运行时通过抽象类引用实际的子类对象,实现动态绑定和多态行为。

2023-05-09 10:28:24 376

原创 在选择接口实现和继承关系时的考虑因素

所以我们可以说,在选用接口实现还是继承关系上,我们可以通过判断到底是各各类之之间只是行为上相似,还是在不仅仅行为上、状态上也有信息需要共享,是这样么?如果类之间仅仅在行为上相似,但没有共享的状态或方法实现,那么使用接口实现更合适。接口可以定义一组共享的行为,强制实现类遵循这些行为,但不强制它们共享任何状态或方法实现。总之,在选择使用接口实现还是继承关系时,关键是了解类之间的关系,以及它们之间需要共享的信息。如果类之间存在共享的状态(属性)和行为(方法实现),那么使用继承关系可能更合适。

2023-05-09 10:27:17 156

原创 使用继承复用共享代码的例子

调用来调用父类的构造方法,这样我们就可以在子类中设置。方法访问这些属性,从而在子类中实现自定义行为,如。类添加新功能,同时保持共享代码的一致性。标签: #Java #继承 #代码复用。子类中复用这些共享的代码。时间:2023-04-14。,以及一些共享的方法。注意,在子类中我们使用。继承使我们能够在不修改。

2023-05-09 10:27:02 69

原创 在 VS Code 中使用 Spring Boot Extension Pack 创建 Spring Boot 项目

在命令面板中输入 “Spring Initializr”,然后选择 “Spring Initializr: Generate a Maven Project”(或 “Spring Initializr: Generate a Gradle Project”,取决于你喜欢的构建工具)。至此,你已经使用 VS Code 的 Spring Boot Extension Pack 创建了一个 Spring Boot 项目。输入 Group ID,这通常是你的公司或项目的域名反转,例如 “com.example”。

2023-05-09 10:26:41 650

原创 局部内部类的使用

也是一种解决方案,但这个例子主要是为了展示局部内部类的概念和使用方法。在实际开发中,如果局部内部类的功能可以简单地用一个变量或简单的方法来实现,那么采用更简单的方案通常是更好的选择。当一个类仅在某个方法中有用,而在方法外部没有任何作用时,可以考虑使用局部内部类。局部内部类是定义在方法中的类,其作用范围仅限于该方法。这样做的目的是将类的实现细节隐藏在方法中,使得类在方法外部无法访问。方法中有意义,因此将其定义为局部内部类是合理的。),这使得局部内部类可以与方法的其他部分共享状态。方法使用了一个局部内部类。

2023-05-09 10:26:10 83

原创 构造器中调用动态绑定方法的隐患

这些bug隐蔽的原因是,程序员可能没有意识到在构造器中调用动态绑定方法会导致这样的问题,而且问题表现为数据不一致,这使得在调试时难以发现问题的根源。因此,在构造器中调用动态绑定方法可能导致难以追踪和定位的bug。如果在构造器中调用了动态绑定方法,就会用到那个方法的重写定义。然而,调用的结果难以预料因为被重写的方法在对象被完全构造出来之前已经被调用,这使得一些 bug 很隐蔽,难以发现。调用构造器中动态绑定方法的结果难以预料,是因为在对象完全构造出来之前,重写的方法就已经被调用。类的构造器尚未执行,

2023-04-30 04:38:37 69

原创 多态与接口的实际生产案例

通过这个例子,我们可以看到多态和接口在实际生产中的应用,以及它们是如何提高代码的灵活性和可扩展性的。以下是一个简化的网球场地预约系统的例子,以展示多态和接口在实际生产中的应用。在实际生产中,我们可以利用这种设计更轻松地添加新的支付方式,例如。多态使得我们可以将不同支付方式的实现类对象赋值给。接下来,我们为不同的支付方式创建实现类,例如。类提供了具体的实现。类型的引用,从而在运行时动态调用正确的方法。在这个例子中,我们使用了接口和多态的概念。类添加新的支付方式,而不需要修改。等,只需要创建新的实现类并实现。

2023-04-30 04:37:32 76

原创 多态的实现机制

对于继承自父类的方法,子类中若有重写的方法,虚方法表中的对应条目将被子类方法替换。当我们通过一个引用调用一个方法时,JVM会根据引用的实际对象类型查找对应的虚方法表,然后调用表中对应的方法。我注意到上述的代码中 sup.field = 0, sup.getField() = 1,这样我对于 Java 底层实现多态的机制有些迷惑,他是如何确定到底是哪个方法要被执行的呢,是否是有个存储方法的栈之类的呢?要注意的是,多态仅适用于方法调用,不适用于字段访问。然而,只有普通的方法调用可以是多态的。

2023-04-30 04:37:01 68

原创 如何查看项目有没有使用spring boot框架

在项目的 pom.xml 文件中查找是否存在 spring-boot-starter-parent 或 spring-boot-starter-web 等 Spring Boot 相关的依赖。在上述示例代码中,可以看到该项目的父依赖为 spring-boot-starter-parent,并且项目依赖了 spring-boot-starter-web,这表明该项目是一个基于 Spring Boot 框架构建的 Web 项目。标签: #java #spring #SpringBoot。

2023-04-30 04:36:59 3441

原创 多态、接口与抽象类的关系与意义

当我们定义一个抽象类时,我们可以预见到子类需要实现某些共同的行为,但这些行为的具体实现可能因子类而异。通过抽象方法,我们可以确保所有的子类都会实现这些行为,而不需要在每个子类中重复编写相同的代码。对于你提到的“为什么还有implements这一设计”的问题,这是因为Java不支持多重继承,即一个类不能继承多个父类。总之,接口和抽象类都是实现多态的方式,但它们有不同的目的和使用场景。多态是一种编程范式,它允许我们使用一个通用的接口引用不同类型的对象,并在运行时动态调用相应的方法。例如,在上述的例子中,

2023-04-30 04:36:28 118

原创 使用抽象类阻止实例化

在实际开发过程中,有时候我们希望一个类仅仅作为其他类的基类,而不允许直接创建该类的实例。即使这个抽象类没有抽象方法,它仍然不能被实例化,从而确保了这个类仅作为基类存在。可以将一个不包含任何抽象方法的类指明为 abstract,在类中的抽象方法没啥意义但想阻止创建类的对象时,这么做就很有用。,该类包含一些共享的属性和方法,但我们希望用户只能创建具体类型的员工实例(如。例如,假设我们有一个系统,其中包含各种类型的员工。这是有用的,可是这么做的意义是什么呢,在实际开发过程中,能举个例子么?在这个例子中,我们将。

2023-04-30 04:35:25 65

原创 为什么不使用接口实现eat方法

例如,如果Animal类包含一些共享的状态(属性)和方法实现,那么使用继承将使我们能够更轻松地在子类中复用这些共享代码。总之,在确定是否使用接口或继承时,需要考虑类之间的关系、代码重用、以及预期的扩展性。根据具体情况,我们可能会选择实现接口,或者继承一个基类,或者同时使用这两种方法。如果我们认为 Animal 类不需要包含任何默认实现或共享状态(属性),那么使用接口可能是一个更合适的选择。在某些情况下,使用接口确实是一个更好的选择,尤其是当我们希望保证类遵循某个特定的约定(比如具有。

2023-04-30 04:34:51 79

原创 zsh command not found hexo

如果您仍然遇到“command not found”的错误,那么可能是因为Hexo的可执行文件没有被添加到系统路径中。这个错误通常是由于 Hexo 没有正确安装或者没有将其添加到系统路径中导致的。如果您看到了 Hexo 的版本信息,那么说明 Hexo 已经成功安装。接下来,您可以继续按照之前的说明操作。这将在全局范围内安装 Hexo 命令行工具。在安装过程中,可能需要管理员权限。这将显示 npm 的全局安装路径。Hexo 的可执行文件通常位于该路径下的。标签: #zsh #hexo #环境配置。

2023-04-30 04:34:13 355

原创 使用GitHub Pages搭建个人博客网站

根据您的需求,我将为您提供一个简单的执行框架。在执行过程中,您可以随时告诉我您已完成的步骤,我会为您提供详细的说明和指导。标签: #GitHub #GitHubPages #个人博客 #Markdown #静态网站。现在,请按照上述执行框架的步骤操作。完成每一步后,请告诉我,我会为您提供详细的说明和指导。创建一个GitHub帐户并设置GitHub Pages。使用Markdown编写博客文章。时间:2023-04-14。设置和配置静态网站生成器。选择一个静态网站生成器。

2023-04-30 04:33:10 125

原创 使用hexo发布博客

标签: #hexo #github #GitHubPages #shell #blog。目录下创建一个新的 Markdown 文件,您可以用文本编辑器打开它。完成这些步骤后,您的Markdown文章就会发布到Hexo博客上。这将把生成的静态页面推送到您的 GitHub Pages 仓库。文件夹中生成静态网页文件。时间:2023-04-18。

2023-04-30 04:32:19 153

原创 Tkinter 入门:基本组件和概念介绍

Tkinter 是 Python 的标准图形用户界面(GUI)库,用于创建桌面应用程序。它提供了许多内置的组件,如按钮、标签和文本框等,以帮助您创建丰富的用户界面。在本文中,我们将介绍 Tkinter 的基本组件和概念,以便您快速入门。要向窗口添加组件,您需要首先创建组件实例,然后将其添加到窗口。标签: #Tkinter #Python #GUI #入门 #基本组件。这将在窗口中添加一个标签和一个按钮。函数创建了一个新的顶级窗口(称为根窗口),而。函数使窗口保持打开状态,并处理用户交互。

2023-04-26 06:47:29 427

原创 Tkinter 中的布局管理:grid () 与 pack () 的区别与用法

Tkinter 提供了几种布局管理方法,如 grid () 和 pack ()。Pack () 提供了一些选项,如 side、anchor、fill、expand 等,以实现不同的布局效果。要使用 grid (),需要在组件上调用 grid () 方法,并传递 row、column 参数指定组件所在的单元格。Grid () 是一种基于网格的布局管理方法。要使用 pack (),需要在组件上调用 pack () 方法,并传递可选参数,如 side、anchor、fill、expand 等。

2023-04-26 06:47:25 1860

原创 Set<Integer> 转换为一个 int 数组

这里我们使用 Java 8 引入的 Stream API。标签: #Java #Set #数组。对象转换为对应的基本类型。时间:2023-04-18。

2023-04-26 06:45:27 962

原创 Python 列表操作:添加、删除、修改与访问元素的方法

Python 的列表(list)是一种可变、有序的数据结构,常用于存储和操作一系列相关数据。在本文中,我们将介绍如何在 Python 中对列表执行添加、删除、修改和访问元素的操作。要访问列表中的元素,可以使用索引。正索引从 0 开始,负索引从 -1 开始。标签: #Python #列表 #添加 #删除 #修改 #访问。要修改列表中的元素,可以使用索引直接为其分配一个新值。时间:2023-04-22。

2023-04-26 06:45:18 1232

原创 onJava8-接口-摘录

然而,使用接口的第二个原因与使用抽象基类相同:防止客户端程序员创建这个类的对象,确保这仅仅只是一个接口。当有必要时才应该使用接口进行重构,而不是到处添加额外的间接层,从而带来额外的复杂性。这种复杂性非常显著,如果你让某人去处理这种复杂性,只是因为你意识到“以防万一”而添加新接口,而没有其他具有说服力的原因——好吧,如果我碰上了这种设计,就会质疑此人所作的所有其他设计了。因此,任何使用某特定接口的代码都知道可以调用该接口的哪些方法,而且仅需知道这些。认为接口是好的选择,从而使用接口不用具体类,这具有诱惑性。

2023-04-26 06:44:47 49

原创 Java中的回调机制及其优势

回调(Callback)是一种编程模式,它允许将一个函数(或方法)作为参数传递给另一个函数(或方法)。当被调用的函数执行完毕后,会调用传递进来的回调函数,以完成某些特定任务或通知调用者任务已完成。关于 Java 没有回调的说法,并不准确。虽然回调有很多好处,但过度使用回调可能导致代码变得难以理解和维护,这种现象被称为“回调地狱”。事件驱动编程:回调可以用来实现事件驱动编程,当特定事件发生时触发相应的回调函数。自定义行为:通过将回调函数作为参数传递,可以让调用者自定义函数的行为,提高代码的复用性和灵活性。

2023-04-26 06:43:21 610

原创 Java中this的使用

关键字用于引用当前对象,它在解决命名冲突、调用其他构造器和实现链式方法调用等场景中非常有用。是一个特殊的关键字,它可以在类的实例方法或构造器中使用,用于引用当前对象。在这个例子中,有两个构造器。第一个构造器接受一个。标签: #Java #this关键字。来引用实例变量,从而避免命名冲突。在这个例子中,构造函数的参数。时间:2023-04-18。调用第二个构造器,将。

2023-04-26 06:43:08 101

原创 Fold Level [VScode 扩展推荐]

时间:2023-04-19标签: #VSCode #ExtensionPack。

2023-04-26 06:42:26 74

原创 char 与 character 有什么区别 java

是一个封装类,为字符操作提供了更丰富的方法。在实际编程中,根据需求选择使用哪种类型。数据类型进行了封装,提供了一系列实用方法,例如字符分类、转换大小写等。是 Java 的一个封装类(wrapper class),它对。标签: #java #char #character #封装类。是 Java 中的原始数据类型,用于存储单个字符,而。时间:2023-04-24。

2023-04-26 06:41:08 481

原创 bashrc 与 zshrc的区别

当您打开一个新的终端会话时,系统会自动加载这些配置文件,从而应用您为 shell 定义的任何自定义设置、别名、环境变量等。:Zsh(Z shell)是另一种流行的Unix shell,它为用户提供了一些额外的功能,如命令补全、主题和插件支持。:Bash(Bourne Again Shell)是许多Linux发行版中默认的shell。它可以包含您希望在每个新的终端会话中自动执行的命令和设置,例如定义别名、设置环境变量和更改提示符样式。文件可能是因为您的系统使用Zsh作为默认shell。(Bash 用户)和。

2023-04-26 06:40:52 4781 1

原创 Java中为什么没有虚字段表来实现方法调用和字段访问的一致性?

方法是用于定义对象的行为的,它们可以被子类覆盖以实现不同的行为。为了实现多态,Java引入了虚方法表,使得方法调用在运行时可以根据实际对象类型执行相应的方法。将字段设置为私有并通过方法(getter和setter)访问,是一种常见的封装实践,以确保字段访问的正确性和安全性。在Java中,编译时字段访问和运行时方法调用的不同行为是有意为之,以确保代码的可读性、可维护性和执行效率。虽然在某些情况下,实现一个虚字段表似乎能让方法调用和字段访问的行为保持一致,但这并不符合 Java 的设计原则。

2023-04-24 07:18:25 83

原创 Java中static、final和private方法为什么不是动态绑定

因此,当调用静态方法时,编译器可以在编译时确定要调用哪个类的静态方法。因此,当调用一个private方法时,编译器可以在编译时确定要调用的具体实现。这意味着,当调用一个final方法时,编译器可以确保在编译时确定要调用的具体实现,而无需等到运行时去查找。在Java中,静态方法、final方法和private方法(隐式final)都不是动态绑定的,而是静态绑定的。综上所述,由于静态方法、final方法和private方法在编译时就可以确定具体的实现,它们不需要动态绑定,而是采用静态绑定。

2023-04-24 07:17:32 135 1

原创 is-like-a关系中向上转型的示例

在这个方法中,我们不关心传入对象的具体类型,只要它是 Animal 或其子类即可。现在,我们可以创建 Dog 和 Bird 对象,并将它们向上转型为 Animal 类型,传递给。为了实现这个功能,我们需要重新确定对象的类型,然后调用相应的扩展方法。注意,这种类型检查和向下转型的操作会降低代码的灵活性,并可能导致不易维护的代码。在这个例子中,向上转型允许我们将Dog和Bird对象视为Animal对象,并通过。,这个方法接受一个 Animal 对象,并调用它的。方法,因为这些方法不属于Animal类的接口。

2023-04-24 07:17:00 40

原创 Path 与 Paths 的关系与区别

为什么会存在两个歧义性很高的两个包在同一个包下,二者的功能的区别是什么。是一个接口,表示文件系统中文件或目录的路径。它提供了一种在文件系统中导航和操作文件的方法。对象包含了路径信息,可以用来创建、删除、读取和修改文件或目录。虽然它们的名字很相似,但它们的功能是互补的。虽然它们的名称很相似,但它们具有不同的功能和用途。在这个例子中,我们使用了两个不同的类,它们都在。对象,以便在文件系统中进行操作。

2023-04-24 07:15:14 226

原创 StringBuilder存在的意义是什么

时间:2023-04-24标签: #Java #StringBuilder #StringBuffer #String #MutableStrings #Performance #ThreadSafety #JavaStringBuilder在 Java 编程语言中,处理字符串是一个常见任务。为了实现更高效的字符串操作,Java 提供了多种字符串处理类,如String, 和。本篇博客将重点介绍类及其与的关系。

2023-04-24 07:14:21 150

原创 unicode

Unicode 是一种字符集,用于表示和处理世界上大多数书面语言中的文本。在 Unicode 中,英文字符的编码范围在 U+0020 到 U+007E 之间,包括了英文字母、数字、标点符号以及一些其他特殊字符。请注意,Unicode 字符集包含了许多其他字符,不仅仅是英文字符。它包括了其他语言的字符、表情符号、数学符号等等。这些数字的 Unicode 编码从 U+0030(数字 0)开始,依次递增到 U+0039(数字 9)。这些字符主要包括一些特殊字符和标点符号,以及英文大小写字母的分界点。

2023-04-24 07:14:08 3585

原创 Visual Studio Code 中的 Source Actions 功能简介

它们可以帮助您自动执行常见的代码重构和改进任务,例如排序导入、移除未使用的导入、自动生成方法实现等。这些功能可以提高开发效率,减少手动修改代码的需求。例如,在使用 Java 时,可以安装 “Java Extension Pack” 扩展来启用这些功能。要使用 Source Actions,您可以右键单击编辑器中的代码,然后选择 “Source Action” 菜单。并输入"Source Action" 后,相应的后面有一个齿轮图标,点击该图标按钮可以在弹出的页面中为该功能设置快捷键,例如,

2023-04-24 07:13:18 818

原创 为什么Integer.toString(i)是静态方法而不是i.toString()

设计为静态方法,主要是为了解决基本类型与包装类之间的差异,提高性能,并提供更简便的使用方式。是基本类型,而非对象。基本类型没有方法,因此不能像对象一样调用方法(如。类型值转换为字符串表示时,使用静态方法可以避免创建不必要的。:静态方法可以直接使用类名调用,而无需创建对象。标签: #Java #Integer #静态方法。这会产生额外的对象创建和垃圾回收开销。为了解决这个问题,Java提供了。包装类,它包含一些静态方法,如。时间:2023-04-18。

2023-04-24 07:12:47 175

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除