黑马程序员-Java基础总结02——Java基本语法(一)
-------android培训、java培训、期待与您交流! ----------
1、关键字:被Java语言赋予了特殊含义的单词(该单词所以字母均小写)。
用于定义数据类型的关键字 |
||||||||
class |
interface |
byte |
short |
int |
||||
long |
float |
double |
char |
boolean |
||||
void |
|
|
|
|
||||
用于定义数据类型值的关键字 |
||||||||
true |
false |
null |
|
|
||||
用于定义流程控制的关键字 |
||||||||
if |
else |
switch |
case |
default |
||||
while |
do |
for |
break |
continue |
||||
return |
|
|
|
|
||||
用于定义访问权限修饰符的关键字 |
||||||||
private |
protected |
public |
|
|
||||
用于定义类,函数,变量修饰符的关键字 |
||||||||
abstract |
final |
static |
synchronized |
|
||||
用于定义类与类之间关系的关键字 |
||||||||
extends |
implements |
|
|
|
||||
用于定义建立实例及引用实例,判断实例的关键字 |
||||||||
new |
this |
super |
instanceof |
|
||||
用于异常处理的关键字 |
||||||||
try |
catch |
finally |
throw |
throws |
||||
用于包的关键字 |
||||||||
package |
import |
|
|
|
||||
其他修饰符关键字 |
||||||||
native |
strictfp |
transient |
volatile |
assert |
2、标识符:程序中可自定义的一些名称(不可数字开头及使用关键字,Java区分大小写)
*包名:多单词组成时所有字母都小写:xxxyyyzzz ,例:packagestudent ;
*类名接口名:多单词组成时,所有单词首字母大写:XxxYyyZzz (classHello);
*变量名和函数名:单个单词时均小写,而多单词组成时,除第一个单词首字母小写外其他首字母均大写:xxxYyyZzz(intboy);
*常量名:所有字母都大写,多单词时用下划线连接:XXX_YYY_ZZZ (final int A = 5)。
3、注释:用于注解说明解释程序的文字,提高了代码的阅读性。
Java中的注释格式:
单行注释: //注释文字
多行注释: /* 注释段落 */
文档注释: /** 注释文档内容 */
4、常量:表示不能改变的数值。
代码格式示例: publicstatic final intMAX_VALUE =231-1;
Java中常量的分类:
1、整数常量:所有整数;
2、小数常量:所有小数;
3、布尔(boolean)型常量:特殊,仅true、false两数值。
4、字符常量:将一个数字字母或者符号用单引号( ' ' )标识。
5、字符串常量: 将一个或者多个字符用双引号(“”)标识。
6、null常量:只有一个数值就是: null.
对于整数:有四种表现形式:
二进制:0、1 ,满2进1.
八进制:0—7 ,满8进1. 用0开头表示。
十进制:0—9 ,满10进1.
十六进制:0—9,A—F,满16进1. 用0x开头表示。
负数的二进制表现形式:
对应的正数的二进制取反加1;
详解: 正数用原码来表示,而负数用补码来表示。
(其中二进制的最高位为符号位:正 为0 ,负则为1)。
原码:是正数由十进制直接转换为二进制所得的数;如:7:0000 0000 0000 0111;
反码:将原码中的0、1置换,即7的反码为:1111 1111 1111 1000;
补码:表示负数,例如—7则是7的反码加“字节1”,即:1111 1111 11111001;
(或 —7可由6的反码的得到: 1111 11111111 1001)
整型(例short,2字节)的范围为:-2^15 至 2^15–1;
原因:因为2进制最高位为符号位,所以最高只有14次幂(和则为15次幂减1),
即2字节能容纳最大正数为 2^15 -1 : 0111 1111 1111 1111 ;
而最小负数为–2^15 : 1000 0000 0000 0000 ;
5、变量:
代码格式示例: public static Stringname=“小明”;
*内存中的一个存储区域;
*该区域有自己的名称(变量名)和类型(数据类型);
*该区域的数据可以在同一类型范围内不断变化;
目的:用来不断的存放同一类型的常量,并可以重复使用。
注意事项:
A、变量的作用范围(一对{}之间有效,)
变量根据使用可分为成员变量(定义于类,有效于该类范围)、
局部变量(定义于方法/函数,有效于该方法,外部程序无法访问)。
B、初始化值;
定义变量的格式:数据类型 变量名 = 初始化值;
声明:int i; 初始化:i= 20;
声明并初始化赋值:int i = 20;
理解:变量就如同数学中的未知数。
6、数据类型:
Java语言是强类型语言(严格区分变量的类型,不允许不同类型随意赋值)
【弱类型则是定义的变量没有具体类型,可进行任意类型的赋值,即一个变量容器可装任何类型数据,弱类型语言: JavaScript等】
Java对于每种数据都定义了明确的具体数据类型,在内存中也分配了不同大小内存空间;
因此:根据需要合理选择数据类型,可减少程序对内存空间的使用/占用。
数据类型: (八种基本、三种引用)
|——基本数据类型
|——数值型
|——整数类型(byte、short、int、long) 整数默认是int;
|——浮点类型(float、double) 小数默认是double;
|——字符型(char)
|——布尔型(boolean)
|——引用数据类型
|——类(class)
|——接口(interface)
|——数组(Array/[])
PS: 字符串String不属于数据类型,是一个特殊对象,字符串都是常量(例"abc"),因而它们存放在内存中的常量池(中的字符串池)。
1、字符(char): 用单引号‘’来表示,例:‘A’、‘2’;
例: char x =‘5’不同于int y = 5;
字符串(String):用双引号“”来表示,例如:“abc”、“234”;
2、byte : 字节,(1字节= 8 位/bit),范围:-128至127;
(例:127 : 0111 1111,首位为符号位,正数为0,负数为1)
short:占2字节,16位,范围:-2^15 至2^15-1;
int:占4字节,32位,范围:-2^31 至2^31-1;
long:占8字节,64位,范围:-2^63 至2^63-1;
char:占2字节,16位,最高位不是符号位,unicode字符集有65535个,要观察某个字符在unicode表中的顺序位置,必须用int类型显示转换,如(int)‘a’。
(不能使用short类型,因为char的最高位不是符号位,所以short无法满足存储)
float:占4字节,32位,用f来修饰:34.5f ;
double:占8字节,64位,用d来修饰(因为小数默认是double,所以可省略);
【注意:英语字符a占一个字节,而汉字字符则占两个字节,单个字符均能用char来装,
但ab虽然是两个字节但算是两个字符,不能用char。】
3、类型转换:
*自动类型转换(也叫隐式类型转换)
低精度向高精度自动转换:byte < short(char) < int < long < float < double ;
*强制类型转换(也叫显式类型转换)
高精度向低精度强制转换(需要定义转换类型以及可能会损失精度);
例如:int a = (int)34.5f ; 则a = 34;(损失了小数值精度)
注意:使用float类型时该数值必须要加f说明,因为整数默认是int;小数默认是double。
示例(提醒):
*自动类型提升
byte b = 3; int x = 4;
x = x + b; //b会自动提升为int类型进行运算。
强制类型转换
byte b = 3; b = b + 4;//报错
b = (byte)b+4;//强制类型转换,强制将b+4的结果转换为byte类型,再赋值给b。
*思考:
byte b1=3,b2=4,b;
b=b1+b2;(失败) b=3+4;
哪句是编译失败的呢?为什么呢?
因为b1、b2是变量不是具体数值,3和4是具体数值
7、运算符:
算术运算符:
正号(+)、负号(-)、加减乘除(+、-、*、/)、
取模(%,即除法求商舍去余数)、
自增(++)前后[++x、x++]、自减(--)前后[--y、y--]、
字符串相加(+,即"He"+"llo"——"Hello");
(字符串与任何数据使用“+”连接,最终都会变成字符串)
【如果对负数取模,可以把模数负号忽略不记,如:5%-2=1。但被模数是负数就另当别论】
赋值运算符:
符号:= , +=,-=, *=, /=, %= ;(均为单个运算符)
比较运算符(结果都是boolean型,true或false):
相等于(==)、不等于(!=)、小于(<</SPAN>)、大于(>)、
小于等于(<=)、大于等于(>=)、
instanceof:检查是否是类的对象,例如:"Hello" instanceof String ; (true)
逻辑运算符(用于连接boolean类型的表达式):
& :AND(与) :false & true =false; (两边都为true时结果为true)
| :OR(或):false | true =true; (存在一边为true时结果为true)
^ :XOR(异或) true^ false = true; (当两边不同时为true,相同时为false)
!:Not(非) !true =false; (非,即与原结果相反)
&& :AND(短路) 与& 类似,但当左边能决定结果是不执行右边;
|| :OR(短路)与| 类似,但当左边能决定结果是不执行右边;
位运算符(用于二进制):
<< 左移 3 << 2 = 12 -->3*2*2=12 ;
>> 右移 3 >> 1 = 1 -->3/2=1 ;
>>> 无符号右移 3>>> 1 = 1--> 3/2=1 ;
(>>>主要用于负数,右移时最高位均用0来填充,则无论正负数均会减小) ;
& 与运算 6 & 3 =2 ;
| 或运算 6 | 3 = 7 ;
^ 异或运算 6^ 3 = 5 ;
~ 反码 ~6 = - 7;
小知识点: 一个数异或^ 同一个数两次,结果得到原数【(N^M)^ M = N】。
三元运算符:
格式
(条件表达式)?表达式1:表达式2;
如果条件为true,运算后的结果是表达式1;
如果条件为false,运算后的结果是表达式2;
示例:
获取两个数中大数。
intx=3,y=4,z;
z =(x>y)?x:y; //z变量存储的就是两个数的大数。
8、程序流程判断
*判断结构: if语句
三种格式:
{ 执行语句; }
{ 执行语句; } else { 执行语句; } |
if(条件表达式) { 执行语句; } else if (条件表达式) { 执行语句; } …… else { 执行语句; }
|
if语句特点:
a,每一种格式都是单条语句。
b,第二种格式与三元运算符的区别:三元运算符运算完要有值出现。好处是:可以写在其他表达式中。
c,条件表达式无论写成什么样子,只看最终的结构是否是true或者false;
*选择结构 :switch语句
switch(表达式)
{ case取值1:
执行语句;
break;
case取值2: 执行语句;
break;
……
default: 执行语句;
break;
}
//(实质:由表达式得出一数值,在case中选择对应的数,执行该语句,如果无对应值则执行default语句。)
switch语句特点:
A、switch语句选择类型只有四种:byte、short、int、char。
B、case之间与default没有顺序。先执行第一个case,没有匹配的case执行default。
C、结束switch语句的两种情况:遇到break,或直到执行至switch语句结束。
D、如果匹配的case或者default没有对应的break,那么程序会继续向下执行,运行可以执行的语句,直到遇到break或者switch结尾结束。
PS: JDK1.5起switch语句支持Enum枚举值,JDK1.7起支持String类型(但不能比较null值/传入或case语句都不行,因为底层是通过javac编译调用str.equals(String)方法)。
*循环结构:while 、do while 、for 三种语句
while(条件表达式) { 执行语句; } |
do while语句格式: do { 执行语句; }while(条件表达式);
do while特点: 是条件无论是否满足,循环体至少执行一次。 |
for(初始化表达式;循环条件表达式;循环后的操作表达式) { 执行语句;(循环体) } |
注:
a,for里面的两个表达式运行的顺序,初始化表达式只读一次,判断循环条件,为真就执行循环体,然后再执行循环后的操作表达式,接着继续判断循环条件,重复找个过程,直到条件不满足为止。
b,while与for可以互换,区别在于for为了循环而定义的变量在for循环结束时就在内存中释放。而while循环使用的变量在循环结束后还可以继续使用。
c,最简单无限循环格式:while(true) , for( ; ; ),无限循环存在的原因是并不知道循环多少次,而是根据某些条件,来控制循环。
其他流程控制语句:
break(跳出):应用于 选择结构switch和 循环结构,跳出单重循环;
continue(继续):应用于循环结构,跳过此次循环(单重循环的单次循环)。
注:
A、这两个语句离开应用范围,存在是没有意义的。
B、continue语句是结束本次循环继续下次循环,而break是不再执行该语句,直接跳出;
C、标号的出现,可以让这两个语句作用于指定的范围。
特殊:
跳出多重循环的方法:
A、return的特殊应用: 在方法语句中,即使是多重循环,当执行到return语句时除了方法中还有的finally语句会执行,其他都终止。
public class ReturnDemo { public static void main(String args[]){ int[] arr = new ReturnDemo().getNumber(); for() } public int[] getNumber(){ int[] arr = new int[2]; for(int i=1;i<100;i++){ //让i循环99次 for(int j=1;j<=i;j++){ if(i*j==81){ int[0] = i; int[1] = j; return arr; //返回指定数据,结束方法执行; } } } return arr; //由于方法必须返回数据,如果上述判断代码中发生异常,那么就会返回默认的数据; } }
B、带标记的break 跳出多重循环(类似C语言的goto语句应用):
public class BreakDemo { public static void main(String args[]){ OK: //设置一个标记 使用带此标记的break语句跳出多重循环体 for(int i=1;i<100;i++){ //让i循环99次 for(int j=1;j<=i;j++){ if(i==10){ break OK; //跳出标记为OK的多重循环; } System.out.print(i + "*" + j + "=" + i*j) ; System.out.print(" ") ; } System.out.println() ; } } }
其他: * 循环嵌套(多重循环0
* 语句的嵌套应用
* 累加求和,计数器
提醒:
1、多行注释中运行单行注释,但不允许多行注释;
2、在各种表达式中:当出现多个表达式时只需用“,”来隔开[例:while(x<1,y>2)等];
3、变量有自己的作用域,例for的初始化表达式中的变量仅在for语句中有效,完毕则在内存中释放;