java大作业(9)--实现银行基本操作(第一遍)

一.题目:

二.代码:

实现代码:
import java.util.Date;
//银行账户类
class Account{
    public String accountid;
    public String name;
    public double balance;
    public Date creatTime;

    public Account(String accountid,String name, double balance){
        this.accountid=accountid;
        this.name=name;
        this.balance=balance;
        this.creatTime=new Date();//使用系统时间作为账户建立时间。
    }
    //存款
    public void deposit(double amount){
        balance=balance+amount;
    }
    //取款
    public void withdraw(double amount){
        if(balance>=amount)
            balance=balance-amount;
        else
            System.out.println("余额不足!");
    }
    //转账
    public void transfer(Account receiver,double amount){
        if(balance>=amount)
        {
            balance=balance-amount;
            receiver.deposit(amount);
            System.out.println("转账成功!");
        }
        else{
            System.out.println("余额不足,转账失败!");
        }
    }
    //查询余额
    public double getBalance(){
        return balance;
    }
}
//定期账户类
class FixedTermAccount extends Account{
    private int term;
    public FixedTermAccount(String accountid,String name,double balance,int term){
        super(accountid,name,balance);
        this.term=term;
    }
    //重写取款方法

    public void withdraw(double amount){
        Date now=new Date();
        long diff=now.getTime()-this.creatTime.getTime();//获取账户建立时间到现在的时间差
        long days=diff/(1000*60*60*24);//转换为天数
        if (days>=term*365) {
            super.withdraw(amount);//到期才能取钱
        }
        else{
            System.out.println("定期账户未到期,不能取款!");
        }
    }

}
//信用卡账户类
class CreatitCardAccount extends Account{
    private double overdraft;
    public CreatitCardAccount(String accountid,String name,double balance ,double overdraft){
        super(accountid,name,balance);
        this.overdraft=overdraft;
    }
    //重写取款方法

    public void withdraw(double amount){
        if(balance+overdraft>=amount){//考虑透支额度
            balance=balance-amount;
        }
        else{
            System.out.println("超出信用额度,取款失败");
        }
    }
    //重写转账方法

    public void transfer(Account receiver ,double amount){
        System.out.println("信用卡账户不能进行转账!");
    }
}
测试代码:
public class AccountManager{
    public static void main(String[] args){
        //创立两个用户
        Account account1=new Account("001","张三",1000);
        Account account2=new Account("002","李四",300);
        //分别存入500元
        account1.deposit(500);
        account2.deposit(500);
        //张三取出200元
        account1.withdraw(200);
        //张三给李四300元
        account1.transfer(account2,300);
        //显示余额
        System.out.println("张三的余额:"+account1.getBalance());
        System.out.println("李四的余额:"+account2.getBalance());
        //创建定期账户和信用卡账户进行操作
        FixedTermAccount count1=new FixedTermAccount("001","张三",3000,3);
        CreatitCardAccount count2=new CreatitCardAccount("002","李四",4000,10000);

        count1.withdraw(200);//测试count1取钱200元
        count1.withdraw(3000);//测试count1取钱3000元
        count1.deposit(5000);//测试count1存钱5000元

        count2.withdraw(12000);//测试count2取钱12000元
        count2.withdraw(20000);//测试count2取钱20000元
        count2.deposit(6000);//测试count2存钱6000元
        count2.withdraw(20000);//测试count2取钱20000元;
    }
}
输出:

三.解释:

实现代码:
第1行
import java.util.Date;

在Java中,import java.util.Date; 语句的作用是导入 java.util 包中的 Date 类,这样你就可以在你的代码中使用 Date 类而不需要每次都写出完整的类名 java.util.Date。

Date 类是Java的一个核心类,用于表示特定的瞬间,精确到毫秒。这个类通常用于表示日期和时间,特别是在没有更高级的日期和时间API可用时。

当你导入 Date 类后,你可以在你的代码中创建 Date 对象,比如用于记录某个事件发生的时间,或者用于比较两个日期等。

import java.util.Date;  
  
public class Example {  
    public static void main(String[] args) {  
        // 创建一个表示当前日期和时间的Date对象  
        Date now = new Date();  
          
        // 输出当前日期和时间  
        System.out.println("Current date and time: " + now);  
          
        // 创建一个表示特定日期和时间的Date对象  
        Date specificDate = new Date(123456789000L); // 这里的数字是毫秒数,表示从1970年1月1日00:00:00 GMT开始的毫秒数  
          
        // 输出特定日期和时间  
        System.out.println("Specific date and time: " + specificDate);  
    }  
}

在这个例子中,我们导入了 Date 类,并创建了两个 Date 对象:一个表示当前的日期和时间,另一个表示一个特定的日期和时间(通过传递一个长整型的毫秒数给 Date 构造函数)。

然而,值得注意的是,从Java 8开始,引入了新的日期和时间API(java.time 包),它提供了更强大、更灵活且类型安全的日期和时间处理功能。因此,在大多数现代Java应用中,你可能会更倾向于使用 java.time 包中的类,比如 LocalDateLocalTimeLocalDateTime 等,而不是 java.util.Date。但 Date 类仍然在某些旧的代码库和API中被广泛使用。

第3~7行
class Account{
    public String accountid;
    public String name;
    public double balance;
    public Date creatTime;

定义了Account类,然后没有封装属性,用了public来公开属性。

所有这四个字段都是 public 的,这意味着它们可以从类的外部直接访问和修改。然而,这种设计通常不被推荐,因为它破坏了封装性,这是面向对象编程的一个基本原则。封装性意味着隐藏对象的内部状态(即字段的值)并仅通过公共方法来访问和修改这些值。这有助于保护数据的完整性和安全性,并提供更清晰、更易于维护的代码。

这个 Account 类是一个简单的Java类,用于表示银行账户。然而,由于所有字段都是公共的,它违反了封装性的原则。为了改进这个类,应该将这些字段设置为 private

private String accountid;  
    private String name;  
    private double balance;  
    private LocalDateTime createTime; // 修正拼写错误,并使用LocalDateTime  
第9-12行
    public Account(String accountid,String name, double balance){
        this.accountid=accountid;
        this.name=name;
        this.balance=balance;

初始化属性

第13行
this.creatTime=new Date();//使用系统时间作为账户建立时间。
  • 这行代码创建了一个新的Date对象(来自java.util包),该对象表示构造方法被调用时的系统当前时间,并将这个Date对象赋值给当前对象的creatTime属性。这行代码实际上是在记录账户创建的时间。
第16-18行
    public void deposit(double amount){
        balance=balance+amount;
    }

这段代码是Java语言中的一个方法定义,用于描述一个deposit(存钱操作,通常用于银行账户或类似的金融应用中。下面是对这段代码的详细解释:

方法定义

  • public: 这是一个访问修饰符,它表明这个方法可以从任何其他类中被访问。
  • void: 这表明该方法没有返回值。
  • deposit: 这是方法的名称,表示这是一个存款方法。
  • (double amount): 这是方法的参数列表。它接受一个double类型的参数amount,代表要存入的金额。

方法体

  • balance=balance+amount;: 这是方法体中的唯一一条语句。它表示将当前的balance(账户余额)与传入的amount(存款金额)相加,并将结果赋值回balance。这样,balance就被更新为新的余额了。

第20-15行
    public void withdraw(double amount){
        if(balance>=amount)
            balance=balance-amount;
        else
            System.out.println("余额不足!");
    }

这段代码定义了一个withdraw(取款)方法,用于从银行账户中提取指定金额的资金。以下是对该方法的详细解释:

方法定义

  • public: 方法的访问修饰符,表示该方法可以从任何其他类中被访问。
  • void: 表示该方法没有返回值。
  • withdraw: 方法的名称,表示取款操作。
  • (double amount): 方法的参数,一个double类型的amount,表示要提取的金额。

方法体

  • if(balance>=amount): 这是一个条件判断语句,它检查当前的账户余额balance是否大于或等于要提取的金额amount
    • balance=balance-amount;: 如果余额足够(即balance >= amount),则从余额中减去提取的金额,更新账户余额。
  • else: 如果余额不足(即balance < amount),则执行下面的语句。
    • System.out.println("余额不足!");: 在控制台上打印一条消息,告知用户余额不足,无法提取所请求的金额。
第27-37行
    public void transfer(Account receiver,double amount){
        if(balance>=amount)
        {
            balance=balance-amount;
            receiver.deposit(amount);
            System.out.println("转账成功!");
        }
        else{
            System.out.println("余额不足,转账失败!");
        }
    }

 这段代码定义了一个transfer方法,用于从当前账户向另一个账户(receiver)转账指定金额(amount。下面是对该方法的详细解释:

方法定义

  • public: 方法的访问修饰符,表示该方法可以从任何其他类中被访问。
  • void: 表示该方法没有返回值。
  • transfer: 方法的名称,表示转账操作。
  • (Account receiver, double amount): 方法的参数列表,包括两个参数:
    • Account receiver: 一个类型为Account的对象,表示接收转账的账户。
    • double amount: 一个double类型的值,表示要转账的金额。

方法体

  • if(balance>=amount): 这是一个条件判断语句,它检查当前账户的余额balance是否大于或等于要转账的金额amount
    • balance=balance-amount;: 如果余额足够(即balance >= amount),则从当前账户的余额中减去转账的金额。
    • receiver.deposit(amount);: 将要转账的金额存入接收账户(receiver)。这里假设Account类有一个deposit方法用于存款。
    • System.out.println("转账成功!");: 在控制台上打印一条消息,告知用户转账成功。
  • else: 如果余额不足(即balance < amount),则执行下面的语句。
    • System.out.println("余额不足,转账失败!");: 在控制台上打印一条消息,告知用户由于余额不足,转账失败。
第39-41行
    public double getBalance(){
        return balance;
    }

这段代码定义了一个名为getBalance的公共方法,它返回当前账户的余额。下面是该方法的详细解释:

方法定义

  • public: 这是一个访问修饰符,表示这个方法可以从任何其他类中被访问。
  • double: 这是方法的返回类型,表示这个方法将返回一个double类型的值。
  • getBalance: 这是方法的名称,它遵循了Java中常见的命名约定,即使用“get”前缀来命名返回某个属性值的访问器方法。
  • (): 这是方法的参数列表,括号内为空表示这个方法没有参数。

方法体

  • return balance;: 这是方法的返回语句,它返回balance变量的当前值。balance是假设在Account类中定义的一个私有成员变量,用来存储账户的余额。
第44行
class FixedTermAccount extends Account{

FixedTermAccount extends Account 这段代码表示FixedTermAccount类是从Account类继承而来的。在Java中,继承是面向对象编程的一个核心概念,它允许一个类(称为子类或派生类)继承另一个类(称为父类或基类)的属性和方法。

在这个例子中,FixedTermAccount是子类,Account是父类。FixedTermAccount继承了Account类中的所有公共(public)和保护(protected)属性和方法,这意味着FixedTermAccount类的对象可以使用这些属性和方法,除非它们在FixedTermAccount类中被覆盖(重写)。

第45行
 private int term;

FixedTermAccount类中,如果你有一个私有成员变量term,它可能用来表示账户的固定期限。这个term变量可能以月、天或其他时间单位来衡量,具体取决于你的业务需求和系统设计。

第46-49行
public FixedTermAccount(String accountid,String name,double balance,int term){
        super(accountid,name,balance);
        this.term=term;
    }

基本继承

注意super传递

第52-62行
    public void withdraw(double amount){
        Date now=new Date();
        long diff=now.getTime()-this.creatTime.getTime();//获取账户建立时间到现在的时间差
        long days=diff/(1000*60*60*24);//转换为天数
        if (days>=term*365) {
            super.withdraw(amount);//到期才能取钱
        }
        else{
            System.out.println("定期账户未到期,不能取款!");
        }
    }

在你提供的withdraw方法中,你尝试根据账户的建立时间和当前时间之间的差异来判断是否达到了固定期限(term),从而决定是否允许取款。这里有几个问题需要注意:

  1. creatTime变量没有在代码中定义。它应该是一个Date类型的成员变量,用于存储账户的建立时间。你需要确保在FixedTermAccount类中定义了这个变量,并且在创建账户时对其进行了初始化。

  2. term变量被假设为以年为单位。但是,你的代码将term直接与天数相乘(term*365),这没有考虑到闰年的情况。一个更精确的方法是使用Calendar类来计算具体的日期差异。

  3. System.out.println用于输出错误信息到控制台。在实际应用中,更好的做法可能是抛出一个异常或者返回一个错误信息给调用者,以便调用者可以适当地处理这种情况。

第66-71行
class CreatitCardAccount extends Account{
    private double overdraft;
    public CreatitCardAccount(String accountid,String name,double balance ,double overdraft){
        super(accountid,name,balance);
        this.overdraft=overdraft;
    }

这一行定义了一个公共的构造方法,用于创建CreatitCardAccount对象。构造方法的名字与类名相同,它没有返回值(返回类型为void)。

  • 构造方法接受四个参数:accountid(账户ID),name(账户名),balance(账户余额),和overdraft(透支额度)。
  • super(accountid, name, balance);:这一行调用了父类Account的构造方法,并将accountidnamebalance作为参数传递给它。这是子类构造方法调用父类构造方法的常见方式,以确保父类中的属性和方法被正确初始化。
  • this.overdraft = overdraft;:这一行将构造方法参数中的overdraft值赋给类的overdraft属性。this关键字用于引用当前对象的属性和方法,以避免与参数名或局部变量名冲突。

需要注意的是,代码中有一个小错误:类名CreatitCardAccount可能是CreditCardAccount的拼写错误。在实际编程中,应该使用正确的拼写和命名规范来避免混淆和错误。

另外,从这段代码中我们不能看到Account类的具体实现,但可以推测Account类至少有一个接受accountidnamebalance作为参数的构造方法。

 

第74-82行
    public void withdraw(double amount){
        if(balance+overdraft>=amount){//考虑透支额度
            balance=balance-amount;
        }
        else{
            System.out.println("超出信用额度,取款失败");
        }
    }

 withdraw方法,这个方法用于从账户中取款。

  1. public void withdraw(double amount): 这是一个公共方法,名为withdraw,它接受一个double类型的参数amount,表示要取款的金额。方法没有返回值,所以返回类型为void

  2. if(balance+overdraft>=amount): 这是一个条件判断语句。它检查当前账户的余额(balance)加上透支额度(overdraft)是否大于或等于要取款的金额(amount)。如果是这样,说明账户有足够的资金(包括透支额度)来支持这次取款。

  3. balance=balance-amount;: 如果上面的条件成立,这行代码会从账户的余额中减去取款的金额。这样,账户的余额就会减少相应的金额。

  4. else: 如果上述条件不成立,即账户余额加上透支额度仍然不足以支持取款,那么会执行else块中的代码。

  5. System.out.println("超出信用额度,取款失败");: 这行代码会在控制台上输出一条消息,告诉用户因为超出了信用额度,所以取款失败。

 

第84-87行

    public void transfer(Account receiver ,double amount){
        System.out.println("信用卡账户不能进行转账!");
    }
}

在您提供的transfer方法中,您直接输出了一条消息,说明“信用卡账户不能进行转账!”。这意味着您有意地让这个transfer方法不做任何实际的转账操作,而是直接通知用户信用卡账户不支持转账功能。

在实际应用中,这种设计可能是基于业务规则或安全考虑的。信用卡账户通常不允许直接转账到其他账户,因为信用卡的主要用途是消费和透支,而不是作为资金转移的工具。然而,具体是否允许转账还取决于具体的银行业务规则和系统设计。 

测试代码:
public class AccountManager{
    public static void main(String[] args){
        //创立两个用户
        Account account1=new Account("001","张三",1000);
        Account account2=new Account("002","李四",300);
        //分别存入500元
        account1.deposit(500);
        account2.deposit(500);
        //张三取出200元
        account1.withdraw(200);
        //张三给李四300元
        account1.transfer(account2,300);
        //显示余额
        System.out.println("张三的余额:"+account1.getBalance());
        System.out.println("李四的余额:"+account2.getBalance());
        //创建定期账户和信用卡账户进行操作
        FixedTermAccount count1=new FixedTermAccount("001","张三",3000,3);
        CreatitCardAccount count2=new CreatitCardAccount("002","李四",4000,10000);

        count1.withdraw(200);//测试count1取钱200元
        count1.withdraw(3000);//测试count1取钱3000元
        count1.deposit(5000);//测试count1存钱5000元

        count2.withdraw(12000);//测试count2取钱12000元
        count2.withdraw(20000);//测试count2取钱20000元
        count2.deposit(6000);//测试count2存钱6000元
        count2.withdraw(20000);//测试count2取钱20000元;
    }
}

四.收获:

1.知道两个文件可以配合运行;

2.获取时间;

3.第一次弄那么长的代码,得复现5次,好好学习一下java;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

虚拟天空解决方案,创造出令人惊叹的换天效果

在汽车视频领域&#xff0c;如何打破传统拍摄限制&#xff0c;呈现出更具创意和想象力的画面&#xff0c;成为众多企业和创作者追求的目标。美摄科技作为业界领先的视频技术提供商&#xff0c;凭借其强大的AI技术和三维渲染引擎&#xff0c;推出了全新的虚拟天空解决方案&#…

MediaStream使用webRtc多窗口传递

最近在做音视频通话&#xff0c;有个需求是把当前会话弄到另一个窗口单独展示&#xff0c;但是会话是属于主窗口的&#xff0c;多窗口通信目前不能直接传递对象&#xff0c;所以想着使用webRtc在主窗口和兄弟窗口建立连接&#xff0c;把主窗口建立会话得到的MediaStream传递给兄…

分布式搭载博客网站

一.运行环境&#xff1a; IP主机名系统服务192.168.118.128Server-WebLinuxWeb192.168.118.131Server-NFS-DNSLinuxNFS/DNS 二.基础配置 1. 配置主机名&#xff0c;hosts映射 [rootserver ~]# hostnamectl set-hostname Server-Web [rootserver ~]# hostname Server-Web [r…

大模型LLM架构--Decoder-Only、Encoder-Only、Encoder-Decoder

目录 1 LLM演变进化树 2 每种架构的优缺点 2.1 Decoder-Only 架构 2.2 Encoder-Only 2.3 Encoder-Decoder 参考文献&#xff1a; 1 LLM演变进化树 基于 Transformer 模型以非灰色显示&#xff1a;decoder-only 模型在右边的浅蓝色分支&#xff0c;encoder-only 模型在粉色…

【学习】测试新项目该如何高效的展开测试?需要做哪些规划?

当我们收到测试项目时&#xff0c;如何高效地展开测试是我们作为测试人员所要面临的一大挑战。测试是软件开发过程中不可或缺的一环&#xff0c;它确保了产品的质量&#xff0c;降低了出现问题的风险&#xff0c;提高了用户的满意度。因此&#xff0c;我们需要制定合理的测试计…

操作教程丨MaxKB+Ollama:快速构建基于大语言模型的本地知识库问答系统

2024年4月12日&#xff0c;1Panel开源项目组正式对外介绍了其官方出品的开源子项目——MaxKB&#xff08;github.com/1Panel-dev/MaxKB&#xff09;。MaxKB是一款基于LLM&#xff08;Large Language Model&#xff09;大语言模型的知识库问答系统。MaxKB的产品命名内涵为“Max …

java对接IPFS系统-以nft.storage为列

引言 之前我们已经说过了、NFT.Storage是一个基于IPFS的分布式存储服务&#xff0c;专门用于存储和管理非同质化代币&#xff08;NFT&#xff09;相关的数据和资产。它是由Protocol Labs和Pinata共同推出的服务。今天我们基于nft.storage为列、使用java对接打通这个ipfs分布式存…

成为程序员后的领悟与展望-ApiHug

&#x1f917; ApiHug {Postman|Swagger|Api...} 快↑ 准√ 省↓ GitHub - apihug/apihug.com: All abou the Apihug apihug.com: 有爱&#xff0c;有温度&#xff0c;有质量&#xff0c;有信任ApiHug - API design Copilot - IntelliJ IDEs Plugin | Marketplace 选择一个…

【代码】Python3|Requests 库怎么继承 Selenium 的 Headers (2024,Chrome)

本文使用的版本&#xff1a; Chrome 124Python 12Selenium 4.19.0 版本过旧可能会出现问题&#xff0c;但只要别差异太大&#xff0c;就可以看本文&#xff0c;因为本文对新老版本都有讲解。 文章目录 1 难点解析和具体思路2 注意事项2.1 PDF 资源获取时注意事项2.2 Capabiliti…

关于老iPad 能够重新使用经过的一些列折腾

背景 搞了一台IPad air一代给家里老人看戏曲或者电视用,芯片是A7处理器,目前IOS系统是IOS12,也就是能支持的最后一个版本。并且可能是之前刷机问题,IPad基带丢失,显示无法连接激活服务器,无法进入系统。 本人没有MAC设备,没有相关越狱经验,没有黑苹果经验,一切都是从头…

制冷铜管焊接介绍

铜管是制冷装置的重要原材料&#xff0c;它主要有两种用途&#xff1a;①制作换热器。②制作连接管道和管件。常用的焊料类型有铜磷焊料、银铜焊料、铜锌焊料等。在焊接时要根据管道材料的特点&#xff0c;正确的选择焊料及熟练的操作&#xff0c;以确保焊接的质量。 1.1对同类…

基于springboot实现图书进销存管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现图书进销存管理系统演示 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了图书进销存管理系统的开发全过程。通过分析图书进销存管理系统管理的不足&#xff0c;创建了一个计算机管理图书进销…

QML QtObject轻量级非可视化元素

QtObject 理论1. 父指针形式代指子类2. 自定义组件中定义一些私有属性 理论 QtObject类型是一个非常轻量级且非可视元素&#xff0c;它只包含objectName属性&#xff0c;其本质上是QObject。 用途一般是两个&#xff1a; 父指针形式代指子类&#xff1b;自定义组件中定义一些…

Java基于SpringBoot+Vue的蜗牛兼职网系统的研究与实现

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

Python零基础从小白打怪升级中~~~~~~~多线程

线程安全和锁 一、全局解释器锁 首先需要明确的一点是GIL并不是Python的特性&#xff0c;它是在实现Python解析器(CPython)时所引入的一个概念。 GIL全称global interpreter lock&#xff0c;全局解释器锁。 每个线程在执行的时候都需要先获取GIL&#xff0c;保证同一时刻只…

MySQL(2024.4.17)

目录 1. 什么是MySQL的MVCC机制&#xff1f; 2. 如何理解InnoDB的Next-Key Lock机制&#xff1f; 3. 快照读和当前读的区别&#xff1f; 4. 如何在SQL语句中触发当前读&#xff1f; 5. MySQL默认的隔离级别是什么&#xff1f; 6. 如何避免在使用当前读时可能出现的死锁问…

Docker部署metahuman-stream数字人系统

metahuman-stream是基于ernerf模型的流式数字人&#xff0c;实现音视频同步对话。 metahuman-stream xtts-streaming-server srs 部署 srs # rtmpserver docker run -it -d \ -p 1935:1935 -p 1985:1985 -p 8080:8080 -p 8000:8000/udp -p 10080:10080/udp \ --name srs \ reg…

Postgresql源码(126)TupleStore使用场景与原理分析

相关 《Postgresql源码&#xff08;125&#xff09;游标恢复执行的原理分析》 《Postgresql游标使用介绍&#xff08;cursor&#xff09;》 总结 开源PG中使用tuple store来缓存tuple集&#xff0c;默认使用work_mem空间存放&#xff0c;超过可以落盘。在PL的returns setof场景…

基于51单片机的步进电机调速系统设计

基于51单片机的步进电机调速系统 &#xff08;仿真&#xff0b;程序&#xff0b;原理图&#xff0b;设计报告&#xff09; 功能介绍 具体功能&#xff1a; 1.按键可以控制电机正、反转&#xff0c;加、减速&#xff0c;停止&#xff1b; 2.一位7段数码管实时显示档位&#xf…

6个免费的伪原创工具,轻松生成原创文章

如今&#xff0c;内容创作已经成为许多人关注的焦点。然而&#xff0c;随之而来的是创作压力和时间成本的增加。为了解决这些问题&#xff0c;越来越多的人开始寻找一些伪原创工具来帮助他们生成原创文章&#xff0c;其中免费的伪原创工具成为了热门选择之一。这些免费的伪原创…
最新文章