2018年——完整的Java基础笔记整理

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。

给你学习路线:html-css-js-jq-javase-数据库-jsp-servlet-Struts2-hibernate-mybatis-spring4-springmvc-ssh-ssm

常量的概述和使用

详解进制转换原理。

原码补码

变量的的格式和使用

数据类型的概述的转换

算术运算符的使用

赋值运算符的使用

关系运算符的使用

常量的概述和使用

A:什么是常量

在程序执行的过程中其值不可以发生改变

B:Java中常量的分类

字面值常量

自定义常量(面向对象部分讲)

C:字面值常量的分类(6种常量)

字符串常量 用双引号括起来的内容

整数常量所有整数(无限个)

小数常量所有小数

字符常量 用单引号括起来的内容,里面只能放单个数字,单个字母或单个符号

‘10’,’ab’非法的。

布尔常量较为特殊,只有true和false

空常量 null(数组部分讲解)

D:案例演示

用输出语句输出各种常量。null不演示

classDemo1{

publicstaticvoidmain(String[] args){

//字符串常量

System.out.println("Hello World!");

//整数常量

System.out.println(100);

//小数常量

//默认是Double精度类型

System.out.println(12.3);

//字符常量

//单个数字,单个字母,或单个符号,一个也没有不可以,超过也一个不可以。

System.out.println(' ');

//布尔常量

//true和false都是关键字

System.out.println(true);

//null常量不演示,后续会详细讲

//在字符常量中'100','ab',''均为非法,只能单个,否则报错未结束的字符串

}

}

进制概述和二,八,十六进制图解

A:什么是进制

进制:就是进位制,是人们规定的一种进位方法。 对于任何一种进制–X进制,就表示某一位置上的数运算时是逢X进一位。二进制就是逢二进一,八进制是逢八进一,十进制是逢十进一,十六进制是逢十六进一。

例如一周有七天,七进制,一年有十二个月,十二进制

B:二进制的由来

其实二进制来源与中国,请看史料记载

18世纪德国数理哲学大师莱布尼兹从他的传教士朋友鲍威特寄给他的拉丁文译本《易经》中,读到了八卦的组成结构,惊奇地发现其基本素数(0)(1),即《易经》的阴爻yao- -和__阳爻,其进位制就是二进制,并认为这是世界上数学进制中最先进的。20世纪被称作第三次科技革命的重要标志之一的计算机的发明与应用,其运算模式正是二进制。它不但证明了莱布尼兹的原理是正确的,同时也证明了《易经》数理学是很了不起的。

C:八进制的由来

任何数据在计算机中都是以二进制的形式存在的。二进制早期由电信号开关演变而来。一个整数在内存中一样也是二进制的,但是使用一大串的1或者0组成的数值进行使用很麻烦。

所以就想把一大串缩短点,将二进制中的三位用一位表示。这三位可以取到的最大值就是7.超过7就进位了,这就是八进制。

D:十六进制的由来

但是对于过长的二进制变成八进制还是较长,所以出现的用4个二进制位表示一位的情况,四个二进制位最大是15,这就是十六进制。

E:不同进制表现同一个数据的形式特点

进制越大,表现形式越短

不同进制数据的表现形式

小编推荐一个学Java的学习裙【 六五零,五五四,六零七 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

system-min.png

二进制是所有进制的基础。8421,2的次方数。

A:二进制的数据表现形式

由0,1组成。以0b(b可以大写也可以小写)开头(JDK1.7版本可以表示二进制了)

B:八进制的数据表现形式

由0,1,…7组成。以0开头

C:十进制的数据表现形式

由0,1,…9组成。整数默认是十进制的

D:十六进制的数据表现形式

由0,1,…9,a,b,c,d,e,f(大小写均可)。以0x开头

E:案例演示

classDemo2JinZhi{

publicstaticvoidmain(String[] args){

//二进制,1.7版本前面加上0b表示二进制,b大写小写都可以

System.out.println(0b100);

//八进制

System.out.println(074);

//十进制

System.out.println(100);

//十六进制,10到15分别用a到f表示,大小写都可以

System.out.println(0x3c);

// 0b1010101 052 0x52

}

}

* 输出不同进制表现100的数据。

*0b100//二进制 0b开头

*0100//八进制 0开头

*100// 十进制

*0x100//16进制0x开头

任意进制到十进制的转换图解

A:任意进制到十进制的转换原理

系数:就是每一位上的数据。

基数:X进制,基数就是X。

权:在右边,从0开始编号,对应位上的编号即为该位的权。

结果:把系数*基数的权次幂相加即可。

B:画图练习

二进制–十进制

八进制–十进制

十六进制–十进制

进制互相转换原理图

注意去权次幂的时候,从0开始要数到系数的位置,从1开始的话,要少数一位。

十进制到任意进制的转换图解

A:十进制到任意进制的转换原理

除积倒取余

B:画图练习

十进制–二进制

十进制–八进制

十进制–十六进制

jinzhi.png

快速的进制转换法

A:8421码及特点

8421码是中国大陆的叫法,8421码是BCD代码中最常用的一种。在这种编码方式中每一位二值代码的1都是代表一个固定数值,把每一位的1代表的十进制数加起来,得到的结果就是它所代表的十进制数码。

B:通过8421码的方式进行二进制和十进制的相互转换

C:二进制到八进制的简易方式

D:二进制到十六进制的简易方式

8421ma-min.png

八进制数字 三个bit位为一组。

十六进制,四个bit位为一组。

一个字节占八个个bit位。

一个字,两个字节,16个bit位置。

原码反码补码

A:为什么要讲解有符号数据表示法

后面学习数据类型的时候,要学习强制类型转换,如果不知道有原反补会看不懂结果

B:有符号数据表示法的几种方式

原码

就是二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。

通过一个字节,也就是8个二进制位表示+7和-7

0(符号位)0000111

1(符号位)0000111

反码

正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。

补码

正数的补码与其原码相同;负数的补码是在其反码的末位加1。

YuanMaFanMaBuMa-min.png

在计算机系统里面,存储采用的是原码的形式,计算采用的都是补码的形式,进行运算。

原码->反码->补码

原码反码补码的练习

A:已知原码求补码(加一取反)

0b10110100

0b11001100

B:已知补码求原码

0b11101110 (减1取反)

ob10010010


YuanMaBuMaLianxi-min.png

变量的概述及格式

A:什么是变量

在程序执行的过程中,在某个范围内其值可以发生改变的量(ex:数学的未知数)

B:变量的定义格式

数据类型 变量名 = 变量值;

C:为什么要定义变量

用来不断的存放同一类型的常量,并可以重复使用

数据类型的概述和分类

A:为什么有数据类型

Java语言是强类型语言,对于每一种数据都定义了明确的具体数据类型,在内存总分配了不同大小的内存空间

B:Java中数据类型的分类

基本数据类型

引用数据类型

面向对象部分讲解

C:基本数据类型分类(4类8种)

整数型

byte,short,int,long

浮点型

float,double

字符型

char

布尔型

boolean

D:引用数据类型

类(class)、接口(interface)、数组([]).

classDemo1{

publicstaticvoidmain(String[] args){

//整数类型byte,short,int,long

/*

byte占的是1个字节 = 8个bit

0 1111111 = 1 + 2 + 4 + 8 + 16 + 32 + 64 = 127

1 1111111 = -127

1 0000000 取反

1 0000001 -127的补码

1 0000000 -128的补码

0 0000001 减去1

-------------

1 1111111

1 0000000 -128的原码

byte取值范围是-128到127 -128到-1 0到127 256个数

short占的2个字节 = 16个bit

int 占的4个字节 = 32个bit //int是整数类型的默认类型

long占的8个字节 = 64个bit

*/

//浮点类型 float和double

/*

float占的是4个字节单精度

double占的是8个字节双精度 double是浮点数的默认类型

*/

//字符类型

/*

char占的两个字节 0到65535之间

*/

//布尔类型

/*

布尔类型占几个字节?

按照bit位算的话,应该占的是八分之一个字节

java中没有明确布尔类的大小。

*/

}

}

定义不同数据类型的变量

A:案例演示

定义不同基本数据类型的变量,并输出

赋值时候注意float类型,long类型

classDemo2DateType{

publicstaticvoidmain(String[] args){

//整数类型

byteb =100;

shorts =1000;

inti =10000;

longl =123456789012345678L;

//System.out.println(12345+5432l);

//切记如果想标识long类型的数,超过了int的取值范围

//需要在末尾加上L,最好是大写,因为小写的太像1这个数字;

//浮点类型

//13.4后面的d可以省略,d可以是大写也可以是小写

//默认的double类型

floatf =12.3f;

doubled =13.4d;

//字符类型

charc1 ='a';

charc2 ='0';

charc3 ='中';

//字符是否可以存储中文?

//可以,java是unicode编码,char类型占的两个字节,、

//而一个中文占的也是两个字节

//System.out.println(c3);

//布尔类型

booleanb1 =true;

booleanb2 =false;

}

}

附上一个截图,不同数据类型的取值范围

小编推荐一个学Java的学习裙【 六五零,五五四,六零七 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

fanwei-min.PNG

整型的取值范围默认是int,浮点型默认是double,所以当使用float单精度定义数据时候必须带有f,数字过于大的话,需要在末尾带有L(小写容易混淆)。

使用变量的注意事项

A:案例演示

a:作用域问题

同一个区域不能使用相同的变量名

b:初始化值问题

局部变量在使用之前必须赋值

c:一条语句可以定义几个变量

int a,b,c…;

classDemo3DateType{

publicstaticvoidmain(String[] args){//作用域

intx =10;

//赋值将原来10覆盖掉

x =20;

//System.out.println(x);

inty;

//变量在使用之前必须赋值

y =30;

//System.out.println(y);

//一条语句可以声明多个变量

inta,b,c;

a =10;

b =20;

c =30;

System.out.println(a);

System.out.println(b);

System.out.println(c);

}

}

数据类型转换之隐式转换

A:案例演示

a:int + int

b:byte + int 的结果分别用byte和int类型接收,看效果

B:Java中的默认转换规则

C:画图解释byte+int类型的问题


leixing-min.png

由于java中整型的数据默认是int类型,因此 short btye类型的数据和int类型的进行运算的时候,会被自动提升称为int类型。

int和long等更高精度的数据运算时,会提升成为long等更高精度的数据类型,为了确保精度。

数据类型转换之强制转换

A:强制转换问题

int a = 10;

byte b = 20;

b = a + b;

B:强制转换的格式

b = (byte)(a + b);

C:强制转换的注意事项

如果超出了被赋值的数据类型的取值范围得到的结果会与你期望的结果不同

classDemo4DateType{

publicstaticvoidmain(String[] args){

/*int i = 100;

byte b = 50;

//自动类型提升(隐式转换)

i = i + b;

System.out.println(i);*/

//int类型的150

//00000000 00000000 00000000 10010110

// 用byte强转150后的结果,运算中都是使用补码(只截取最后八位)

//10010110

//0 1101010106

//1 1101010-106的原码

//1 0010101-106的反码

//0 0000001 +1

//1 0010110-106的补码

inti =100;

byteb =50;

b = (byte)(i + b);//强制类型转换(丢失精度)

System.out.println(b);

byteb2 = (byte)300;

System.out.println(b2);

//300的二进制表现形式,本应该占32位

//00000000 00000000 00000001 00101100

//00101100强转成了byte,精度丢失。

}

}

面试题之变量相加和常量相加的区别

A:案例演示

面试题:看下面的程序是否有问题,如果有问题,请指出并说明理由。

byte b1 = 3;

byte b2 = 4;

byte b3 = b1 + b2;(报错)

从两方面去回答这个题

b1和b2是两个变量,变量里面存储的值都是变化的,所以在程序运行中JVM是无法判断里面具体的值

byte类型的变量在进行运算的时候,会自动类型提升为int类型 ,所相当于把一个int的值给了byte,编译报错

byte b4 = 3 + 4;(没问题)

3和4都是常量,java有常量优化机制,就是在编译的的时候直接把3和4的结果赋值给b4了

//面试题(数据类型转换)

classDemo5DateType{

publicstaticvoidmain(String[] args){

byteb,b1,b2;

b1 =3;

b2 =4;

//b = b1 + b2;

b =3+4;

//这两种哪种会报错,为什么

//b1和b2是两个byte类型的变量,

//在进行运算的会自动类型提升为int类型

//b1和b2是两个变量,jvm无法判断里面具体的值

//3和4是两个常量,java有一个常量优化机制,在编译直接讲常量相加的结果算出并赋值

System.out.println(b);

bytex =100;

}

}

数据类型中补充的几个小问题

A:在定义long或者float类型的变量的时候,需要在末尾跟上L和F;

因为默认的数据类型是int和double

byte和short在定义的时候,他们接收的实际上是一个int类型值,越界就会报错

B: Byte的值问题

byte b1 =127;

byte b2 =(byte)300; //损失精度

byte b4 =(byte)130; //损失精度,此外计算机在进行运算的时候,都是使用补码

byte的取值范围 -128~127;

C: 数据类型转换之默认转换

进行混合运算的时候,byte,short,char不会相互转换,都会自动类型提升为int类型,其他类型进行混合运算的是小的数据类型提升为大的

byte,short,char – int – long – float – double

long: 8个字节

float:4个字节

IEEE754 国际制定的标准

4个字节是32个二进制位

1位是符号位 1是负数,0是正数

8位是指数位

00000000 11111111

0到255

1到254

每个指数位减去127

-126到127

23位是尾数位(无限接近1)

A:它们底层的存储结构不同。

B:float表示的数据范围比long的范围要大

long:2^63-1

float:3.410^38 > 210^38 > 28^38 = 22^3^38 = 2*2^114 > 2^63-1

D: java语言中的字符char可以存储汉字吗?为什么?

可以的,因为java语言采用的是Unicode编码,unicode编码中每个字符占用两个字节

所以,java中的字符可以存储一个中文汉字。

字符和字符串参与运算

A:案例演示

System.out.println(‘a’); //a的acsII码表 97

System.out.println(‘a’+1);//输出 98 提升成int类型

System.out.println((char)(’a’+1));//强转输出 b

System.out.println((char)(98));//强转输出 b

System.out.println((char)(100));//强转输出 ? 只用到了127位(Unicode)

通过看结果知道’a’的值是多少,由此引出ASCII码表

B:ASCII码表的概述

记住三个值:

‘0’ 48

‘A’ 65

‘a’ 97

C:案例演示

System.out.println(“hello”+’a’+1);//输出:helloa1 任何数据用+与字符串连接最后都会产生新的字符串

System.out.println(‘a’+1+”hello”);//输出: 98 hello

D:+在有字符串参与中被称为字符串连接符

System.out.println(“5+5=”+5+5);//输出 5+5=55

System.out.println(5+5+”=5+5”);//输出:10=5+5

char数据类型

A:char c = 97;

B:Java语言中的字符char可以存储一个中文汉字吗?为什么呢?

可以。因为Java语言采用的是Unicode编码。Unicode编码中的每个字符占用两个字节。

所以,Java中的字符可以存储一个中文汉字

算术运算符的基本用法

A:什么是运算符

B:运算符的分类

C:算数运算符有哪些

D:案例演示

算数运算符的基本用法

注意事项:

a:整数相除只能得到整数。如果想得到小数,必须把数据变化为浮点数类型

b:/获取的是除法操作的商,%获取的是除法操作的余数

yunsuanfu-min.png

//取模运算

classDemo7Operator{

publicstaticvoidmain(String[] args){

//取模运算就是取余数

//System.out.println(12 % 5);

//如果左边绝对值小于右边就是本身

//System.out.println(-3 % 5);

//如果左边绝对值是右边的倍数时,结果为0

//System.out.println(-10 % 5);

//如果左边的绝对值大于右边,结果是余数,符号取决于左边,右边忽略不计

//System.out.println(13 % -5);

//一个数模与2结果要么是0,要么是1,可以用来切换条件

//System.out.println(3 % 2);

inta =100;

intb =30;

System.out.println(a / b);//整数与整数运算结果肯定是整数,不能是小数 out : 3

}

}

算术运算符++和–的用法

A:++,–运算符的作用

自加(++)自减(–)运算

++:自加。对原有的数据进行+1

–:自减。对原有的数据进行-1

B:案例演示

a:单独使用:

放在操作数的前面和后面效果一样。(这种用法是我们比较常见的)

b:参与运算使用:

放在操作数的前面,先自增或者自减,然后再参与运算。

放在操作数的后面,先参与运算,再自增或者自减。

同理a–

classDemo8Operator{

publicstaticvoidmain(String[] args){

/*int a = 4;

a++; a++ 相当于a = a+1

//如果++符号放在变量的后面,是先赋值,再自加

int b = a++;

//无论赋值,还是运算,还是打印都是先将变量里的值拿出来,然后在自身+1

//System.out.println("b = " + b);

System.out.println(a++);//输出4

System.out.println(a);*///输出 5

inta =4;

++a;//a++和++a单独写没有区别

//int b = ++a;//如果++符号放在变量的前面,是先自加,然后再赋值

//System.out.println("b = " + b);

System.out.println(a);

}

}

算术运算符++和–的练习

A:案例演示

请分别计算出a,b,c的值?

int a = 10;

intb =10;

intc =10;

a = b++;//a = 10 b = 11

c = --a;//c = 9 a = 9

b = ++a;//b = 10 a = 10

a = c--;//a = 9 c = 8

B:案例演示

请分别计算出x,y的值?

intx =4;

inty = (x++)+(++x)+(x*10);

classDemo9Operator{

publicstaticvoidmain(String[] args){

/*int a = 10;

int b = 10;

int c = 10;

a = b++;//a = 10 b = 11

System.out.println(a);//10

c = --a;//c = 9 a = 9

b = ++a;//b = 10 a = 10

a = c--;//a = 9 c = 8

System.out.println("=================================");

System.out.println(a);//9

System.out.println(b);//10

System.out.println(c);//8*/

intx =4;

//4 + 6 + 6 * 10 = 70

inty = (x++)+(++x)+(x*10);

System.out.println(x);

System.out.println(y);

}

}

赋值运算符的基本用法

A:赋值运算符有哪些

B:案例演示

赋值运算符的基本用法

注意事项:

a:基本的赋值运算符:=

把=右边的数据赋值给左边。

b:扩展的赋值运算符:+=,-=,*=,/=,%=

+= 把左边和右边做加法,然后赋值给左边。

赋值运算符的面试题

A:案例演示

面试题:看下面的程序是否有问题,如果有问题,请指出并说明理由。

short s=1;s = s+1;

short s=1;s+=1;

//面试题

classDemo10Operator{

publicstaticvoidmain(String[] args){

inta =10;

//a += 20;//a = a + 20;相当于将左右两边相加的结果再赋值给左边,

//20 += a;//左边一定是变量

a *=20;

//System.out.println(a);

shorts=1;

//short类型与int类型进行运算会提升为int类型,结果是int类型,不能赋值给short类型

//s = s+1;

// s = (short)(s + 1);+=号是一个赋值运算符,所以为了能够保证赋值成功,会把int类型强转为short类型

s+=1;

System.out.println(s);

}

}

关系运算符的基本用法及其注意事项

A:关系运算符有哪些

B:案例演示

关系运算符的基本用法

注意事项:

无论你的操作是简单还是复杂,结果是boolean类型。

“==”不能写成”=”。

小编推荐一个学Java的学习裙【 六五零,五五四,六零七 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,378评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,356评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,702评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,259评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,263评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,036评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,349评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,979评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,469评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,938评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,059评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,703评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,257评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,262评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,501评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,792评论 2 345

推荐阅读更多精彩内容

  • 常量的概述和使用 A:什么是常量在程序执行的过程中其值不可以发生改变 B:Java中常量的分类字面值常量自定义常量...
    野望君阅读 610评论 0 0
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,581评论 18 399
  • 苏曼在梦里看到了一只小猫。 它躺在草地上,眼睛半眯着,黄白相间的毛像婴儿的头发一样细细的,软软的。它的嘴唇和鼻头都...
    月光触水寒阅读 251评论 1 1
  • 临时下了一个图 fathing
    鲁狂歌阅读 160评论 0 0
  • 云水绕岫里,碧波鲤鱼池。 山中草木深,鸟儿长空戏。
    醉梦红尘阅读 166评论 1 3