00:00
好,那整个呢,这一章呢,咱们就算是告一段落了啊,大家现在呢,针对于咱们前面讲的这个新的语法结构这块呢,稍微的可以呢,去呃测试测试,练一练,写一写就行了啊好,整个呢,我们这一章呢,就告一段落,我们做一个哎复习好回到我们整个这个课件这个层面。哎,找到我们这个复习。好,打开呢,我们第18章啊呃,那整个呢,这一章里边我们讲了几个事儿啊,大家这块呢,首先回忆一下啊,第一个诶,关于我们JDK这个新特性的一个概述。啊,这块我们提到了这个一些重要的这个版本是吧,包括呢,如何大家呢去看待我们每个版本这个新特性啊,这是第一个事儿,然后第二的话呢,我们就提到了JDK8当中非常重量级的这个新特性,我们提到了叫拉达表啊这个呢很重要,需要大家呢下来呢去一然后呢,诶我们还有呢,另外一个非常重量级的这个变化。诶,我们提到GD8当中提到了一个新的API是吧,或者叫一波API,那就是STEMAPI的一个使用。
01:00
OK啊,行。啊,这块呢,关于咱们这个方法引用啊,构造器引用,咱们都可以归结为在这个拉姆的表达式这里边啊,诶这个呢,我们就告一段落了,然后下边这个点的话呢,我们就提到了JDK8之后的啊,相关的一些新特性,这里边呢,咱们主要呢就提到了,呃,就是语法上的一个变化啊。啊,之后的这个新特性啊,这个语法层面这儿呢,是需要大家呢重点呢去关注的啊,然后剩下这块呢,就是写一个叫其他吧。啊,其他的一些变化啊,整个呢,其实也就这样的一些内容啊,OK,首先呢,我们来看第一个啊,说JDK新特性的一个概述,诶我们在讲解的时候呢,就提到了说它的发布的一个特点了啊这块呢,稍微的大家关注一下啊,我们呃提到了几个重量级的版本是吧,比如说这个JDK5.0的这个版本啊,这是一个里程碑的版本哈,还有呢,我们提到JDK8.0,这是呢第二个里程碑的版本。
02:00
李程。呃,杯式的这个诶版本是吧,诶然后再者的话呢,我们就希望从这个JDK9.0开始是吧,诶我们说呢,每六个月。诶,发布一个,呃,新的这个版本,那这个就清楚了,然后呢,到目前为止,我们提到比较重量级的几个长期制的版本啊,一个呢叫JDK8。啊,然后呢,就是AJDK11啊,然后呢JDK17主要呢,大家关注的这几个版本就可以了。行,然后呢,下边这块呢,我们再提到一个就是如何大家去学习这个新特性啊,刚才我们讲的这块呢,相当于是几个重要的这个版本啊。诶,重要的这个版本啊。怎么又跑到这儿来了?哼。嗯,这个啊,诶下边呢,就提到说如何学习。的新特性这块呢,我们就提到了三个不同的角度啊,这个呢,我就直接CTRLC啊粘过来,大家呢熟悉一下就可以了啊好这就过了,然后下边呢,提到这个拉姆达表达式啊,这块我们具体来展开来说的话呢,诶这就首先呢第一个啊,当然呢,你得清楚呢什么情况下。
03:15
啊,可以使用拉姆达表达式。呃,表达式是吧,这块我们就提到一个点啊,说呢在给函数式。哎,这个接口是吧,提供这个实例时。是不是哎都可以使用,或者要都可以考虑使用,是不是拉姆达表达式啊。OK啊,哎,这块我们就引入这个概念叫做函数式接口啊,所以下边呢,你得清楚呢,具体的什么是函数接口啊,关于拉曼表达式呢,这个诶基本语法的使用这个很重要,哎,大家呢,直接看我们那个课件就可以啊。啊,这个我就不多说了,行,这是我们说的第一个问题啊,然后第二个问题呢,就提到了一个函数式这个接口。
04:02
啊,这个呢,其实不是特别复杂啊,所只有一个抽象方法对应这个接口呢,叫做函数接口,诶大家这块呢,需要关注的就是我们叫诶常见的这个啊函数接口都有哪些啊呃,以往呢,咱们其实讲过的啊,比如这个compar啊是吧?诶这个comparable啊,当然comparable一般我们不会呢,再去提供一个默认的一个实现类的对象了啊,一般都是显示的,让像像员工employee啊,我们去继承这个。啊,所以它的话呢,一般会提供匿名的啊,我们再用拉姆达表达式,然后呢,还有这个呃,Reable啊这也算是这个叫函数接口了,诶还有呢,就是咱们提到了呃,就是Java点呃U下的是不是还有一个叫子包叫做function下定义的,是不是丰富的这个函数式接口啊。诶这块大家要多关注一下啊,这下面呢,定义的很多啊,那以前的话呢,如果你要定一个函数接口啊,就只有一个乘法方法,你就自己写就行了,现在话呢,如果说啊,注意听哈,如果说呢,我们现在要定一个接口,这个接口的话,你发现呢,你要传一个东西。
05:05
然后呢,它不需要返回任何的东西,哎,明显的它其实就是一个消费型的,大家呢,你就不用自己再去定义了。呃,你就直接呢,用我们现成的这个叫consumer这样一个接口就行,那如果你定义这个接口,你发现呢,当然名字可以跟它不一样哈,你说我们这块呢,是定义了一个出方法,呃,不传参数,呃,返回一个指定的类型的一个变量了,其实呢,不就是一个供给型的嘛,呃,你就没有必要再去定义了,直接呢用现成的这个就行啊,下边呢,也同样的道理。所以大家重点关注的就是这四个,由这四个引申出来的,我们说呢,是不是还有像这个函数型的,咱们讲这个PI的时候呢,也测试过,可以传两个是吧,返回一个类型的啊,这个就是有很多的这个变形了,呃,这四个算是比较基础的啊,大家呢,重点关注一下啊。行,那这块咱们也可以把这四个呢,CTRLC给它呢粘过来。嗯,就这四个啊好这个呢,就是我们说常见的这个函数接口啊,这个就过掉了,然后呢,诶接下来诶,我们就提到了叫诶方法引用。
06:05
是吧,哎,方法引用啊,构造器引用这个呢,其实都类似哈,然后数组引用。啊,这块大家要清楚,诶这块呢,整体上来讲,我们说呢,方法引用,构造器引用,数字引用,哎他们呢叫看作是哎拉姆达表达式的。来进一步刻画。啊,或者要进一步的一个描述表达都行。啊,也就是说啊,咱们在能够使用拉姆达表示的这个情况下,满足相应的条件了,我们才能考虑使用这个方法,引用什么样条件呢?就是你发现呢,你具体的写这个方法的这个方法体的时候呢,它就是只调用了另外的某一个方法,也没有其他的一些语句了。你像这块呢,如果我们这个语句呢,写的特别多,你显然的话呢,是不可以使用这个方案用去替换的啊,哎,不能够这样写的,它里边呢,相当于就是啊,针对你这个抽象方法,在重启的时候呢,就是掉了另外一个方法,两个方法的话呢,诶满足某些特征啊,比如我们提到一个形态列表一样啊,反应类型一样啊,诶我们就可以呢做一个替换。
07:06
诶,就是这样一个场景,诶你看我们写的这个格式呢,越简洁越抽象,实际上呢,要想用它的这个条件呢,就越苛刻一些。是吧,呃,生活当中其实也是这样啊,就像大家买那种以前小时候买那种热带鱼啊,特别的漂亮啊,你发现的这个鱼呢,越漂越漂亮,你发现呢,养它的这个成本呢就越高。啊,这个温度啊,湿度啊,加养啊是吧,这个要求呢,就会越高一些啊,就像你在找一个哎,特别漂亮的一个女朋友也是一样啊,看着的话呢,当然是身心愉悦了是吧,但是你要想维护得住。啊,你是不是也得啊,有一定的财力,或者你没有财力的话,你是不是得有一定的魅力啊,才学啊,你才能够hold得住啊,才能够有魅力是吧,要不呢,就容易被别人给抢走是吧。OK啊行,所以呢,都是有成本的啊。好,那么拉回来。啊,这块的话呢,就相当于是啊,大家呢,要清楚在什么样的场景下,我们可以去使用方案应用构造器用核诶速度应用。
08:08
啊,这个呢,是更重要的一个点啊。诶,这个呢,需要大家呢去掌握的,注意以前的时候呢,我讲这个浪漫表达式也好,讲发语也好,我都是说呢叫熟悉,现在呢不能叫熟悉了,因为从实际咱们毕业的同学的反馈来看啊,在企业当中这块呢,长得就很郁闷啊,说明呢,呃掌握的不好啊,另外一点呢,就是企业现在用的呢也比较多了,所以大家下来呢多去写一写啊,需要大家去掌握啊,就是方法引用。啊,构造器引用,当然这块呢,这都诶小事了啊,主要方法引用用的比较多,它的这个具体的这个使用场景啊。诶,我们讲代码的时候呢,也都说过了,熟悉熟悉。好,下边呢,就提到这个string API啊,关于它的话呢,大家首先呢,关注的点就是与我们集合的一个区别是吧?诶stringpi呢,我们说呢,它主要是关注于是不是运算呀。
09:00
啊,关注于。这个内存中的啊,多个数据的。啊,它的这个运算,或者我们叫计算。啊,而我们这个集合呢,就是用来存储这多个数据的。啊,它呢是跟我们这个CPU打交道的啊行这呢首先明确它,呃,然后的话呢,具体的使用层面呢,那就涉及到一个叫使用的一个步骤了啊需要注意的三步,第一步啊,实质运营API,它的一个实例化是吧。哎,这个咱们讲了三种方式啊,基于数组,基于集合,还有呢,使用它静态的一个恶物方法,诶第二呢,叫一系列的。哎,这个中间操作,中间操作呢哈,你可以有多个,比如我们先去做个过滤啊,再去做一个映射map啊都可以,哎,中止操作呢,只能有一个。啊,而且呢,一旦执行的终止操作呢,我们就不能再去调其他的中间操作和终止操作了啊,这就是它的一个使用的步骤啊,这个大家注意一下行具体的话呢,这个相应的这个中间操作终止操作这块呢,有具体的一些方法,大家呢,熟悉熟悉,而且呢,在这个方法的行参当中,通常呢,都是哎体现了是不是函数接口了,那我们就可以使用咱们的拉姆达表达式以及呢方法引用啊,大家得熟悉熟悉啊。
10:14
好,后续的话呢,关于这个语法层面的变化呢,咱们讲了好几个事儿,回忆一下呢,看看还能不能记得哈,首先呢,这块提到了一个叫做解绍这样的一个工具,这块大家熟悉一下就行啊,了解一下体验体验就可以了啊接下来的话呢,我们提到这个叫try catch,哎,这个结构的一个变化是吧,这块我们就提到这个TRY,后边呢,可以写个小括号,这里边你直接把这个流呢就写到这儿就行,它呢呃,只要呢,实现了那个auto closeible啊就可以呢,实现自动的一个关闭了。啊,就是这样的一个结构啊,大家稍微注意一下。好,然后接下话呢,我们就提到了一个叫呃局部变量的啊,叫类型推断,这呢,我们就提到这个呃叫腕啊注意这时候这个腕呢,咱不是一个关键字哈,呃它不是个关键字,它表示的是一个具体的类型。啊,这呢是我们说的它,然后接下来的话呢,我们又提到了一个叫incense of,它的一个叫模式匹配。
11:06
啊,比较简单,就省略了,我们再去做这个强转的这个事儿了啊好,下面这块呢,比较复杂的一个事呢,叫做Switch表达式啊,还有呢,提到了叫Switch的一个模式匹配。哎,OK啊,这个呢,大家下来呢,现在去写一些就行,然后在下边呢,我们提到一个叫哎稳稳块的一个使用。啊,这个文文块呢,就是我们说有,诶三个双引号开始啊,三个双引号结束,诶中间这里边儿呢,我们可以填写具体的这个信息啊,这就是文文块。比如说你是对应的这个Q语HL这个代码,包括我们这个杰森字符串都可以啊,这叫文本块的使用,然后接着的话呢,我们引入了一个新的啊,引用数据类型。啊,这块我们叫做record。呃,翻译过来呢,叫做这个记录是吧,OK啊行,然后这个记录的话呢,一定程度上呢,我们可以呢,体现呢,它对于扎尔病的一个替代,但是它跟扎尔病你注意是不一样的啊,因为它内部的这个属性呢,是不可以呢,有这个设置啊,就是赛这个方法的啊,要注意一下好然后呢,我们提到一个叫做s class啊,我们称为呢叫密封类是吧。
12:18
呃,西的这个class,呃,声明为这样的class的话呢,我们可以指定啊,它可以被哪几个类呢所继承,呃,没有指定的那就不能被继承了,那比较有特色是吧。这块呢,就提了我们更灵活的一个特点啊,整个呢,我们就提到这样一些语法上的一个变化啊,下来大家稍微熟悉熟就行啊,然后在后边这块呢,主要呢,就提到了一个类啊,叫做optional这个类的一个使用。啊,这个其他的话呢,这块大家做一个了解就行,我都哎不往这块去写了,哎这呢就是整个呢,咱们诶这块的一个新特性,重点的话呢,还是拉姆达表达式和我们的死证API啊这个重点一下。啊,重点说明一下,然后呢,企业阵地这块。说呢,谈谈扎巴的这个新特性。
13:01
啊,说扎巴呢,相较于1.7呢,有什么不一样啊,像这块呢,这两个呢,其实我就放在一起了啊这个新特性呢,呃,我们要讲的话呢,其实还挺多的,呃,在一开始讲这个拉曼的表达式的时候,这儿呢我放了一张图吧,这里边呢,其实罗列出来的还是有一些的。啊,咱们像讲的这个接口的变化呀,Optional啊呃,这个新的日期时间的API呀,是吧,这都算包括呢,内存空间的这种变化呀,这都是我们这个八的这个新特性。那么呃,他要说跟1.7有什么不一样啊,这块呢,你重点呢,可以去提一下,我们提到这个内存空间,这个结构,包括呢,我们再提到集合是吧哈,Map啊,它的一个变化啊,可以去相对来说去说一说啊,那如果要是泛泛的去提这个扎巴这个新特性啊,大家一定要引出来他这个版本当中最重要的两个新特性啊,那一个呢,叫做拉姆达表达式。啊,一个呢,叫做死正1PI啊,就是你要提到扎巴新特性这两个结构呢,是不得不去提的。啊,你要提跟这个JDK的这个变化是吧。
14:05
啊,要提到这个对比的话呢,呃,那这块呢,你可以再去引入一下,我们提到这个叫原空间是吧?诶它这个变化包括呢,我们说这个哈希map,呃,底层结构的一个变化啊,当然了,还有我们相关的这个叫啊这个新的日期时间的API。啊哎,这块有个变化啊呃,接口这块呢,也提一下吧。等是吧,就可以了啊,这个静态方法默认方法OK。下面一个啊,说JDK一点,在数据结构上呢,发生了哪些变化。啊,这个呢,其实数据结构这块呢,它其实想说的就是内存结构上的一个变化啊,这块我们就提到了使用。啊,哎,这叫圆空间。啊,去替代了咱们这个原有的这个啊永久贷。啊,空间也好,云贷也好,都是咱们官方的G发布的这个标准里边是不是提到了一个方法区,一个概念,这是官方G规范啊,然后在咱们具体的啊,你比如回到咱们这块啊,叫Java杠。
15:06
诶,我们通过这样的一个指令呢,就能够查看咱们其实使用的这个虚拟机呢,叫house power这个虚拟机,也就这个house power这个虚拟机呢,它呢,呃底层呢是使用的这个叫啊原来呢啊叫永久带啊,它呢是我们方法区的具体的一个体现了啊就相当于这个方法区呢,这块大家注意这两个概念啊,它呢是我们GM规范中。来提到的这个结构。啊,这个结构呢,叫做方法区,而针对于我们这个house这个虚拟机来讲是吧。啊,那么在JDK7当中。哎,他这块呢,方法区的具体落地体现。啊,落地体现呢,这个呢,我们称为呢,叫做永久带。啊,这是针对于他来讲,然后呢,在我们JDK8的时候。啊,它呢,这个方法区的落地的曲线呢,就改成了叫圆空间。
16:04
诶注意啊,这样的这个概念,拟如个公司的这个现他们都没这个永久的概念。啊,因为这块呢,只有house虚拟机才这样去讲啊,这个大家注意一下,诶主要呢,是想说这个事儿啊,诶那另外的话呢,针对于咱们说的这个哈希map是吧,它的这个底层结构啊,你也可以稍微的提一下。啊,这毕竟呢,也是算一个新特性嘛,是吧,这个问题呢,也比较高频啊,啊你说的啊了解啊,说说你了解的这个扎的一个新特性啊,这这个八改进的这个地方这块我就不多说了啊,略了。好,G1.8呢,使用的是哪个垃圾回收器,呃,这块呢,其实我放到这儿了啊,对于咱们Java技术来讲呢,大家不需要过多的去关注了,呃,GP1.8呢,其实默认的使用的是一个叫parallel。哎,这个,哎这谁啊,然后呢,在这个JDK9的时候啊。
17:02
诶他呢,诶默认呢,就相当于使用。诶,咱们叫诶j first这个JC了,诶然后呢,诶在以后的这个版本当中,一定会替换成叫JJJ的。啊,只不过现在这个Z这些呢,还不是默认的打击回收器啊,以后一定会替换成它的,诶它的主要特点呢,就是叫低延迟的一个特点。OK啊,这个大家做一个了解就行,下边啊拉曼牙式有了解吗?你是如何使用的啊,这个咱们讲的很多了是吧?这个了解啊,怎么使用啊,这个呢,就是什么场景下使用拉姆达式,这个咱们上面也提到了啊,就是呢,给我们函数式接口啊,提供具体的这个实例的时候啊,我们才用这个拉姆达表达式啊。这个就是它下边一个点说什么是函数接口,有几种函数接口啊,函数接口这个呢,概念很简单,给咱们说了就只有一个抽样方法,就是啊有几种函数接口,那这个太多了啊,主要呢,就体现我们在Java点啊U这个包啊叫function这个包项。
18:02
啊,定义了叫丰富的函数式接口。然后在这块你可以听到说有四类啊,叫基础的函数式接口。哎,哪四类基础的,就是咱们上面提到的这几个。啊,就他们几个啊CTRL一下。嗯,这块我们粘过来就可以了啊,行这就过了啊,那下边创建STEM的这个方式啊,这个咱们不是提到了有三种是吧。哎,典型的这个方式啊,下边说讲讲这个表达式,呃是咋用的,呃是干啥的,就是stream呢,主要是做什么的。啊,咱们上面呢,讲这个STEM的时候呢,这不也提到了它的一个主要作用,哎,它呢,就是针对于我们内存当中的多个数据啊,做相关的这样的一个操作的。OK啊,这呢就是针对他的一个描述。嗯,这就可以了,哎,下边说集合呢,用stream呢,怎么实现过滤数据啊,如果呢,就是一个他理解的具体的过滤的话呢,其实就是用我们这个叫future。
19:04
是吧,里边呢,我们就写一个叫predictdic吧。啊,这个predictdicate啊,然后他呢,不是返回一个true啊false啊出呢就留下false就不要了,诶这不就是个具体的过滤吗。下边说用怎么选出想要的这个数据。这就看你想要什么数据了。啊,你可以呢,用这种过滤是吧,还还有其他的一些比如map映射啊等等相关一些操作啊,然后最后的话呢,你还想把它给固定下来,诶咱们再讲最后这个STEM的这个终止操作的时候,是不是还提到了一个收集的这样个行为。啊就可以了是吧,OK啊,所以这块呢,我们也就。具体的就略掉了啊。好,下面呢说让你说说JDK15 16 17这个版本的新特性都有什么,就只有一个公司问到了啊,其实要我觉得呢,还挺变态的,为啥这么讲呢?因为每半年发布一个版本,你现在让我去,呃,咱们讲了这么多新特性啊,你让我去说一下,说这个新特性是哪个版本预览的,哪个版本有确定的,说实话啊。
20:04
这个我也记不住哈,我也记不太住啊,你可以呢,把这几个都记一下,然后呢,你就说一下,这是我们这个八以后呢,相应些相应的一些版本当中引入的一些新的一些特性啊,具体哪个版本这个这个预览的哪个转正呢,大家也完全没有必要呢去记啊,其实挺无聊的啊,哪怕这道题呢,我觉得呃,你就写了一个不会啊,我也觉得你也没有必要呢,去死记硬背在那个版本中去提供的啊,没啥意义啊。行,那这样的话呢,咱们把整个这个呃第18章咱们就讲完了,呃这一章呢,我们讲完以后呢,其实整个的咱们关于呃Java基础啊,一共呢是有18章啊,咱们呢,彻底的也就讲完了,诶咱们讲的时候呢,是分成了三个阶段是吧,第一个阶段呢,我们称为呢叫基本语法。啊,然后第二阶段呢,成为呢叫面向对象,第三阶段呢,成为呢叫高级应用,哎,重点呢,还是我们的第二个阶段。OK啊嗯,最后呢,简单的想给大家呢,分享几句话啊。这呢我写的啊,稍微的看一看啊呃,第一个问题说呢,学Java到底难不难,学技术呢到底难不难啊,我们已经都学完Java基础了,回过来呢,再看这句话,诶大家呢,是什么样的感触呢?
21:13
啊,我觉得的话呢,更多的时候呢,就是一些语法规则,呃,熟悉这些语法规则,记一记,背一背,啊剩下的点呢,其实上就是多去写。啊多去学,当然了,我们学任何一个语言哈,学任何一个东西,呃,你要想学的精啊,你肯定里边呢,会有很多的细节需要你去考虑,诶我建议大家呢,这些细节呢,还是在实践当中啊去操作。啊,实践当中去操作,咱们大部分开发当中遇到的场景呢,实际上都非常的普通和一般啊,你像咱们当初讲这个for循环也好,讲这个外循环也好,咱们还做过一些比较细致的一些这个算法题,其实啊,你发现呢,我们在写项目123的时候呢,咱们做的其实就是啊,或者要用的都是最普通的这个for和while这样的结构,没有特别复杂的啊,关键的就是我们在业务逻辑层面呢,它这个逻辑比较复杂了,你先要做这样的需求,再做这个需求,做这个需求,这几个需求你能不能把它穿起来。
22:11
代码量大了,这个理解力呢,需要呢,要求更高一点。还是多去写是吧,这个呃,以前的这个主席讲什么,就是要求这个知识分子是不是要上山下乡是吧?啊,这个农村啊,有广阔的天地啊,大有作为啊,那这块呢,我想说的是呢,就是大家呢,不要多去研究这个理论啊,更多的多去实践啊。科技实践。下边这块呢,抛出两个点啊,说在学习的路上如何看待寂寞是吧。这个包括疫情期间啊,很多时候呢,咱们这个也都是这个线上来授课了,这个线上你到底是不是自己在学习,还是在这块躺着,还是在干其他的。啊,这个呢,你得对自己负责是吧,这块呢,分享一个,呃,以前呢,我特别喜欢的一个词儿是吧,这叫小不忍则乱大谋忍啊,你现在是不是能忍得住。
23:05
包括大家现在学习,你说你是学到12点,你还是学到两点啊,还是学到十点你就睡了啊,这个注意一定是跟你自己学的,你也用不着呢,说我学到两点了,我想给谁去说一下,说看我多厉害是吧,看我多努力,没必要你都是给自己学的啊,你现在忍得住,耐得住寂寞啊,耐得住这个痛苦,那其实呢,最后呢,你都会有一个好的结果。OK啊,这个呢,其实这个有点像,嗯,比如后来呢,有好多这个书啊等等的提到一个概念叫做延迟满足是吧,就是你现在呢,做的很多的这个努力啊,啊,甚至说不爽的一些事儿啊,都是为了以后呢更爽啊,延迟满足啊,然后另外一个啊,说在未来的这个工作的路上呢,如何看待未来。这块呢,泛泛的说,这也是我另外的喜欢的一句话啊,叫识时务者为俊杰。啊,一方面啊,低头呢去写代码。啊,解决具体的业务问题啊,另外一方面也要抬头看一看,短则看一看有没有新的一些框架啊,新的一些技术呢,可以去学习,长则呢看一看啊,目前所从事的方向呢,是不是靠谱的,是不是有问题的,及时的做一些调整。
24:13
啊,识时务。OK,行呃,做一个聪明人会反思,工作当中呢,大家也会遇到各种各样的问题,不要呢,一出现问题的时候呢,就说,哎,为什么总是我倒霉是吧?为什么总我在这个坑,总是我在这个坑下呢,跌倒啊,时刻呢,反思一下啊,是不是需要做一些调整行,整个呢,要给大家分享的就是这样的一些内容。啊,也希望大家呢,这个把这个基础呢砸得更扎实一点,是吧,开始后续的这个学习,咱们江湖再见啊。
我来说两句