Java在AI时代的崛起:从传统机器学习到AIGC的全栈解决方案

Java在AI时代的崛起:从传统机器学习到AIGC的全栈解决方案
个人名片

🎓作者简介:java领域优质创作者
🌐个人主页码农阿豪
📞工作室:新空间代码工作室(提供各种软件服务)
💌个人邮箱:[[email protected]]
📱个人微信:15279484656
🌐个人导航网站www.forff.top
💡座右铭:总有人要赢。为什么不能是我呢?
  • 专栏导航:
码农阿豪系列专栏导航
面试专栏:收集了java相关高频面试题,面试实战总结🍻🎉🖥️
Spring5系列专栏:整理了Spring5重要知识点与实战演练,有案例可直接使用🚀🔧💻
Redis专栏:Redis从零到一学习分享,经验总结,案例实战💐📝💡
全栈系列专栏:海纳百川有容乃大,可能你想要的东西里面都有🤸🌱🚀

目录

Java在AI时代的崛起:从传统机器学习到AIGC的全栈解决方案

在人工智能浪潮席卷全球的今天,Python凭借其丰富的AI生态系统成为了机器学习和深度学习的首选语言。然而,作为企业级应用开发的王者,Java在AI领域的表现同样不容小觑。本文将深入探讨Java在AI生态中的定位、技术栈以及在AIGC时代的机遇与挑战。

一、Java AI生态概览:多样化的技术选择

Java在AI领域的技术栈可以用"百花齐放"来形容,从传统机器学习到现代深度学习,从自然语言处理到计算机视觉,Java都有相应的解决方案。

1.1 深度学习框架:接轨主流AI技术

Deep Java Library (DJL) - 统一的深度学习接口

DJL是Amazon开源的Java深度学习库,其最大的优势在于提供了统一的API来操作不同的深度学习后端。

// DJL示例:使用预训练模型进行图像分类importai.djl.Application;importai.djl.Model;importai.djl.inference.Predictor;importai.djl.modality.Classifications;importai.djl.modality.cv.Image;importai.djl.modality.cv.ImageFactory;importai.djl.repository.zoo.Criteria;importai.djl.repository.zoo.ModelZoo;importai.djl.repository.zoo.ZooModel;publicclassImageClassificationExample{publicstaticvoidmain(String[] args)throwsException{// 加载预训练的ResNet模型Criteria<Image,Classifications> criteria =Criteria.builder().optApplication(Application.CV.IMAGE_CLASSIFICATION).setTypes(Image.class,Classifications.class).optFilter("layer","50").optEngine("PyTorch").build();try(ZooModel<Image,Classifications> model =ModelZoo.loadModel(criteria)){try(Predictor<Image,Classifications> predictor = model.newPredictor()){Image image =ImageFactory.getInstance().fromUrl("https://example.com/cat.jpg");Classifications classifications = predictor.predict(image);System.out.println("预测结果:"); classifications.items().forEach(classification ->System.out.printf("%s: %.2f%%\n", classification.getClassName(), classification.getProbability()*100));}}}}
Deeplearning4j - 企业级深度学习解决方案

DL4J专为Java生态系统设计,特别适合需要与现有Java应用集成的场景。

// DL4J示例:构建简单的神经网络importorg.deeplearning4j.nn.conf.MultiLayerConfiguration;importorg.deeplearning4j.nn.conf.NeuralNetConfiguration;importorg.deeplearning4j.nn.conf.layers.DenseLayer;importorg.deeplearning4j.nn.conf.layers.OutputLayer;importorg.deeplearning4j.nn.multilayer.MultiLayerNetwork;importorg.deeplearning4j.nn.weights.WeightInit;importorg.nd4j.linalg.activations.Activation;importorg.nd4j.linalg.lossfunctions.LossFunctions;publicclassSimpleNeuralNetwork{publicstaticvoidmain(String[] args){// 构建神经网络配置MultiLayerConfiguration conf =newNeuralNetConfiguration.Builder().seed(123).weightInit(WeightInit.XAVIER).updater(neworg.nd4j.linalg.learning.config.Adam(0.001)).list().layer(0,newDenseLayer.Builder().nIn(784)// 输入层大小.nOut(128)// 隐藏层大小.activation(Activation.RELU).build()).layer(1,newOutputLayer.Builder(LossFunctions.LossFunction.NEGATIVELOGLIKELIHOOD).nIn(128).nOut(10)// 输出类别数.activation(Activation.SOFTMAX).build()).build();MultiLayerNetwork model =newMultiLayerNetwork(conf); model.init();System.out.println("神经网络构建完成,参数数量: "+ model.numParams());}}

1.2 传统机器学习框架:成熟稳定的选择

Weka - 学术界的宠儿

Weka提供了丰富的机器学习算法和可视化工具,既可以通过GUI操作,也可以编程调用。

// Weka示例:使用决策树进行分类importweka.classifiers.trees.J48;importweka.core.Instances;importweka.core.converters.ConverterUtils.DataSource;importweka.filters.Filter;importweka.filters.unsupervised.attribute.Remove;publicclassWekaClassificationExample{publicstaticvoidmain(String[] args)throwsException{// 加载数据集DataSource source =newDataSource("path/to/dataset.arff");Instances dataset = source.getDataSet();// 设置类别属性(最后一列)if(dataset.classIndex()==-1){ dataset.setClassIndex(dataset.numAttributes()-1);}// 创建决策树分类器J48 tree =newJ48(); tree.setUnpruned(true);// 不剪枝// 训练模型 tree.buildClassifier(dataset);// 输出决策树System.out.println("决策树模型:");System.out.println(tree);// 10折交叉验证weka.classifiers.Evaluation eval =newweka.classifiers.Evaluation(dataset); eval.crossValidateModel(tree, dataset,10,newjava.util.Random(1));System.out.println("交叉验证结果:");System.out.println("准确率: "+ eval.pctCorrect()+"%");System.out.println("召回率: "+ eval.weightedRecall());System.out.println("F1-Score: "+ eval.weightedFMeasure());}}
Smile - 现代化的机器学习库

Smile提供了高性能的机器学习算法实现,API设计简洁现代。

// Smile示例:随机森林分类importsmile.classification.RandomForest;importsmile.data.DataFrame;importsmile.data.formula.Formula;importsmile.io.Read;importsmile.validation.CrossValidation;publicclassSmileRandomForestExample{publicstaticvoidmain(String[] args)throwsException{// 读取数据DataFrame data =Read.csv("path/to/data.csv");// 定义公式(目标变量 ~ 特征变量)Formula formula =Formula.lhs("target");// 训练随机森林RandomForest model =RandomForest.fit(formula, data,100);// 100棵树// 交叉验证double[] accuracy =CrossValidation.classification(10, formula, data,(f, x)->RandomForest.fit(f, x,100));System.out.printf("随机森林交叉验证准确率: %.2f%% (+/- %.2f%%)\n",smile.math.MathEx.mean(accuracy)*100,smile.math.MathEx.sd(accuracy)*100);// 特征重要性double[] importance = model.importance();String[] features = data.names();System.out.println("特征重要性排序:");java.util.stream.IntStream.range(0, importance.length).boxed().sorted((i, j)->Double.compare(importance[j], importance[i])).limit(10).forEach(i ->System.out.printf("%s: %.4f\n", features[i], importance[i]));}}

1.3 自然语言处理框架:文本智能处理

Stanford CoreNLP - 功能全面的NLP工具包
// Stanford CoreNLP示例:文本分析管道importedu.stanford.nlp.pipeline.StanfordCoreNLP;importedu.stanford.nlp.pipeline.CoreDocument;importedu.stanford.nlp.ling.CoreAnnotations;importedu.stanford.nlp.sentiment.SentimentCoreAnnotations;importjava.util.Properties;publicclassCoreNLPExample{publicstaticvoidmain(String[] args){// 配置处理管道Properties props =newProperties(); props.setProperty("annotators","tokenize,ssplit,pos,lemma,ner,sentiment"); props.setProperty("coref.algorithm","neural");StanfordCoreNLP pipeline =newStanfordCoreNLP(props);// 待分析文本String text ="Java在人工智能领域展现出强大的潜力。"+"企业级应用中,Java的稳定性和可维护性是重要优势。";// 创建文档并进行注释CoreDocument document = pipeline.processToCoreDocument(text);// 输出分析结果System.out.println("=== 句子分析 ==="); document.sentences().forEach(sentence ->{System.out.println("句子: "+ sentence.text());System.out.println("情感: "+ sentence.sentiment());System.out.println("词汇分析:"); sentence.tokens().forEach(token ->{System.out.printf(" %s [词性: %s, 词元: %s]\n", token.word(), token.get(CoreAnnotations.PartOfSpeechAnnotation.class), token.lemma());});System.out.println("命名实体:"); sentence.entityMentions().forEach(entityMention ->{System.out.printf(" %s: %s\n", entityMention.text(), entityMention.entityType());});System.out.println();});}}

1.4 大数据AI框架:处理海量数据的利器

Apache Spark MLlib - 分布式机器学习
// Spark MLlib示例:大规模文本分类importorg.apache.spark.sql.SparkSession;importorg.apache.spark.sql.Dataset;importorg.apache.spark.sql.Row;importorg.apache.spark.ml.Pipeline;importorg.apache.spark.ml.PipelineStage;importorg.apache.spark.ml.classification.LogisticRegression;importorg.apache.spark.ml.feature.HashingTF;importorg.apache.spark.ml.feature.Tokenizer;importorg.apache.spark.ml.feature.StopWordsRemover;publicclassSparkMLTextClassification{publicstaticvoidmain(String[] args){SparkSession spark =SparkSession.builder().appName("TextClassification").master("local[*]").getOrCreate();// 创建示例数据Dataset<Row> training = spark.createDataFrame(Arrays.asList(newJavaBean("Java是一门优秀的编程语言",1.0),newJavaBean("Python在AI领域很流行",1.0),newJavaBean("这个产品质量很差",0.0),newJavaBean("服务态度需要改进",0.0)),JavaBean.class);// 构建机器学习管道Tokenizer tokenizer =newTokenizer().setInputCol("text").setOutputCol("words");StopWordsRemover remover =newStopWordsRemover().setInputCol("words").setOutputCol("filtered");HashingTF hashingTF =newHashingTF().setNumFeatures(1000).setInputCol("filtered").setOutputCol("features");LogisticRegression lr =newLogisticRegression().setMaxIter(10).setRegParam(0.001);Pipeline pipeline =newPipeline().setStages(newPipelineStage[]{tokenizer, remover, hashingTF, lr});// 训练模型org.apache.spark.ml.PipelineModel model = pipeline.fit(training);// 创建测试数据并预测Dataset<Row> test = spark.createDataFrame(Arrays.asList(newJavaBean("Java开发效率很高",0.0),newJavaBean("这个软件有严重问题",0.0)),JavaBean.class);Dataset<Row> predictions = model.transform(test); predictions.select("text","label","prediction","probability").show(false); spark.stop();}publicstaticclassJavaBean{privateString text;privateDouble label;publicJavaBean(String text,Double label){this.text = text;this.label = label;}// getters and setterspublicStringgetText(){return text;}publicvoidsetText(String text){this.text = text;}publicDoublegetLabel(){return label;}publicvoidsetLabel(Double label){this.label = label;}}}

二、Java在AIGC时代的机遇与挑战

随着ChatGPT、GPT-4等大语言模型的爆火,AIGC(AI Generated Content)成为了AI领域的新热点。Java在这一波浪潮中面临着机遇与挑战并存的局面。

2.1 Spring AI:Java拥抱AIGC的新起点

Spring AI是Spring生态系统在AI领域的重要布局,它为Java开发者提供了友好的AIGC应用开发框架。

// Spring AI示例:构建聊天机器人importorg.springframework.ai.chat.ChatClient;importorg.springframework.ai.chat.ChatResponse;importorg.springframework.ai.chat.prompt.Prompt;importorg.springframework.ai.openai.OpenAiChatClient;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.web.bind.annotation.*;@SpringBootApplication@RestControllerpublicclassSpringAiChatApplication{privatefinalChatClient chatClient;publicSpringAiChatApplication(ChatClient chatClient){this.chatClient = chatClient;}@PostMapping("/chat")publicChatResponsechat(@RequestBodyChatRequest request){Prompt prompt =newPrompt(request.getMessage());return chatClient.call(prompt);}@GetMapping("/generate")publicStringgenerate(@RequestParamString topic){String promptText =String.format("请为我写一篇关于'%s'的技术博客大纲,包含5个主要章节", topic);Prompt prompt =newPrompt(promptText);ChatResponse response = chatClient.call(prompt);return response.getResult().getOutput().getContent();}publicstaticvoidmain(String[] args){SpringApplication.run(SpringAiChatApplication.class, args);}staticclassChatRequest{privateString message;publicStringgetMessage(){return message;}publicvoidsetMessage(String message){this.message = message;}}}

配置文件示例:

# application.ymlspring:ai:openai:api-key: ${OPENAI_API_KEY}chat:options:model: gpt-3.5-turbo temperature:0.7max-tokens:1000server:port:8080logging:level:org.springframework.ai: DEBUG 

2.2 Java AIGC应用架构设计

基于Java技术栈构建AIGC应用的典型架构:

// AIGC服务抽象层设计publicinterfaceAigcService{/** * 文本生成 */GeneratedContentgenerateText(TextGenerationRequest request);/** * 图像生成 */GeneratedContentgenerateImage(ImageGenerationRequest request);/** * 代码生成 */GeneratedContentgenerateCode(CodeGenerationRequest request);/** * 流式文本生成 */Flux<String>generateTextStream(TextGenerationRequest request);}@Service@Slf4jpublicclassAigcServiceImplimplementsAigcService{privatefinalChatClient chatClient;privatefinalImageClient imageClient;privatefinalRedisTemplate<String,Object> redisTemplate;publicAigcServiceImpl(ChatClient chatClient,ImageClient imageClient,RedisTemplate<String,Object> redisTemplate){this.chatClient = chatClient;this.imageClient = imageClient;this.redisTemplate = redisTemplate;}@Override@Cacheable(value ="text-generation", key ="#request.hashCode()")publicGeneratedContentgenerateText(TextGenerationRequest request){ log.info("生成文本内容,prompt: {}", request.getPrompt());try{// 构建提示词Prompt prompt =buildPrompt(request);// 调用大语言模型ChatResponse response = chatClient.call(prompt);// 构建响应returnGeneratedContent.builder().content(response.getResult().getOutput().getContent()).type(ContentType.TEXT).model(request.getModel()).timestamp(System.currentTimeMillis()).usage(buildUsage(response)).build();}catch(Exception e){ log.error("文本生成失败", e);thrownewAigcException("文本生成失败: "+ e.getMessage());}}@OverridepublicFlux<String>generateTextStream(TextGenerationRequest request){returnFlux.create(sink ->{try{Prompt prompt =buildPrompt(request);// 流式调用 chatClient.stream(prompt).subscribe( response ->{String content = response.getResult().getOutput().getContent(); sink.next(content);}, error ->{ log.error("流式生成失败", error); sink.error(error);},()-> sink.complete());}catch(Exception e){ sink.error(e);}});}privatePromptbuildPrompt(TextGenerationRequest request){PromptTemplate template =newPromptTemplate(request.getTemplate());return template.create(request.getVariables());}privateUsagebuildUsage(ChatResponse response){returnUsage.builder().promptTokens(response.getMetadata().getUsage().getPromptTokens()).completionTokens(response.getMetadata().getUsage().getGenerationTokens()).totalTokens(response.getMetadata().getUsage().getTotalTokens()).build();}}

2.3 AIGC应用的微服务架构

// 网关层:统一入口和负载均衡@RestController@RequestMapping("/api/v1/aigc")@Slf4jpublicclassAigcGatewayController{privatefinalAigcOrchestrationService orchestrationService;privatefinalRateLimitService rateLimitService;@PostMapping("/generate")publicResponseEntity<GeneratedContent>generate(@RequestBodyGenerationRequest request,@RequestHeader("User-Id")String userId){// 限流检查if(!rateLimitService.isAllowed(userId)){returnResponseEntity.status(429).build();}// 路由到对应的服务GeneratedContent content = orchestrationService.generate(request);returnResponseEntity.ok(content);}@GetMapping("/generate/stream")publicResponseEntity<Flux<ServerSentEvent<String>>>generateStream(@RequestParamString prompt,@RequestHeader("User-Id")String userId){Flux<ServerSentEvent<String>> stream = orchestrationService .generateStream(prompt).map(content ->ServerSentEvent.<String>builder().data(content).build());returnResponseEntity.ok().header("Content-Type","text/event-stream").body(stream);}}// 编排服务:协调多个AI服务@ServicepublicclassAigcOrchestrationService{privatefinalMap<String,AigcService> aigcServices;privatefinalModelLoadBalancer loadBalancer;publicGeneratedContentgenerate(GenerationRequest request){// 根据请求类型选择合适的服务AigcService service =selectService(request.getType());// 选择最优模型String model = loadBalancer.selectBestModel(request); request.setModel(model);return service.generate(request);}privateAigcServiceselectService(ContentType type){returnswitch(type){case TEXT -> aigcServices.get("textService");case IMAGE -> aigcServices.get("imageService");case CODE -> aigcServices.get("codeService");default->thrownewUnsupportedOperationException("不支持的内容类型: "+ type);};}}

三、Java AI技术栈的优势与适用场景

3.1 企业级应用的天然优势

Java在AI领域的最大优势在于其在企业级应用中的成熟度和稳定性。对于需要将AI能力集成到现有业务系统中的企业来说,Java提供了无缝的集成体验。

高并发处理能力

// 异步处理大量AI请求@ServicepublicclassAsyncAigcService{@Async("aigcThreadPool")@CompletableFuture<GeneratedContent>publicCompletableFuture<GeneratedContent>generateAsync(GenerationRequest request){// 异步执行AI生成任务returnCompletableFuture.supplyAsync(()->{return aigcService.generate(request);});}publicList<GeneratedContent>batchGenerate(List<GenerationRequest> requests){List<CompletableFuture<GeneratedContent>> futures = requests.stream().map(this::generateAsync).collect(Collectors.toList());return futures.stream().map(CompletableFuture::join).collect(Collectors.toList());}}

完善的监控和运维体系

// AI服务监控@ComponentpublicclassAigcMetrics{privatefinalMeterRegistry meterRegistry;privatefinalCounter requestCounter;privatefinalTimer responseTimer;publicAigcMetrics(MeterRegistry meterRegistry){this.meterRegistry = meterRegistry;this.requestCounter =Counter.builder("aigc.requests").description("AIGC请求总数").register(meterRegistry);this.responseTimer =Timer.builder("aigc.response.time").description("AIGC响应时间").register(meterRegistry);}publicvoidrecordRequest(String model,String status){ requestCounter.increment(Tags.of("model", model,"status", status));}publicTimer.SamplestartTimer(){returnTimer.start(meterRegistry);}}

3.2 适用场景分析

最适合Java的AI场景:

  1. 企业级AI平台构建 - 需要高可用、高并发的AI服务平台
  2. 现有系统AI改造 - 为现有Java系统添加AI能力
  3. AI服务化部署 - 将AI模型包装为微服务
  4. 复杂业务逻辑AI应用 - 需要复杂业务规则的AI系统

不太适合的场景:

  1. 算法研究和原型开发 - Python更适合快速实验
  2. 纯深度学习模型训练 - GPU加速和数值计算优化不如Python
  3. 计算机视觉核心算法 - OpenCV-Python生态更完整

四、未来展望:Java AI生态的发展方向

4.1 技术发展趋势

  1. 更深度的云原生集成 - 与Kubernetes、Istio等云原生技术深度结合
  2. 边缘AI部署 - GraalVM Native Image支持边缘设备部署
  3. 企业级AI中台 - 构建统一的企业AI能力平台
  4. 多模态AI应用 - 文本、图像、语音的统一处理框架

4.2 生态完善路径

Java AI生态的完善需要在以下几个方面持续努力:

  1. 降低使用门槛 - 提供更多开箱即用的解决方案
  2. 性能优化 - 在数值计算和GPU加速方面追赶Python
  3. 社区建设 - 培养更多Java AI开发者和贡献者
  4. 标准化 - 建立Java AI框架的标准规范

结语

Java在AI时代并非被边缘化,而是在寻找自己的独特定位。虽然在算法研究和模型训练方面Python依然占据主导地位,但在企业级AI应用、AI服务化部署、以及将AI能力集成到现有业务系统方面,Java展现出了独特的优势。

随着AIGC技术的普及和企业数字化转型的深入,Java在AI领域的价值将进一步凸显。对于Java开发者来说,现在正是学习和掌握AI技术的最佳时机。通过合理利用Java的生态优势,结合现代AI技术,我们完全可以构建出高质量、高性能的AI应用系统。

未来的AI应用不仅需要强大的算法能力,更需要稳定可靠的工程实现。而这正是Java的强项所在。让我们拥抱AI时代,用Java构建更智能的未来!

Read more

【C++】string类(二)

【C++】string类(二)

🫧个人主页:小年糕是糕手 💫个人专栏:《C++》《Linux》《数据结构》《C语言》 🎨你不能左右天气,但你可以改变心情;你不能改变过去,但你可以决定未来! 目录 string中的一些成员函数 part 1: 1° max_size 2° capacity 3° clear 4° empty 5° reserve 6° shrink_to_fit 7° resize part 2: 1° push_back 2° append 3° operator+= 4° operator+ 5° assign 6° insert 7° erase 8°

By Ne0inhk
【Linux/C++网络篇(一) 】网络编程入门:一文搞懂 TCP/UDP 编程模型与 Socket 网络编程

【Linux/C++网络篇(一) 】网络编程入门:一文搞懂 TCP/UDP 编程模型与 Socket 网络编程

⭐️在这个怀疑的年代,我们依然需要信仰。 个人主页:YYYing. ⭐️Linux/C++进阶系列专栏:【从零开始的linux/c++进阶编程】 系列上期内容:【Linux/C++多线程篇(二) 】同步互斥机制& C++ 11下的多线程 系列下期内容:暂无 目录 引言:程序如何“联网”? 网络编程基本概念 一、字节序 二、IP地址 IP地址的分类 特殊的IP地址 点分十进制 三、端口号 端口号的分类 网络编程基础 一、套接字(socket)的概念 二、基于TCP面向连接的通信方式  📖 bind函数  📖 listen函数  📖 accept函数  📖 recv、send数据收发  📖 close关闭套接字  📖 connect连接函数

By Ne0inhk
C++学习之旅【C++伸展树介绍以及红黑树的实现】

C++学习之旅【C++伸展树介绍以及红黑树的实现】

🔥承渊政道:个人主页 ❄️个人专栏: 《C语言基础语法知识》《数据结构与算法》 《C++知识内容》《Linux系统知识》 ✨逆境不吐心中苦,顺境不忘来时路!🎬 博主简介: 引言:前篇文章,小编已经介绍了关于C++AVL树的实现!相信大家应该有所收获!接下来我将带领大家继续深入学习C++的相关内容!本篇文章着重介绍关于C++伸展树介绍以及红黑树的实现!伸展树与红黑树是两类极具代表性的BBST,且在工程实践中各有不可替代的价值:伸展树摒弃了"严格平衡”的执念,通过“伸展”操作将最近访问的节点移至根节点,利用“局部性原理”优化频繁访问的场景,实现均摊O(logn)的时间复杂度,适合缓存、热点数据查询等场景;红黑树则通过给节点着色并遵守严格的颜色规则,确保树的最长路径不超过最短路径的两倍,以 “弱平衡” 换稳定的最坏O(logn)性能,是C++ STL 中 std::map、std:

By Ne0inhk
C++ 运算符重载:自定义类型的运算扩展

C++ 运算符重载:自定义类型的运算扩展

C++ 运算符重载:自定义类型的运算扩展 💡 学习目标:掌握运算符重载的核心语法与规则,能够为自定义类型重载常用运算符,实现类对象的灵活运算。 💡 学习重点:运算符重载的基本形式、成员函数与全局函数重载的区别、常见运算符的重载实现、禁止重载的运算符。 一、运算符重载的概念与核心价值 ✅ 结论:运算符重载是 C++ 静态多态的重要体现,允许为自定义类型(如类、结构体)重新定义运算符的行为,让自定义对象可以像内置类型一样使用运算符。 运算符重载的核心价值: 1. 简化代码书写:用直观的运算符替代繁琐的成员函数调用,提升代码可读性 2. 统一操作风格:让自定义类型的运算逻辑与内置类型保持一致,降低学习和使用成本 3. 扩展类型功能:根据业务需求定制运算符的行为,满足自定义类型的运算需求 ⚠️ 注意事项:运算符重载不会改变运算符的优先级和结合性,也不会改变运算符的操作数个数。 二、运算符重载的基本语法 运算符重载的本质是函数重载,分为成员函数重载和全局函数重载两种形式。 2.1 成员函数重载语法 将运算符重载函数定义为类的成员函数,语法格式如下: class

By Ne0inhk