thymeleaf学习
一.简单表达格式: thymeleaf的官方参考文档
1.变量的表达式:${...}
2.选择变量表达式:*{...}
3.信息表达:#{...}
4.链接URL表达式:@{...}
二.字面值
1.文本文字:'one text'
, 'Another one!'
,…
2.文字数量:0
, 34
, 3.0
, 12.3
,…
3.布尔型常量:true
, false
4.空的文字:null
5.文字标记:one
, sometext
, main
,…
四:文本处理
1.字符串并置:+
2.文字替换:|The name is ${name}|
五.表达基本对象
1.#ctx:上下文对象
2.#vars:上下文变量
3.#locale:上下文语言环境
4.#httpServletRequest:(只有在Web上下文)HttpServletRequest对象
5.#httpSession:(只有在Web上下文)HttpSession对象。
用法:
1
|
< span th:text="${#locale.country}">US</ span >.
|
六.实用表达对象
#dates
: java.util的实用方法。对象:日期格式、组件提取等.#calendars
: 类似于#日期,但对于java.util。日历对象#numbers
: 格式化数字对象的实用方法。#strings
:字符串对象的实用方法:包含startsWith,将/附加等。#objects
: 实用方法的对象。#bools
: 布尔评价的实用方法。#arrays
: 数组的实用方法。#lists
: list集合。#sets
:set集合。#maps
: map集合。#aggregates
: 实用程序方法用于创建聚集在数组或集合.#messages
: 实用程序方法获取外部信息内部变量表达式,以同样的方式,因为他们将获得使用# {…}语法#ids
: 实用程序方法来处理可能重复的id属性(例如,由于迭代)。Dates#dates : utility methods for java.util.Date objects: /** ======================================================================* See javadoc API for class org.thymeleaf.expression.Dates* ======================================================================*//** Null-safe toString()*/ ${#strings.toString(obj)} // also array*, list* and set*/** Format date with the standard locale format* Also works with arrays, lists or sets*/ ${#dates.format(date)} ${#dates.arrayFormat(datesArray)} ${#dates.listFormat(datesList)} ${#dates.setFormat(datesSet)}/** Format date with the specified pattern* Also works with arrays, lists or sets*/ ${#dates.format(date, 'dd/MMM/yyyy HH:mm')} ${#dates.arrayFormat(datesArray, 'dd/MMM/yyyy HH:mm')} ${#dates.listFormat(datesList, 'dd/MMM/yyyy HH:mm')} ${#dates.setFormat(datesSet, 'dd/MMM/yyyy HH:mm')}/** Obtain date properties* Also works with arrays, lists or sets*/ ${#dates.day(date)} // also arrayDay(...), listDay(...), etc. ${#dates.month(date)} // also arrayMonth(...), listMonth(...), etc. ${#dates.monthName(date)} // also arrayMonthName(...), listMonthName(...), etc. ${#dates.monthNameShort(date)} // also arrayMonthNameShort(...), listMonthNameShort(...), etc. ${#dates.year(date)} // also arrayYear(...), listYear(...), etc. ${#dates.dayOfWeek(date)} // also arrayDayOfWeek(...), listDayOfWeek(...), etc. ${#dates.dayOfWeekName(date)} // also arrayDayOfWeekName(...), listDayOfWeekName(...), etc. ${#dates.dayOfWeekNameShort(date)} // also arrayDayOfWeekNameShort(...), listDayOfWeekNameShort(...), etc. ${#dates.hour(date)} // also arrayHour(...), listHour(...), etc. ${#dates.minute(date)} // also arrayMinute(...), listMinute(...), etc. ${#dates.second(date)} // also arraySecond(...), listSecond(...), etc. ${#dates.millisecond(date)} // also arrayMillisecond(...), listMillisecond(...), etc./** Create date (java.util.Date) objects from its components*/ ${#dates.create(year,month,day)} ${#dates.create(year,month,day,hour,minute)} ${#dates.create(year,month,day,hour,minute,second)} ${#dates.create(year,month,day,hour,minute,second,millisecond)}/** Create a date (java.util.Date) object for the current date and time*/ ${#dates.createNow()}/** Create a date (java.util.Date) object for the current date (time set to 00:00)*/ ${#dates.createToday()} Calendars#calendars : analogous to #dates, but for java.util.Calendar objects: /** ======================================================================* See javadoc API for class org.thymeleaf.expression.Calendars* ======================================================================*//** Format calendar with the standard locale format* Also works with arrays, lists or sets*/ ${#calendars.format(cal)} ${#calendars.arrayFormat(calArray)} ${#calendars.listFormat(calList)} ${#calendars.setFormat(calSet)}/** Format calendar with the specified pattern* Also works with arrays, lists or sets*/ ${#calendars.format(cal, 'dd/MMM/yyyy HH:mm')} ${#calendars.arrayFormat(calArray, 'dd/MMM/yyyy HH:mm')} ${#calendars.listFormat(calList, 'dd/MMM/yyyy HH:mm')} ${#calendars.setFormat(calSet, 'dd/MMM/yyyy HH:mm')}/** Obtain calendar properties* Also works with arrays, lists or sets*/ ${#calendars.day(date)} // also arrayDay(...), listDay(...), etc. ${#calendars.month(date)} // also arrayMonth(...), listMonth(...), etc. ${#calendars.monthName(date)} // also arrayMonthName(...), listMonthName(...), etc. ${#calendars.monthNameShort(date)} // also arrayMonthNameShort(...), listMonthNameShort(...), etc. ${#calendars.year(date)} // also arrayYear(...), listYear(...), etc. ${#calendars.dayOfWeek(date)} // also arrayDayOfWeek(...), listDayOfWeek(...), etc. ${#calendars.dayOfWeekName(date)} // also arrayDayOfWeekName(...), listDayOfWeekName(...), etc. ${#calendars.dayOfWeekNameShort(date)} // also arrayDayOfWeekNameShort(...), listDayOfWeekNameShort(...), etc. ${#calendars.hour(date)} // also arrayHour(...), listHour(...), etc. ${#calendars.minute(date)} // also arrayMinute(...), listMinute(...), etc. ${#calendars.second(date)} // also arraySecond(...), listSecond(...), etc. ${#calendars.millisecond(date)} // also arrayMillisecond(...), listMillisecond(...), etc./** Create calendar (java.util.Calendar) objects from its components*/ ${#calendars.create(year,month,day)} ${#calendars.create(year,month,day,hour,minute)} ${#calendars.create(year,month,day,hour,minute,second)} ${#calendars.create(year,month,day,hour,minute,second,millisecond)}/** Create a calendar (java.util.Calendar) object for the current date and time*/ ${#calendars.createNow()}/** Create a calendar (java.util.Calendar) object for the current date (time set to 00:00)*/ ${#calendars.createToday()} Numbers#numbers : utility methods for number objects: /** ======================================================================* See javadoc API for class org.thymeleaf.expression.Numbers* ======================================================================*//** ==========================* Formatting integer numbers* ==========================*//* * Set minimum integer digits.* Also works with arrays, lists or sets*/ ${#numbers.formatInteger(num,3)} ${#numbers.arrayFormatInteger(numArray,3)} ${#numbers.listFormatInteger(numList,3)} ${#numbers.setFormatInteger(numSet,3)}/* * Set minimum integer digits and thousands separator: * 'POINT', 'COMMA', 'NONE' or 'DEFAULT' (by locale).* Also works with arrays, lists or sets*/ ${#numbers.formatInteger(num,3,'POINT')} ${#numbers.arrayFormatInteger(numArray,3,'POINT')} ${#numbers.listFormatInteger(numList,3,'POINT')} ${#numbers.setFormatInteger(numSet,3,'POINT')}/** ==========================* Formatting decimal numbers* ==========================*//** Set minimum integer digits and (exact) decimal digits.* Also works with arrays, lists or sets*/ ${#numbers.formatDecimal(num,3,2)} ${#numbers.arrayFormatDecimal(numArray,3,2)} ${#numbers.listFormatDecimal(numList,3,2)} ${#numbers.setFormatDecimal(numSet,3,2)}/** Set minimum integer digits and (exact) decimal digits, and also decimal separator.* Also works with arrays, lists or sets*/ ${#numbers.formatDecimal(num,3,2,'COMMA')} ${#numbers.arrayFormatDecimal(numArray,3,2,'COMMA')} ${#numbers.listFormatDecimal(numList,3,2,'COMMA')} ${#numbers.setFormatDecimal(numSet,3,2,'COMMA')}/** Set minimum integer digits and (exact) decimal digits, and also thousands and * decimal separator.* Also works with arrays, lists or sets*/ ${#numbers.formatDecimal(num,3,'POINT',2,'COMMA')} ${#numbers.arrayFormatDecimal(numArray,3,'POINT',2,'COMMA')} ${#numbers.listFormatDecimal(numList,3,'POINT',2,'COMMA')} ${#numbers.setFormatDecimal(numSet,3,'POINT',2,'COMMA')}/** ==========================* Utility methods* ==========================*//** Create a sequence (array) of integer numbers going* from x to y*/ ${#numbers.sequence(from,to)} ${#numbers.sequence(from,to,step)} Strings#strings : utility methods for String objects: /** ======================================================================* See javadoc API for class org.thymeleaf.expression.Strings* ======================================================================*//** Check whether a String is empty (or null). Performs a trim() operation before check* Also works with arrays, lists or sets*/ ${#strings.isEmpty(name)} ${#strings.arrayIsEmpty(nameArr)} ${#strings.listIsEmpty(nameList)} ${#strings.setIsEmpty(nameSet)}/** Perform an 'isEmpty()' check on a string and return it if false, defaulting to* another specified string if true.* Also works with arrays, lists or sets*/ ${#strings.defaultString(text,default)} ${#strings.arrayDefaultString(textArr,default)} ${#strings.listDefaultString(textList,default)} ${#strings.setDefaultString(textSet,default)}/** Check whether a fragment is contained in a String* Also works with arrays, lists or sets*/ ${#strings.contains(name,'ez')} // also array*, list* and set* ${#strings.containsIgnoreCase(name,'ez')} // also array*, list* and set*/** Check whether a String starts or ends with a fragment* Also works with arrays, lists or sets*/ ${#strings.startsWith(name,'Don')} // also array*, list* and set* ${#strings.endsWith(name,endingFragment)} // also array*, list* and set*/** Substring-related operations* Also works with arrays, lists or sets*/ ${#strings.indexOf(name,frag)} // also array*, list* and set* ${#strings.substring(name,3,5)} // also array*, list* and set* ${#strings.substringAfter(name,prefix)} // also array*, list* and set* ${#strings.substringBefore(name,suffix)} // also array*, list* and set* ${#strings.replace(name,'las','ler')} // also array*, list* and set*/** Append and prepend* Also works with arrays, lists or sets*/ ${#strings.prepend(str,prefix)} // also array*, list* and set* ${#strings.append(str,suffix)} // also array*, list* and set*/** Change case* Also works with arrays, lists or sets*/ ${#strings.toUpperCase(name)} // also array*, list* and set* ${#strings.toLowerCase(name)} // also array*, list* and set*/** Split and join*/ ${#strings.arrayJoin(namesArray,',')} ${#strings.listJoin(namesList,',')} ${#strings.setJoin(namesSet,',')} ${#strings.arraySplit(namesStr,',')} // returns String[] ${#strings.listSplit(namesStr,',')} // returns List<String> ${#strings.setSplit(namesStr,',')} // returns Set<String>/** Trim* Also works with arrays, lists or sets*/ ${#strings.trim(str)} // also array*, list* and set*/** Compute length* Also works with arrays, lists or sets*/ ${#strings.length(str)} // also array*, list* and set*/** Abbreviate text making it have a maximum size of n. If text is bigger, it* will be clipped and finished in "..."* Also works with arrays, lists or sets*/ ${#strings.abbreviate(str,10)} // also array*, list* and set*/** Convert the first character to upper-case (and vice-versa)*/ ${#strings.capitalize(str)} // also array*, list* and set* ${#strings.unCapitalize(str)} // also array*, list* and set*/** Convert the first character of every word to upper-case*/ ${#strings.capitalizeWords(str)} // also array*, list* and set* ${#strings.capitalizeWords(str,delimiters)} // also array*, list* and set*/** Escape the string*/ ${#strings.escapeXml(str)} // also array*, list* and set* ${#strings.escapeJava(str)} // also array*, list* and set* ${#strings.escapeJavaScript(str)} // also array*, list* and set* ${#strings.unescapeJava(str)} // also array*, list* and set* ${#strings.unescapeJavaScript(str)} // also array*, list* and set*/** Null-safe comparison and concatenation*/ ${#strings.equals(str)} ${#strings.equalsIgnoreCase(str)} ${#strings.concat(str)} ${#strings.concatReplaceNulls(str)}/** Random*/ ${#strings.randomAlphanumeric(count)} Objects#objects : utility methods for objects in general /** ======================================================================* See javadoc API for class org.thymeleaf.expression.Objects* ======================================================================*//** Return obj if it is not null, and default otherwise* Also works with arrays, lists or sets*/ ${#objects.nullSafe(obj,default)} ${#objects.arrayNullSafe(objArray,default)} ${#objects.listNullSafe(objList,default)} ${#objects.setNullSafe(objSet,default)} Booleans#bools : utility methods forboolean evaluation /** ======================================================================* See javadoc API for class org.thymeleaf.expression.Bools* ======================================================================*//** Evaluate a condition in the same way that it would be evaluated in a th:if tag* (see conditional evaluation chapter afterwards).* Also works with arrays, lists or sets*/ ${#bools.isTrue(obj)} ${#bools.arrayIsTrue(objArray)} ${#bools.listIsTrue(objList)} ${#bools.setIsTrue(objSet)}/** Evaluate with negation* Also works with arrays, lists or sets*/ ${#bools.isFalse(cond)} ${#bools.arrayIsFalse(condArray)} ${#bools.listIsFalse(condList)} ${#bools.setIsFalse(condSet)}/** Evaluate and apply AND operator* Receive an array, a list or a set as parameter*/ ${#bools.arrayAnd(condArray)} ${#bools.listAnd(condList)} ${#bools.setAnd(condSet)}/** Evaluate and apply OR operator* Receive an array, a list or a set as parameter*/ ${#bools.arrayOr(condArray)} ${#bools.listOr(condList)} ${#bools.setOr(condSet)} Arrays#arrays : utility methods for arrays /** ======================================================================* See javadoc API for class org.thymeleaf.expression.Arrays* ======================================================================*//** Converts to array, trying to infer array component class.* Note that if resulting array is empty, or if the elements* of the target object are not all of the same class,* this method will return Object[].*/ ${#arrays.toArray(object)}/** Convert to arrays of the specified component class.*/ ${#arrays.toStringArray(object)} ${#arrays.toIntegerArray(object)} ${#arrays.toLongArray(object)} ${#arrays.toDoubleArray(object)} ${#arrays.toFloatArray(object)} ${#arrays.toBooleanArray(object)}/** Compute length*/ ${#arrays.length(array)}/** Check whether array is empty*/ ${#arrays.isEmpty(array)}/** Check if element or elements are contained in array*/ ${#arrays.contains(array, element)} ${#arrays.containsAll(array, elements)} Lists#lists : utility methods for lists /** ======================================================================* See javadoc API for class org.thymeleaf.expression.Lists* ======================================================================*//** Converts to list*/ ${#lists.toList(object)}/** Compute size*/ ${#lists.size(list)}/** Check whether list is empty*/ ${#lists.isEmpty(list)}/** Check if element or elements are contained in list*/ ${#lists.contains(list, element)} ${#lists.containsAll(list, elements)}/** Sort a copy of the given list. The members of the list must implement* comparable or you must define a comparator.*/ ${#lists.sort(list)} ${#lists.sort(list, comparator)} Sets#sets : utility methods for sets /** ======================================================================* See javadoc API for class org.thymeleaf.expression.Sets* ======================================================================*//** Converts to set*/ ${#sets.toSet(object)}/** Compute size*/ ${#sets.size(set)}/** Check whether set is empty*/ ${#sets.isEmpty(set)}/** Check if element or elements are contained in set*/ ${#sets.contains(set, element)} ${#sets.containsAll(set, elements)} Maps#maps : utility methods for maps /** ======================================================================* See javadoc API for class org.thymeleaf.expression.Maps* ======================================================================*//** Compute size*/ ${#maps.size(map)}/** Check whether map is empty*/ ${#maps.isEmpty(map)}/** Check if key/s or value/s are contained in maps*/ ${#maps.containsKey(map, key)} ${#maps.containsAllKeys(map, keys)} ${#maps.containsValue(map, value)} ${#maps.containsAllValues(map, value)} Aggregates#aggregates : utility methods for creating aggregates on arrays or collections /** ======================================================================* See javadoc API for class org.thymeleaf.expression.Aggregates* ======================================================================*//** Compute sum. Returns null if array or collection is empty*/ ${#aggregates.sum(array)} ${#aggregates.sum(collection)}/** Compute average. Returns null if array or collection is empty*/ ${#aggregates.avg(array)} ${#aggregates.avg(collection)} Messages#messages : utility methods for obtaining externalized messages inside variables expressions, in the same way as they would be obtained using #{...} syntax. /** ======================================================================* See javadoc API for class org.thymeleaf.expression.Messages* ======================================================================*//** Obtain externalized messages. Can receive a single key, a key plus arguments,* or an array/list/set of keys (in which case it will return an array/list/set of * externalized messages).* If a message is not found, a default message (like '??msgKey??') is returned.*/ ${#messages.msg('msgKey')} ${#messages.msg('msgKey', param1)} ${#messages.msg('msgKey', param1, param2)} ${#messages.msg('msgKey', param1, param2, param3)} ${#messages.msgWithParams('msgKey', new Object[] {param1, param2, param3, param4})} ${#messages.arrayMsg(messageKeyArray)} ${#messages.listMsg(messageKeyList)} ${#messages.setMsg(messageKeySet)}/** Obtain externalized messages or null. Null is returned instead of a default* message if a message for the specified key is not found.*/ ${#messages.msgOrNull('msgKey')} ${#messages.msgOrNull('msgKey', param1)} ${#messages.msgOrNull('msgKey', param1, param2)} ${#messages.msgOrNull('msgKey', param1, param2, param3)} ${#messages.msgOrNullWithParams('msgKey', new Object[] {param1, param2, param3, param4})} ${#messages.arrayMsgOrNull(messageKeyArray)} ${#messages.listMsgOrNull(messageKeyList)} ${#messages.setMsgOrNull(messageKeySet)} IDs#ids : utility methods for dealing with id attributes that might be repeated (for example, as a result of an iteration). /** ======================================================================* See javadoc API for class org.thymeleaf.expression.Ids* ======================================================================*//** Normally used in th:id attributes, for appending a counter to the id attribute value* so that it remains unique even when involved in an iteration process.*/ ${#ids.seq('someId')}/** Normally used in th:for attributes in <label> tags, so that these labels can refer to Ids* generated by means if the #ids.seq(...) function.** Depending on whether the <label> goes before or after the element with the #ids.seq(...)* function, the "next" (label goes before "seq") or the "prev" function (label goes after * "seq") function should be called.*/ ${#ids.next('someId')} ${#ids.prev('someId')}
七.thymeleaf的$和*的区别:
<div th:object="${session.user}"><p>Name: <span th:text="*{firstName}">Sebastian</span>.</p><p>Surname: <span th:text="*{lastName}">Pepper</span>.</p><p>Nationality: <span th:text="*{nationality}">Saturn</span>.</p></div>
这等同于如下方式:
<div><p>Name: <span th:text="${session.user.firstName}">Sebastian</span>.</p><p>Surname: <span th:text="${session.user.lastName}">Pepper</span>.</p><p>Nationality: <span th:text="${session.user.nationality}">Saturn</span>.</p></div>
也可以混用,如下:
<div th:object="${session.user}"><p>Name: <span th:text="*{firstName}">Sebastian</span>.</p><p>Surname: <span th:text="${session.user.lastName}">Pepper</span>.</p><p>Nationality: <span th:text="*{nationality}">Saturn</span>.</p></div>
当一个对象的选择,选择的对象将也可用美元作为#对象表达变量表达式:
<div th:object="${session.user}"><p>Name: <span th:text="${#object.firstName}">Sebastian</span>.</p><p>Surname: <span th:text="${session.user.lastName}">Pepper</span>.</p><p>Nationality: <span th:text="*{nationality}">Saturn</span>.</p></div>
如果没有执行对象选择,美元和星号语法是完全等价的:
<div><p>Name: <span th:text="*{session.user.name}">Sebastian</span>.</p><p>Surname: <span th:text="*{session.user.surname}">Pepper</span>.</p><p>Nationality: <span th:text="*{session.user.nationality}">Saturn</span>.</p></div>
thymeleaf学习相关推荐
- springboot+mybatis+thymeleaf学习一个简单的管理系统
在淘宝上买的课程的一个例子,看了视频,抄了一遍代码,那时候刚开始学springboot,所以感觉没什么用,然后就又学习了一段时间.最近回想起来有这样的一个系统符合我现阶段的学习程度,然后就又写了一遍. ...
- Thymeleaf 学习笔记 (5)
2019独角兽企业重金招聘Python工程师标准>>> 类似于 EL 表达式的行内变量在 js 文件中的使用 Thymeleaf 在 js中,可以动态的替换变量的值,支持将一个对象转 ...
- thymeleaf 学习笔记
thymeleaf,我个人认为是个比较好的模板,性能也比一般的,比如freemaker的要高,而且把将美工和程序员能够结合起来,美工能够在浏览器中查看静态效果,程序员可以在应用服务器查看带数据的效果. ...
- thymeleaf 学习笔记-基础篇(中文教程)
转自: http://www.cnblogs.com/vinphy/p/4674247.html (一)Thymeleaf 是个什么? 简单说, Thymeleaf 是一个跟 Velocity.Fre ...
- Thymeleaf学习总结(1)——新一代Java模板引擎Thymeleaf
Thymeleaf是一款用于渲染XML/XHTML/HTML5内容的模板引擎.类似JSP,Velocity,FreeMaker等,它也可以轻易的与Spring MVC等Web框架进行集成作为Web应用 ...
- Thymeleaf 学习笔记 (2)
2019独角兽企业重金招聘Python工程师标准>>> th-* 属性的优先级,数字越小的优先处理,属性在 dom 上的顺序不影响优先级: Order Feature Attribu ...
- Thymeleaf 学习笔记 (4)~~~~
2019独角兽企业重金招聘Python工程师标准>>> 模板布局 模板布局主要用到的标记有这么几个: th:fragment ,用来定义片段的,用法:th:fragment=&quo ...
- spring boot 学习(二)spring boot 框架整合 thymeleaf
spring boot 框架整合 thymeleaf spring boot 的官方文档中建议开发者使用模板引擎,避免使用 JSP.因为若一定要使用 JSP 将无法使用. 注意:本文主要参考学习了大神 ...
- thymeleaf模板的使用(转)
作者:纯洁的微笑 出处:http://www.ityouknow.com/ 在上篇文章springboot(二):web综合开发中简单介绍了一下thymeleaf,这篇文章将更加全面详细的介绍thym ...
最新文章
- 零基础参加java培训哪家机构好
- 如何同时展现不同粒度的度量
- IT民工系列——c#操作Microsoft IE,实现自动登录吧!
- gdb InnoDB Redundant Row Format
- c char转int_C指针精华知识大汇总
- MySQL ORDER BY IF() 条件排序
- localtime与localtime_r
- c语言宏定义比较三个数大小,C语言中两个宏进行大小对比,其中一个没有定义,这种行为如何定义。...
- 吴恩达《机器学习》第八章:逻辑回归
- 为什么阿里不收购OFO小黄车,反而让滴滴抢了先机?
- Python实现高斯滤波
- Egret(引擎篇)
- 给你们申请的优惠购开发板,购书活动
- 全国各地土特产一览表1
- 今日总结------技术是最不值钱的
- 微信小程序3天刷量开流量主
- 原生实现freeCodeCamp上的Build a Personal Portfolio Webpage
- android studio git 错误 unable to read askpass
- FT60F011A/FT60F010A为辉芒微电子基本I/O型系列Flash单片机SOT23-6/SOP8
- 数据结构之KH [前四章] -->选择题 (一)
热门文章
- 综合实例_为啥要做“三维管线综合”?看个实例就明白
- 具有分页,排序,搜索和导出数据选项的ASP.NET Core CRUD操作
- 提高软件质量的10点
- linux 网卡no carrier,linux centos 7 网卡突然不能上网异常解决
- python123平台作业答案循环结构棋盘放米_python练习集100题(1-20)
- 从零开始用python处理excel视频_书榜 | 计算机书籍(6.29-7.5)销售排行榜
- python tkinter button_Python连载60-Tkinter布局、按钮以及属性详解
- ue4vr插件_UE4 含源码插件合集【转载】
- 服务器说你注册过多,为什么我的世界服务器说此用户名已被注册我都换了很多用户了都没用 爱问知识人...
- java 类对象_Java中的对象和类是什么?