springboot~国际化Locale正确的姿势

Java中的Locale.getDefault()获取的是操作系统的默认区域设置,如果需要获取客户端浏览器的区域设置,可以从HTTP头中获取"Accept-Language"的值来进行解析。

使用说明

Java网站中实现国际化(多语言支持)通常需要涉及以下几个方面:

  1. 为所有可见的文本(如按钮、标签、提示等)都提供多语言的支持,遵循国际化的标准,建议使用标准的属性文件进行配置。

  2. 根据用户请求或浏览器设置来选择合适的Locale,以便在数据保存和显示时使用相应的语言和地区格式。最常用的方法是使用Java的Locale类来获取、设置当前的Locale,可以通过调用Locale类的getAvailableLocales()方法获取支持的区域列表,也可以根据用户的请求或浏览器的设置来检测用户当前所使用的Locale。

  3. 针对国际化后的日期、时间、数字等数据类型进行格式化处理,以便在不同的语言、地区环境下使数据显示更加友好和易读。可以使用Java的SimpleDateFormat类等进行处理。

正确的姿势

在Java Web应用中使用MessageSource对象实现国际化功能时,可以通过以下步骤使用浏览器语言动态设置Locale区域。

  • 国际化文件在resources/i18n目录,文件名是message_{语言}.properties
  • 通过MessageSource对象进行国际化配置信息的管理
  1. 配置类
@Configuration
public class LocalMessageConfig {

   /**
    * 系统国际化文件配置
    * @return MessageSource
    */
   @Bean
   public MessageSource messageSource() {
      ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
      messageSource.setBasename("classpath:i18n/message");
      messageSource.setDefaultEncoding("UTF-8");
      return messageSource;
   }

}
  1. 静态工具类
 /**
 * 国际化消息配置 LocalMessageConfig中配置了resources/i18n/messages_zh_CN.properties.
 * 通过 LocaleContextHolder.getLocale()获取客户端浏览器的语言环境,就是请求头中的Accept-Language的值,再根据它进行国际化消息的获取。
 *
 * @UtilityClass所有的方法和属性都会被加上static关键字,并且该类会创建一个私有的空参构造器
 */
@UtilityClass
public class LocaleMessageUtils {

   /**
    * 通过code 获取错误信息
    * @param code
    * @return
    */
   public String getMessage(String code) {
   return getMessage(code, null);
   }

   /**
    * 通过code 和参数获取错误信息
    * @param code
    * @return
    */
   public String getMessage(String code, Object... objects) {
      MessageSource messageSource = SpringContextUtils.getBean("messageSource");
      Locale locale = LocaleContextHolder.getLocale();
      return messageSource.getMessage(code, null,locale);
   }

}
  1. 配置文件有中文和英文两个版本
# message_en_US.properties
title=System
# message_zh_CN.properties
title=\u7cfb\u7edf # 中文咱们使用unicode编码

  1. 在前台控制器中获取配置信息
	@GetMapping("get-title")
	public ResponseEntity title() {
		return ResponseEntity.ok(
				LocaleMessageUtils.getMessage("title")
		);
	}

  1. 通过切换浏览器的语言,来实现中文和英文的输出


通过这个国际化,我们可以更优雅的实现多语言的系统设计了,不硬编码在程序里是程序员永远追求的方向

作者:仓储大叔,张占岭,
荣誉:微软MVP
QQ:853066980

支付宝扫一扫,为大叔打赏!

本文转载于网络 如有侵权请联系删除

相关文章

  • 怪诞营销难题大赏

    如果你能追到做市场的男孩女孩,那真的很棒!他们是这个世界的超级赛亚人,追得了热点/敲得定预算/搞得定KOL/做得了爆款/CPM、CPR、GMV、ROI如数家珍,千帆走过,他们还会有什么烦恼呢?END▼往期精彩回顾▼破解外卖佣金真相 中概股“生死五日”谁能造出下一波“浪姐”?脉脉做点评,是个伪命题HRSaaS独角兽呼之欲出淘宝天猫融合是大势所趋通信云市场请回答2022为何腾讯要大搞实体经济?智能交通的2022罗超频道是知名科技行业自媒体。研究技术、产品、商业、资本和趋势,关注中国本土科技创新、大公司、中概股、文娱内容、AIoT、新零售、新金融、新技术和产业互联网,是虎嗅网、36kr、钛媒体三大平台年度作者(唯一大满贯),是百家号、新浪科技、网易号年度作者,是36kr观察+特邀采访嘉宾,读者覆盖人群1000万+,全平台订阅读者100万+。转载/合作/社群联系个人微信:luochaozhuli,请注明来意。我们鼓励有质量的讨论!每日精选置顶留言,送上爱奇艺/腾讯视频/优酷任意平台会员一份,留言被置顶读者,请在后台回复“留言+电话号码”,我们审核后将联系发放。

  • Laravel 模型关联基础教程详解

    在Laravel中定义模型关联是每个Laravel开发者可能已经做过不止一次的事情。但是在试图实现关联时可能会遇到各种问题。因为Laravel有各种各样的关联,你应该选择哪一个?当涉及到查询模型时,我们如何充分利用模型关联的功能?Laravel的模型关联可能会让人糊涂。如果你不完全理解Laravel的关联在这一点上是如何工作的,别担心,读完这篇文章后,你会更好地理解它。我们应该使用哪个模型关联?要回答这个问题,首先你要知道有哪些可用的选项。Laravel有3种不同的关联类型。一对一一对多多对多我们将逐个探讨不同的关联类型并解释一下应该什么时候使用它们。一对一一对一关联是目前存在的最基本的关联。这种关联意味着A模型只能链接到B模型,相反也是如此。举个例子,一个User模型和一个Passport模型会成为一对一的关联。一个用户只能拥有一张通行证,同样,一张通行证也只属于一个用户。让我们看看如何在代码中定义这种关联。<?php namespaceApp; useIlluminate\Database\Eloquent\Model; classUserextendsModel { pub

  • 人工智能、机器学习技术的应用

    人工智能、机器学习技术的应用  人工智能、机器学习以及深度学习这些热点技术,受到了极为广泛的关注,这要归功于很多大型互联网公司对这些技术的应用,人工智能算法,例如图像或者语音识别,以及自然语言处理,我们大多数人几乎每天都会使用这样的系统和应用。  当我们考虑机器学习时,首先能够想到的是,通过服务器集群搭建的大数据中心和云平台,对于很多机器学习的应用来讲,这是一个存在了很多年的标准搭建方式。但近些年来,随着硬件能力的不断提升、物联网场景的出现以及成本的下降,大量的应用场景从云端转移到了边缘。在这样的模式转换中,随着智能化越来越接近事件发生地而远离云端,节点设备会变得更加自主化。这些变化导致了很多有趣的应用产生,例如无人机、ADAS辅助驾驶以及可移动的智能机器人,而且这仅仅是个开始。  在本文中,我们将在系统设计层面,综合阐述如何考虑在边缘部署人工智能。通常,一个比较典型的思路,可以归纳为对于任务的理解、算法的选择,以及对于推理模型的训练和部署。  目标:问题定义  在做任何的方案时,往往最重要恰恰也是经常被忽视的一点就是,识别我们需要解决的问题。我们需要真正地理解问题,这对于我们选择合适

  • MySQL案例:关于JSON的一个bug

    前言周五晚上和朋友一起去外面吃饭,本来想着不加班早点回家过周末,谁又能想到突然就接到一个电话,mysqldump逻辑备份导入时报错,具体错误为“ERROR3144(22032):CannotcreateaJSONvaluefromastringwithCHARACTERSET'binary'.”下面就和大家简单分享一下这个案例,由于涉及业务数据,这里将通过自己模拟场景的方式来进行分享;关于真实场景或模拟场景分享,之前也说过,能够自己模拟复现出故障场景,往往才更加证明已经完全了解清楚其中的原理和解决办法。案例分享(1)创建一张含JSON列的表,并插入一条记录mysql>selectversion(); +------------+ |version()| +------------+ |5.7.18-log| +------------+ 1rowinset(0.00sec) mysql>showcreatetablejson_test\G ***************************1.row*************************

  • 【2020HBU天梯赛训练】7-37 玩转二叉树

    7-37玩转二叉树【2020HBU天梯赛训练】7-30树的遍历的姊妹题这道题给中序遍历和前序遍历相反的层序输出姊妹题给中序遍历和后序遍历层序输出。给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。输入格式:输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其中序遍历序列。第三行给出其前序遍历序列。数字间以空格分隔。输出格式:在一行中输出该树反转后的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。输入样例:7 1234567 4132657复制输出样例:4617532复制直接改的上一题代码完成的这道题哈#include<iostream> #include<vector> usingnamespacestd; intpreorder[33]; intinorder[33]; vector<vector<int>>levels(33); voidinit(intpostbg,intposte

  • 甲基化芯片的一般分析流程

    前面我们系统性的总结了circRNA的相关背景知识:首先了解一下circRNA背景知识circRNA芯片分析的一般流程circRNA-seq分析的一般流程ceRNA-芯片分析的一般流程同样的策略,我们也可以应用到其它领域的知识背景快速学习,比如我们的lncRNA系列,miRNA系列,现在我们一起学习一下甲基化吧。我们已经强调过主要是DNA的甲基化,而且前面我们介绍了一些背景知识,主要是理解什么是DNA甲基化,为什么要检测它,以及芯片和测序两个方向的DNA甲基化检测技术。具体介绍在:甲基化的一些基础知识甲基化芯片的甲基化信号值概念提到这些甲基化芯片背景知识,不得不强推中科院毕业的生信博士joshua,目前在英国从事博士后研究,他是ChAMP这个分析(一站式)450K甲基化芯片数据的R包作者,我们生信技能树也多次推送过相关教程。比如850K甲基化芯片数据的分析甲基化芯片主要是450K和850K,都是采用了两种探针InfiniumⅠ和InfiniumⅡ对甲基化进行测定,InfiniumI采用了两种bead(甲基化M和非甲基化U),而II只有一种bead(即甲基化和非甲基化在一起),这也导致了

  • 现在的工程结构能满足你的需求吗?

    创建单模块工程相信很多人都手到擒来。但如果项目很大,功能很多,你还能继续使用单模块工程吗?项目过大,结构肯定也越来越复杂这时候如果你继续使用单模块工程,进展就会遇到各种问题。同时维护起来也是很麻烦的事情。这个时候你就可以考虑将功能细化,使用多模块工程来替代单模块了。一、使用maven多模块工程的好处 复杂项目拆分成多个模块多模块的划分可以降低代码之间的耦合性,方便维护。多模块可以根据工程拆分,也可以根据菜单拆分,具体可根据公司要求。结构拆分清晰了,那么公司团队中每个人负责的代码模块也就清晰了。不会出现两个人改了同一段代码,如果功能出现问题责任追踪也很方便。方便代码的重用。如果你有一个新的swing项目需要用到app-dao和app-service,添加对它们的依赖即可,你不再需要去依赖一个WAR。比如app-util,就可以作为成公司的一份基础工具类库,供所有项目使用。这是模块化最重要的一个目的。解决了包的问题。maven将包的依+赖关系定义在了pom.xml中,所有jar包放在.m2里。这样的话,我们首先不会出现包冲突的问题,其次,解决了我们去找包、去包的问题。5.方便、快捷。一键重

  • [android] 网络图片查看器

    界面布局LinerLayout线性布局,ImageView控件,EditText控件hint属性提示信息,Button控件。Android:layout_weight=””属性,权重,只有控件的宽度和高度为0的时候才代表权重,否则它代表渲染的优先级,值越大优先级越低,默认是0,先渲染其他控件singleLine属性单行业务逻辑,获取EditText的值放到ImageView里,实质上是http的get请求获取EditText对象,通过findViewById()获取值,通过调用EditText对象的getText()方法,调用toString()方法,调用trim()方法调用TextUtils类的isEmpty()方法,判断是否为空,为空就Toast一下发送get请求获取Url对象,通过newUrl(path),参数:path是String的路径,这里需要捕获异常获取HttpUrlConnection对象,通过调用Url对象的openConnection()方法,返回UrlConnection对象,然后强制类型转换一下调用HttpUrlConnection对象的setRequestMe

  • 【介绍一些好用的轮子(1)】类型安全的字符串格式化输出

    前言类型安全简单用法详细用法0paddingtypealignmentandfillsignwidthandprecision/truncation其他例子前言之前的文章有朋友反映比较难懂,这篇争取写的简单易懂一些,希望有一点参考价值。学过C语言的同学可能对printf都不陌生,也对用"%d"这种格式控制符对应于打印一个int也不陌生。然而这种打印方式是被C++唾弃的,于是有了复杂的stream和可怕的std::cout<<std::internal<<std::setw(10)<<std::showbase<<std::setfill('0')<<std::hex<<0x10<<std::endl;来实现和printf("%#010x\n",0x10);同样的效果。而python似乎提供了一种不错的格式化输出方式:'{:#010x}'.format(0x10)[1]于是fmtlib.fmt[2][3]为C++提供了类似py

  • windows下python的安装及相关工具安装

    1.python的安装1.1下载python安装包下载python-3.6.4-amd64.exe文件 下载地址:https://www.python.org/downloads/windows/1.2点击安装最好选择“Customizeinstallation”安装,其它的默认即可。2.JupyterNotebook的使用2.1安装JupyterNotebook在命令行下切换到python的安装目录下的Scripts目录:下执行命令:pipinstalljupyter 安装成功后再看script目录:2.2启动JupyterNotebook输入命令:jupyternotebook 同时,默认浏览器会打开Jupyternotebook窗口。说明Jupyternotebook安装成功了。2.3配置Jupyternotebook继续输入命令:jupyternotebook--generate-config 在c盘的用户目录下找到.jupyter文件夹,里面有一个jupyter_notebook_config.py文件。 第202行#c.NotebookApp.notebook_dir=&#

  • ORA-02019 错误处理

          ORA-02019错误提示是未找到远程数据库的连接说明,通常发生在本地数据库无法连接到远程数据库。引发该问题的原因很多,比如网络连接,连接方式(tnsnames),dblinkc的创建等等。而下面的描述的故障则比较奇特。                                                                                                   一、错误现象  SQL>select*fromscanfilename@dss.m85;select*fromscanfilename@dss.m85ORA-02019:未找到远程数据库的连接说明SQL>select*fromxdoc_file@DSS.M85;select*fromxdoc_file@DSS.M85ORA-02019:未找到远程数据库的连接说明 二、分析与解决   1.当前数据库版本    SQL>select*fromv$version;BANNER---------------------------------------

  • 学会清理坏情绪

    之前遇到一个客户,对各种广告文案和设计画面纠结万分,一个户外广告翻来覆去修改了无数次,拖了半年,连领导都换了,才最终定了最开始写的那句话,而那时候距离开盘已经不到两个月时间,前期整整半年时间都浪费在了犹豫中。遇到这样的情况当然是非常郁闷也非常烦躁的,因为很多都是常识问题,纠结过多而忽略了重点甚至影响了项目整体的进度,肯定是得不偿失的,作为服务方的我私下也经常出口成脏。有一天跟同事聊天,他竟然觉得我状态不错,面对这么反复无常的客户,虽然嘴上经常吐槽,但并没有在精神上陷入一个焦灼的状态。我半开玩笑半认真地对他说:“因为我没有把工作当成全部啊。”同事三十出头,在北京有房有车,虽然房子不大车子也不豪华,但总归该有的东西都有了,小孩也快学会叫爸爸了。可他每天看起来却总是非常匆忙,好像每件事都快火烧眉毛了,很容易就情绪激动,甚至过度理解别人说的话,这些为他带来很大困扰。听我那么说,同事立即接到:“我也没把工作当成全部,每天回家也陪老婆孩子啊。”我说:“这不是重点,重点是你在工作中产生的情绪垃圾还堆在你心里,你没把它们倒出去,时间长了这些垃圾就成了问题。我没把工作当成全部,不是说我逃避工作,而是习惯

  • DarkMode(2):深色模式解决方案——css颜色变量实现Dark Mode

    暗黑模式实现,最初的设计,就是参考之前的主题模式。所谓多套主题/配色/皮肤,就是我们很常见的换肤功能。换肤简单的实现就是更换css实现不同样式呈现不同肤色。之前做不同颜色的皮肤,暗黑模式可以单做其中的一种黑色暗黑主题。 通用的方法,就是less、sass、post-css,把颜色抽离出变量。然后打包输出不同的样式,即:CSS预处理直接生成多套主题样式利用Less,stylus或sass的变量代替颜色值配置多个主题颜色配置利用grunt/gulp/webpack等工具输出多套主题样式页面加载后,根据用户需求加载不同的样式列表推荐阅读《webpack换肤功能多主题/配色样式打包解决方案》,配置文件:https://github.com/hiyangguo/webpack-mutiple-theme-bundle-css-demo/blob/master/webpack.config.js这里是以less为例,sass配置,稍微修改即可,这里就不做赘述了,google应该都可以搜索得到,推荐这篇也是顺手搜的这种方式在bootstrap时代就流行开来,那时候还用过php编译less,以及jav

  • 结对作业

    一、Gitlab项目地址 项目 内容 这个作业属于哪个课程 2021软件工程(罗杰任建) 项目地址 gitlab 结对同学后四位学号 3665 结对同学后四位学号 5013 二、结对项目实践反思 (1)针对出现的问题,分析问题特征、产生根源和对质量影响程度。 问题一:类设计 ​ 这两次作业大部分代码和架构设计都是由C同学完成,也暴露出了C同学在复杂的项目上的架构设计经验的不足,架构的可迭代性较差。在第一次作业中,由于功能非常简单,C同学看完指导书稍加思考便开始写,当时考虑过将文件目录设计一个共同的父类,以应付一些查询方法,但是后来又发现这两种写法在第一次作业中的复杂度实际上是差不多的,所以最后就没有设计这一一个父类,但是到了第二次作业中,发现,如果有一个共同的父类,里面封装了一些共同的属性和方法,会给下一步的迭代开发带来非常好的效果。 问题二:方法抽象与接口设计 ​ C同学在进行oo课程的学习的时候,不是特别理解关于每个类的属性都要用private进行修饰的作用,当时想虽然是private但是几乎都能设计对应的get和set方法,好像意义不大,这两次

  • Runtime类中的freeMemory,totalMemory,maxMemory等几个方法

    最近在网上看到一些人讨论到java.lang.Runtime类中的freeMemory(),totalMemory(),maxMemory()这几个方法的一些题目,很多人感到很迷惑,为什么,在java程序刚刚启动起来的时候freeMemory()这个方法返回的只有一两兆字节,而随着java程序往前运行,创建了不少的对象,freeMemory()这个方法的返回有时候不但没有减少,反而会增加。这些人对freeMemory()这个方法的意义应该有一些误解,他们以为这个方法返回的是操纵系统的剩余可用内存,实在根本就不是这样的。这三个方法反映的都是java这个进程的内存情况,跟操纵系统的内存根本没有关系。下面结合totalMemory(),maxMemory()一起来解释。 maxMemory()这个方法返回的是java虚拟机(这个进程)能构从操纵系统那里挖到的最大的内存,以字节为单位,假如在运行java程序的时候,没有添加-Xmx参数,那么就是64兆,也就是说maxMemory()返回的大约是64*1024*1024字节,这是java虚拟机默认情况下能从操纵系统那里挖到的最大的内存。

  • 基于springboot搭建的web系统架构

      从接触springboot开始,便深深的被它的简洁性深深的折服了,精简的配置,方便的集成,使我再也不想用传统的ssm框架来搭建项目,一大堆的配置文件,维护起来很不方便,集成的时候也要费力不少。从第一次使用springboot开始,一个简单的main方法,甚至一个配置文件也不需要(当然我是指的没有任何数据交互,没有任何组件集成的情况),就可以把一个web项目启动起来,下面总结一下自从使用springboot依赖,慢慢完善的自己的一个web系统的架构,肯定不是最好的,但平时自己用着很舒服。 1.配置信息放到数据库里边   个人比较不喜欢配置文件,因此有一个原则,配置文件能不用就不用,配置信息能少些就少些,配置内容能用代码写坚决不用xml,因此我第一个想到的就是,能不能把springboot的配置信息写到数据库里,在springboot启动的时候自动去加载,而在application.properties里边只写一个数据源。最终找到了方法:   注意图中箭头指向的两行,构造了一个properties对象,然后将这个对象放到了springboot的启动对象application中,pro

  • 深入浅出讲解:php的socket通信[转]

    对TCP/IP、UDP、Socket编程这些词你不会很陌生吧?随着网络技术的发展,这些词充斥着我们的耳朵。那么我想问:1.         什么是TCP/IP、UDP?2.         Socket在哪里呢?3.         Socket是什么呢?4.         你会使用它们吗?什么是TCP/IP、UDP?          TCP/IP(TransmissionControlProtocol/InternetProtocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网(WANs)设计的。  

  • 书中自有黄金屋系列5:读《正面管教》

    微信公众号:数据拾光者。愿结交更多的小伙伴,一同走人生路   摘要:父母对于孩子不仅仅要有爱,更要有科学的教育方式,父母更加应该持证上岗。本篇首先分析传统的两种教育方式存在的问题。放纵的教育方式会让孩子以自我为中心,完全不顾及他人的感受,最严重的是不知道自己行为的边界在哪里。而严格的惩罚式的教育方式虽然效果立竿见影,但是会造成孩子愤怒、报复、反叛和退缩四种长期不良的情绪;然后引出正面管教。正面管教的教育方式核心理念是在互相尊重中的基础上,在和善而坚定的氛围中让孩子学会自立,这才是教育的真正目的;最后本篇重点讲解了如何使用正面管教的方式教育孩子。   目录 01做父母,我们应该持证上岗 02传统的家庭教育方式 03正面管教 04有效管教方式的四个保准 05正面管教具体做法 总结   01做父母,我们应该持证上岗 作为年龄最大的一批90后,我也即将步入而立之年,可能最近一两年就会拥有自己的宝宝,所以是时候学一些亲子教育的知识了。《正面管教》作为美国关于亲子教育的黄金教科书,在大大小小100多个国家广泛流传。这样一本广受中外读者欢迎的亲子教育书实在有必要拜读下

  • 嵌入式Tomcat容器的参数(maxParameterCount)设定

    背景 昨天同事遇到了error一起看了一下感觉比较重要在这记录一下 基本情况是页面上选中9K+的数据向后台发送请求,然后系统就崩了。。。   error信息如下 Morethanthemaximumnumberofrequestparameters(GETplusPOST)forasinglerequest([10,000])weredetected. Anyparametersbeyondthislimithavebeenignored.Tochangethislimit,setthemaxParameterCountattributeontheConnector. 简说单次请求的参数超出限制,通过maxParameterCount来更改容器的限制。   经验里对于tomcat容器的设定最对就是端口号,超时,最大线程的设置比较多 这个【maxParameterCount】的设定还没有过然后到网上去翻了翻, 在官网的文档(tomcatdoc)里找到了如下 maxParameterCount Themaximumnumberofparameterandvalue

  • maven archetype二三事

    mavenplugin 创建mavenarchetype骨架的plugin是 xml org.apache.maven.plugins maven-archetype-plugin ${maven-archetype-plugin.version} ${source.encoding} ${jdk.version} ${jdk.version} 关于mavenarchetype的详细介绍参考:https://maven.apache.org/archetype/maven-archetype-plugin/plugin-info.html ##从项目中创建骨架 >mvnarchetype:create-from-project 上面的命令是最简单的命令,maven会自己根据设定的规则进行创建。 但有些时候,maven没有那么智能,比如它取当前project的packagename的时候,会取最短的包名作为包名的占位符,在最后生成的archetype中进行占位。 此时,需要手动指定当前项目模板的packagename替换maven自己选择的packageName。命

  • 预习笔记 多态 --S2 4.3

    第三章多态 polymorphism多态instance例子override重载 constructor构造器ClassCastException类型转换异常upcasting上抛 downcasting向下转换abstract抽象 1.多态是具有表现多种形态的能力的特征同一个实现接口,使用不同的实例而执行不同的操作 2.子类向父类的转型Dogdog=newDog();dog.eat();Petpet=newDog();pet.eat();//Dog类继承自Pet类,调用的是子类重写的方法而不是父类的方法 将一个父类的引用指向一个子类对象,称为向上转型,自动进行类型转换.此时通过父类引用变量调用的是子类覆盖或继承父类的方法,不是父类的方法此时通过父类引用变量无法调用子类特有的方法 3.使用父类方法作为形参实现多态 //主人类publicclassMaster{ privateStringname=""; privateintmoney=0; publicMaster(Stringname,intmoney){ this.name=name; this.money=money; }

相关推荐

推荐阅读