Java笔记
文章平均质量分 80
weixin_43575838
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
反射、注解、BeanUtils
学习目标能够通过反射技术获取Class字节码对象能够通过反射技术获取构造方法对象,并创建对象。能够通过反射获取成员方法对象,并且调用方法。能够通过反射获取属性对象,并且能够给对象的属性赋值和取值。能够使用Beanutils常用方法操作JavaBean对象能够说出常用的元注解及其作用能够完成注解的MyTest案例一,反射【重点】1.概述1.1什么是反射 反射是一种机制/功能,利用该机制/功能可以在程序运行过程中对类进行解剖并操作类中的构造方法,成员方法,成员属性。 反射乃框架之原创 2021-07-30 16:44:49 · 183 阅读 · 0 评论 -
Stream流
主要内容常用函数式接口Stream流学习目标 能够使用Function<T, R>函数式接口 能够使用Predicate函数式接口 能够理解流与集合相比的优点 能够理解流的延迟执行特点 能够通过集合或数组获取流 能够掌握常用的流操作 能够使用流进行并发操作 能够将流中的内容收集(转换为)到集合中 能够将流中的内容收集(转换为)到数组中1、常用函数式接口1.1 Predicate接口:测试参数真假,用来条件判断,还有与或非连接有时候我们需要对某种类型的数据进行原创 2021-07-29 21:19:01 · 301 阅读 · 0 评论 -
函数式接口、方法引用
主要内容常用函数式接口方法引用学习目标 能够使用@FunctionalInterface注解 能够自定义无参无返回函数式接口 能够自定义有参有返回函数式接口 能够理解Lambda延迟执行的特点 能够使用Lambda作为方法的参数 能够使用Lambda作为方法的返回值 能够使用输出语句的方法引用 能够通过4种方式(对象名,类名,父类引用super,本类引用this)使用方法引用 能够使用类和数组的构造器引用 能够使用Supplier函数式接口 能够使用Consumer函数式接原创 2021-07-29 21:15:13 · 559 阅读 · 1 评论 -
网络编程—网络通信、TCP通信、Socket
主要内容软件架构CS/BS网络通信三要素TCP通信Socket套接字ServerSocket学习目标 能够辨别UDP和TCP协议特点 能够说出TCP协议下两个常用类名称 能够编写TCP协议下字符串数据传输程序 能够理解TCP协议下文件上传案例 能够理解TCP协议下B/S案例1、网络编程入门1.1软件结构C/S结构 :全称为Client/Server结构,是指客户端和服务器结构常见程序有QQ、迅雷、百度网盘等软件,包括android、ios、电脑版等B/S结原创 2021-07-29 21:12:15 · 507 阅读 · 0 评论 -
缓冲流、转换流、序列化流、Files
主要内容转换流缓冲流序列化流打印流,了解一下即可学习目标 能够使用字节缓冲流读取数据到程序 能够使用字节缓冲流写出数据到文件 能够明确字符缓冲流的作用和基本用法 能够使用缓冲流的特殊功能 能够阐述编码表的意义 能够使用转换流读取指定编码的文本文件 能够使用转换流写入指定编码的文本文件 能够说出打印流的特点 能够使用序列化流写出对象到文件 能够使用反序列化流读取文件还原对象到程序中1、缓冲流之前学习了基本的一些流,作为IO流的入门,今天我们要见识一些更强大的流。比如能原创 2021-07-29 20:58:29 · 108 阅读 · 0 评论 -
字节流、字符流
主要内容IO流字节流字符流异常处理Properties学习目标 能够说出IO流的分类和功能 能够使用字节输出流写出数据到文件 能够使用字节输入流读取数据到程序 能够理解读取数据read(byte[])方法 能够使用字节流完成文件的复制 能够使用FileReader读数据 能够使用FileReader读数据一次一个字符数组 能够使用FileWirter写数据到文件 能够说出FileWriter中关闭和刷新方法的区别 能够使用FileWriter写数据的5个方法 能够使用原创 2021-07-29 20:53:25 · 224 阅读 · 0 评论 -
File类、递归
主要内容File类递归学习目标 能够说出File对象的创建方式 能够说出File类获取名称的方法名称 能够说出File类获取绝对路径的方法名称 能够说出File类获取文件大小的方法名称 能够说出File类判断是否是文件的方法名称 能够说出File类判断是否是文件夹的方法名称 能够辨别相对路径和绝对路径 能够遍历文件夹 能够解释递归的含义 能够使用递归的方式计算5的阶乘 能够说出使用递归会内存溢出隐患的原因1、File类:代表文件或者文件夹的路径路径:代表文件或者文件原创 2021-07-29 20:29:11 · 125 阅读 · 0 评论 -
线程池、Lambda表达式
主要内容线程间的通信,用锁调用方法来实现等待唤醒线程池Lambda表达式学习目标 能够理解线程通信概念 能够理解等待唤醒机制 能够描述Java中线程池运行原理 能够理解函数式编程相对于面向对象的优点 能够掌握Lambda表达式的标准格式 能够使用Lambda标准格式使用Runnable与Comparator接口 能够掌握Lambda表达式的省略格式与规则 能够使用Lambda省略格式使用Runnable与Comparator接口 能够通过Lambda的标准格式使用自定义的原创 2021-07-29 20:25:48 · 256 阅读 · 0 评论 -
线程、同步
主要内容线程同步线程状态学习目标 能够描述Java中多线程运行原理 能够使用继承类的方式创建多线程 能够使用实现接口的方式创建多线程 能够说出实现接口方式的好处 能够解释线程安全问题的出现的原因 能够使用同步代码块解决线程安全问题 能够使用同步方法解决线程安全问题 能够说出线程6个状态的名称1、多线程进程:进行中的程序线程:进程中的执行路径(执行路径,能做事情的地方,通道,路径)多线程:进程中有多条执行路径,我就可以做多个事情(一条执行路径,可以执行或者说原创 2021-07-29 20:19:49 · 88 阅读 · 0 评论 -
异常(try...catch、finally、自定义异常类)
学习目标 能够辨别程序中异常和错误的区别 说出异常的分类 说出虚拟机处理异常的方式 列举出常见的三个运行期异常 能够使用try…catch关键字处理异常 能够使用throws关键字处理异常 能够自定义异常类 能够处理自定义异常类1、异常1.1 异常概念异常 :指的是程序在执行( 编译和运行)过程中,出现的非正常的情况,最终会导致JVM的非正常停止(中断)在Java等面向对象的编程语言中,异常本身是一个类(模拟一类事物),产生异常就是创建异常对象并抛出了一个异常对象Ja原创 2021-06-16 19:27:42 · 449 阅读 · 0 评论 -
Map双列集合
学习目标 能够说出Map集合特点 使用Map集合添加方法保存数据 使用”键找值”的方式遍历Map集合 使用”键值对”的方式遍历Map集合 能够使用HashMap存储自定义键值对的数据 能够使用HashMap编写斗地主洗牌发牌案例1、Map双列集合:无序,通过键绑定值,对应关系,键唯一1.1 概述一一对应的关系,就叫做映射mapJava提供了专门的集合类用来存放这种对应关系的对象,即java.util.Map接口Map接口下的集合与Collection接口下的集合,它们存原创 2021-06-16 19:15:40 · 350 阅读 · 0 评论 -
List、Set、数据结构、Collections
学习目标 能够说出List集合特点 能够说出常见的数据结构 能够说出数组结构特点 能够说出栈结构特点 能够说出队列结构特点 能够说出单向链表结构特点 能够说出Set集合的特点 能够说出哈希表的特点 使用HashSet集合存储自定义元素 能够说出可变参数的格式 能够使用集合工具类 能够使用Comparator比较器接口进行排序1、List集合1.1 List接口:有序有索引元素可重复java.util.List接口继承自Collection接口,是单列集合的一个重要分支,习原创 2021-06-16 19:11:39 · 170 阅读 · 0 评论 -
Collection、迭代器Iterator、增强for、泛型
主要内容Collection集合迭代器增强for泛型学习目标 能够说出集合与数组的区别 说出Collection集合的常用功能 能够使用迭代器对集合进行取元素 能够说出集合的使用细节 能够使用集合存储自定义类型 能够使用foreach循环遍历集合 能够使用泛型定义集合对象 能够理解泛型上下限 能够阐述泛型通配符的作用1、Collection单列集合:存数据时一个个的存1.1 概述集合:集合是java中提供的一种容器,可以用来存储多个数据。集合和数组既然都是原创 2021-06-10 20:04:33 · 145 阅读 · 0 评论 -
Object类、常用API(Date、Calendar、System、StringBuilder、包装类)
1、Object类模拟对象这类事物具有的功能1.1 概述总结:对象也是一类事物,所以写对象类来模拟对象在堆内存中创建看不见也摸不着,所以提供toString方法把对象变成带有地址值的字符串,并提供equals方法比较对象的地址值是否相等,这两个方法子类可以继承,也可以重写做自己想要做的事情,重写都可以用idea的alt insert自动生成由于万物皆对象,所以所有的类都具有上面的方法,Object类是所有类的父类,所有类都直接或者间接的继承Object类java.lang.原创 2021-06-09 20:26:04 · 147 阅读 · 0 评论 -
final关键字、权限修饰符、内部类
学习目标 描述final修饰的类的特点 描述final修饰的方法的特点 能够说出权限修饰符作用范围 说出内部类的概念 能够理解引用类型作为成员变量 能够理解引用类型作为方法参数 能够理解引用类型作为方法返回值类型1、final关键字1.1 概述学习了继承后,我们知道子类可以在父类的基础上改写父类内容,比如,方法重写那么我们能不能随意的继承API中提供的类,改写其内容呢?显然这是不合适的。为了避免这种随意改写的情况,Java提供了final 关键字,用于修饰不可改变内容f原创 2021-06-08 20:48:03 · 272 阅读 · 0 评论 -
多态(向上转型、向下转型)
2、多态Fu f = new Zi();f.method();用非静态方法决定多态中的状态,f看起来应该是父类状态,却走了子类状态,出现多种状态,简称多态如何保证多态:(多种状态 = 向上转型 + 动态绑定,父类状态必须有,子类状态可有可无(子类可以继承父类状态)) //重点多态的作用:(一个父亲可以代表多个儿子的状态(方法),多态,多种状态) //重点2.1 概述多态是继封装、继承之后,面向对象的第三大特性。多态:同一种事物在不同时刻可以有不同的表现行为或状态,比如水可原创 2021-06-08 20:40:38 · 405 阅读 · 0 评论 -
接口(多实现、多继承)
1、接口1.1 概述概述:从广义上讲: 接口就是对外提供的规则 (扩展功能,比如USB接口)从狭义上:在Java里面指的是用interface修饰的东西接口,是Java语言中另一种引用数据类型是方法的集合 ,如果说类的内部封装了成员变量、构造方法和成员方法,那么接口的内部主要就是封装了常量和方法其中方法包含抽象方法 (JDK 7及以前),默认方法 和静态方法 (JDK 8),私有方法 (JDK 9)接口的定义,它与定义类方式相似,但是使用 interface 关键字原创 2021-06-08 20:18:52 · 487 阅读 · 0 评论 -
继承、this、super、抽象类
目标 能够解释类名作为参数和返回值类型 能够写出类的继承格式 能够说出继承的特点 能够说出子类调用父类的成员特点 能够说出方法重写的概念 能够说出super可以解决的问题 描述抽象方法的概念 写出抽象类的格式 写出抽象方法的格式 能够说出父类抽象方法的存在意义1、 继承1.1 概述多个类中存在相同属性(成员变量模拟)和行为(成员方法模拟)时,抽取到单独一个类中,则无需再定义这些属性和行为,继承那个类即可这多个类可以称为子类(或派生类),单独那一个类称为父类、超类(sup原创 2021-06-05 10:32:47 · 166 阅读 · 0 评论 -
String字符串类、static关键字、Arrays数组工具类、Math数学工具类
1、String字符串类1.1 String类概述java.lang.String 类代表字符串。Java程序中所有的字符串文字(例如"abc" )都可以被看作是实现此类的实例(实例就是对象),即告诉我,"abc"是String类的一个对象!!!,是对象就可以.来调用方法,实现不同的功能!!!1.2 面试题常见字符串不变:字符串是常量 ,字符串的值在创建后不能被更改//字符串不变:字符串是常量,字符串的值在创建后不能被更改:String s1 = "abc";//"abc"对象,s1对象名,原创 2021-06-03 19:43:23 · 272 阅读 · 0 评论 -
常用类Scanner、Random、ArrayList
1、APIAPI(Application Programming Interface),应用程序编程接口。Java API是一本程序员的字典 ,是JDK中提供给我们使用的类的文档说明书。(就是把底层的代码实现封装起来实现某功能提供给我们使用)API使用步骤(能够明确API的使用步骤)打开帮助文档。点击显示,找到索引,看到输入框。你要找谁?在输入框里输入,然后回车。看包。java.lang下的类不需要导包,其他需要。看类的解释和说明。学习构造方法。使用成员方法。2、Scanner原创 2021-06-02 20:22:41 · 218 阅读 · 1 评论 -
面向对象(类和对象、重载、构造方法、this关键字)
1、对象:万物皆对象面向对象思想(Object Oriented Programming)一切客观存在的事物都是对象,万物皆对象任何对象,一定有自己的特征和行为对象属性: 即特征,代表对象有什么,例:电脑对象有品牌、价格、配置、尺寸等…方法: 即行为,代表能做什么,例:电脑对象可以打游戏、写文档、P图等…对象是类的一个实例,具体存在的,看得见摸得着的,并且具备该类事物的属性和行为。2、类2.1 类的概述如何使用程序模拟现实世界,解决现实问题首先,在程序中,原创 2021-05-30 18:11:31 · 214 阅读 · 0 评论 -
数组(创建、遍历、扩容、替换、排序)
1、概念概念: 一组连续的存储空间,存储多个相同数据类型的值。 注:类型相同,长度固定2、数组组成3、数组默认值4、声明1、先声明,再分配空间:数据类型[] 数组名; int[] array;数组名 = new 数据类型[长度]; array = new int[3];2、声明并分配空间数据类型[] 数组名 = new 数据类型[长度]; int[] array = new原创 2021-05-26 19:59:50 · 239 阅读 · 0 评论 -
方法、递归
1、方法的概念、定义、调用概念: 实现特定功能的一段代码,可反复使用。定义语法:public static void 方法名(形式参数){ //方法名遵循标志符命名 //功能代码,方法主体}形参等价于局部变量的声明调用语法: function();,调用对应的方法名方法名称(实际参数);变量数据类型 变量 = 方法名称(实际参数);实参等价于局部变量的赋值变量类型与返回值类型一致方法的组成:[修饰符列表] 返回值类型 方法名(形式参数列表){ 方原创 2021-05-24 21:04:55 · 92 阅读 · 0 评论 -
循环结构(while、do...while、for、增强for、break与continue)
3.循环结构3.1 while循环while是最基本的循环,语法:while(布尔表达式){ //循环内容}只要布尔表达式为true,循环就会一直执行下去,一直为true则会出现【死循环】绝大部分时候会让循环停下来,因此需要一个让表达式失效的语句来结束循环极少部分情况需要循环一直执行,比如:服务器的请求响应、监听等举例:输出1-100public class WhileDemo01 { public static void main(String[] args原创 2021-04-30 18:13:01 · 195 阅读 · 0 评论 -
if选择结构与switch分支结构
1、if单选泽结构语法及举例:if(布尔表达式){ //如果布尔表达式为true将执行的语句}if(score>=60){ System.out.println("及格");}2、if双选择结构语法及举例:if(布尔表达式){ //如果布尔表达式为true将执行的语句}else{ //如果布尔表达式为false将执行的语句}if(score>=60){ System.out.println("及格");}else{ Syst原创 2021-05-25 14:13:24 · 131 阅读 · 0 评论 -
Java语言基础—变量、数据类型、运算符、类型转换、Scanner
1、变量变量: 计算机内存中的一块存储空间,是存储数据的基本单元。声明: 数据类型 变量名;int money;//开辟int类型变量空间‘赋值: 变量名 = 值;money = 1000; //将整数100赋给变量money注:Java是强类型语言,变量的类型必须与数据的类型一致。变量的定义方式声明变量的3种方式:先声明,再赋值(常用) 数据类型 变量名; 变量名 = 值;声明并赋值(常用)数据类型 变量名 = 值;多个同数据类型变量的声明与赋值原创 2021-05-19 19:38:15 · 92 阅读 · 0 评论 -
Java概述与环境搭建
1、什么是程序?程序:为模拟现实世界和解决现实问题而使用计算机语言编写的一系列有序的指令的集合。2、Java历史与特点见另一篇博客:Java概述、发展史、三大版本、语言特性3、Java运行机制计算机执行机制:编译执行计算机执行机制:解释执行Java执行机制:先编译,再解释可参考另一篇博客:了解 Java 类的加载与执行4、Java的环境搭建JVM、JRE、JDK:三者区别参考博客:JDK、JRE、JVM 三者关系配置环境变量参考博客:JDK环境配置DOS命令操作参考博客:常原创 2021-05-18 19:51:49 · 97 阅读 · 0 评论 -
值传递与引用传递
值传递与引用传递值传递:指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。引用传递:是指在调用函数时将实际参数的地址直接传递到函数中(的形参),那么在函数中对参数所进行的修改,将影响到实际参数。Java其实还是值传递的,只不过对于对象参数,值的内容是对象的引用举例1:值传递public class Demo01 { public static void main(String[] args) { int x = 10; meth原创 2021-04-30 18:13:35 · 99 阅读 · 0 评论 -
数组
1.数组数组是 相同数据类型 若干数据 的 有序 集合 。其中,每一个数据称作一个数据元素,每个数组元素可以通过下一个下标来访问它们(下标从0开始)。1.1 声明与创建首先必须 声明数组变量,才能在程序中使用,声明数组变量的语法:语法1:数组类型[] 数组名; //首选语法2:数组类型 数组名[]; //知道就可以int[] nums;//首选方法int nums2[];//非首选,效果相同举例:int[] nums; //定义声明一个数组转载 2021-04-30 18:13:54 · 146 阅读 · 1 评论 -
方法(方法的定义和调用,重载,可变参数、递归)
1、方法1.1 方法是什么?System.out.println(),它是什么呢?System是一个系统类out是System类的一个标准输出对象println()是out对象的一个方法Java方法是语句的集合,它们在一起执行一个功能 方法是解决一类问题的步骤的有序组合 方法包含于类或对象中 方法在程序中被创建,在其它地方被引用**设计方法的原则:**方法的本意是功能块,就是实现某个功能的语句块的集合。设计方法的时候最好保持方法的原子性***,即一个方法只完成一个功原创 2021-04-30 18:13:20 · 93 阅读 · 0 评论 -
运算符
6.运算符算数运算符:+、-、*、/、%(取余)、++(自增)、–(自减)赋值运算符:=关系运算符:>、<、>=、<=、==(等于)、!=(不等于)、instanceof逻辑运算符:&&(与)、||(或)、!(非)位运算符(了解):&、|、^、~、>>、<<、>>>条件运算符:? :扩展赋值运算符:+=、-=、*=、/=6.1 算数运算符例1:+、-、*、///二元运算符+、-、*、/int转载 2021-04-24 16:44:29 · 83 阅读 · 0 评论 -
用户交互Scanner
1.1用户交互Scanner对象Scanner用于获取用户的输入,基本语法:Scanner s = new Scanner(System.in);通过Scanner类的next()和nextLine()方法获取输入的字符串,在读取前我们一般需要使用hasNext()与hasNextLine()判断是否还有输入的数据scanner.next()、scanner.hasNext()举例代码:import java.util.Scanner;public class Demo01 { pu原创 2021-04-25 18:00:26 · 85 阅读 · 0 评论 -
数据类型及拓展
强类型语言:要求变量的使用要严格符合规范,所有的变量都必须先定义后才能使用,例如:Java、.net 、Python、C++等语言弱类型语言:某一个变量被定义类型,该变量可以根据环境变化自动进行转换,不需要经过显性强制转换。例如:vb 、PHP、javascript等语言3.1 Java数据类型3.1.1 基本数据类型位(bit): 是计算机内部存储数据的最小单位,用0或1表示,例:11001100是一个八位二进制数字节(byte): 是计算机数据处理的基本单位,一般用B表示,1B.原创 2021-04-21 17:49:14 · 113 阅读 · 0 评论 -
基本数据类型转换
基本数据类型之间是存在固定的转换规则的,现总结出以下 6 条规则,无论是哪个程序,将这 6 个规则套用进去,问题迎刃而解:八种基本数据类型中,除 boolean 类型不能转换,剩下七种类型之间都可以进行转换;如果整数型字面量没有超出 byte,short,char 的取值范围,可以直接将其赋值给byte,short,char 类型的变量;小容量向大容量转换称为 自动类型转换,容量从小到大的排序为:byte < short<char)< int < long < f.原创 2021-04-22 22:27:10 · 163 阅读 · 0 评论 -
变量、常量、作用域
1、变量变量就是内存当中存储数据的一块空间,它包括三要素:数据类型、变量名、值。变量 根据* 声明的位置不同*可以分为:局部变量和成员变量。局部变量:在方法体当中声明的变量以及方法的每一个参数。成员变量:在方法体外,类体内声明的变量(从属于类,通俗来讲,只包在类的大括号里) 用static关键字修饰的为静态成员变量(简称静态变量),从属于类 没有static关键字修饰则称为实例成员变量(简称实例变量),从属于对象public class Test06 { //原创 2021-04-24 14:58:33 · 176 阅读 · 0 评论 -
注释、标志符与关键字
1.注释单行注释//文字多行注释/*注释*/文档注释/***@Author:xxx*/2.标识符与关键字2.1 标识符所有的***标识符应以字母(A-Z或a-z),美元符($)或下划线(_)开头***首字符之后可以使用字母(A-Z或a-z),美元符($),下划线(_)或数字的任何字符组合不能使用关键字作为变量名和方法名标识符严格区分大小写可以使用中文和拼音命名,但是不建议这样做Java 关键字和保留字不能作为标识符标识符理论上没有长度限制。命名通用原创 2021-04-21 17:45:11 · 87 阅读 · 0 评论 -
JavaDoc生成文档
JavaDoc生成文档javadoc命令是用来生成自己的api文档的参数信息@author 作者名@version 版本号@since 指明需要最早使用的jdk版本@param 参数名@return 返回值情况@throws 异常抛出情况文档生成1、 命令行方法:进入类所在的路径,dos窗口输入:javadoc -encoding UTF-8 -charset UTF-8 类名.java生成的index.html即为文档首页2、 IDEA方法:第一步:在工具栏中找到 T原创 2021-04-24 16:56:50 · 84 阅读 · 0 评论 -
JDK环境配置
(jdk官网下载)下载jdk(在此以win10安装jdk1.8为例,jdk可自行选择更高版本下载)双击安装,傻瓜式安装,选择一个安装目录即可,并记住安装目录,配置时需要用到安装目录最好选择一个专门的英文文件夹配置环境变量 右键此电脑——属性——设置——关于——高级系统设置——环境变量亦可在win10搜索框直接搜索环境变量 新建系统变量 编辑系统变量Path在此用%%引用了JAVA_HOME的路径,直接用两个bin文件夹的路径亦可4.DOS命..原创 2021-04-21 09:48:00 · 97 阅读 · 0 评论 -
了解 Java 类的加载与执行
对 Java 的加载与执行提前有一个简单的了解,看下图:通过上图,我们可以看到 Java 程序从开发到最终运行是这样进行的:第一步(写代码):在任意位置创建一个.java 结尾的文件,程序员在该文件中编写符合 Java语法的源代码,这个文件被称为Java 源文件。第二步(编译):使用“javac”命令对 java 源文件进行编译,如果 Java 源文件符合 Java语法规则,则编译生成 1 个或者多个以“.class”结尾的文件。“.class”结尾的文件我们称之为字节码文件,注意字节码.原创 2021-04-22 21:39:14 · 192 阅读 · 0 评论 -
JDK、JRE、JVM 三者关系
JDK、JRE、JVM 分别是什么?它们之间的关系又是怎样的呢?见下图:从上图中我们可以看到,JDK、JRE、JVM 之间存在这样的包含关系:JDK包含 JRE,JRE又包含 JVM。换句话说,只要安装了 JDK,JRE 和 JVM 则自动就安装了。那么它们分别代表什么呢:① JDK:JDK(Java Development Kit) 是 Java 语言的软件开发工具包(SDK)。它是每一个 Java 软件开发人员必须安装的。JDK 安装之后,它会自带一个 JRE,因为软件开发人员编写完原创 2021-04-22 21:31:39 · 1656 阅读 · 0 评论
分享