Java语言基础组成
- 关键字
- 标识符
- 注释
- 常量和变量
- 运算符
- 语句
- 函数
- 数组
标识符
- 组成:26个英文字母大小写:a~zA~Z,数字:0~9,下划线:_,美元符号:$;
- 定义合法标识符规则:
- 数字不可以开头;
- 不可以使用关键字;
- Java严格区分大小写;
- 尽量定义有意义的名称(增强阅读性);
Java中的名称规范
- 包名:所有字母都要小写,例:xxxyyyzzz;
- 类名接口名:所有单词首字母大写,例:XxxYyyZzz;
- 常量名:多有单词都要大写,例:XXX_YYY_ZZZ;
- 变量名和函数吗:第一个单词小写,后面的每个单词首字母大写,例:xxxYyyZzz;
进制
二进制
- 1个字节由8个二进制位组成;
- 负数的二进制就是其正数的二进制取反+1,例:-6的二进制就是6的二进制取反+1,负数的最高位都是1;
进制转换
- 二进制转十进制
原理:对十进制数进行除2运算取模; - 二进制转十进制
原理:二进制乘以2的过程; - 其他进制转换
- 转16进制:四个二进制位就是一个十六进制位;
- 转八进制:三个二进制位就是一个八进制位;
常量与变量
数据类型
- 基本数据类型
- 数值型:
a.整数类型:byte(1字节)、short(2字节)、int(4字节)、long(8字节);
b.浮点类型:float(4字节)、double(8字节); - 字符型:char(2字节);
- 布尔型:boolean;
- 数值型:
- 引用数据类型
- 类(class);
- 接口(interface);
- 数组(数据类型[]);
注:整数默认为:int;小数默认为:double;
Java中常量分类
- 整数常量:所有整数;
- 小数常量:所有小数;
- 布尔型常量:true、false;
- 字符常量:将一个数字或字母、符号用单引号标识,例:‘c’;
- 字符串常量:将一个或多个字符用双引号标识,例:“abc”;
- null常量:只有一个数值就是null;
变量的定义
-
定义变量时需注意的问题:
- 同一区间不能定义同名的变量;
- long l=4l,数字后的l表示长整型(4默认为int);
- float f=2.3f,数字后的f表示单精度(小数默认为double);
- double d=34.56,默认double;
- char ch=’a’,字符常量需用单引号包含;
什么时候定义变量
当数据不确定的时候,需要对数据进行存储时,就定义一个变量来完成存储动作;自动类型提升
例:byte b=3;
b=b+2;
以上定义在编译时将会发生异常:类型不兼容;
解释:
①.b定义为byte类型,2是整数默认为int,当运行b+2时,b将自动提升类型为int型(以大的为主,小的向大的提升),运算结果为int,在运行b=b+2时将int型的结果向byte型的b赋值将发生异常(因为int为4个字节,byte为1个字节,所占空间不够,所以不能完成赋值);
②.若要将b+2的值赋给b可以进行“类型强制转换操作”,将b+2强转为byte,操作形式如下:
b=(byte)(b+2);//前面的类型标识需要用“()”括起来;
③.类型强制转换应用场景:
例1:运算结果为小数,但仅需整数部分时,可强制转换为int;
例2:(char)(‘a’+1)运行结果为b,此运行过程为:运行’a’+1是将’a’类型提升为整型(因为1默认为整型,类型提升以大的为主),‘a’对应ASCII码值为97,作加法运算+1后的值为98,进行强制转换为字符型,98的ASCII码表对应为字符’b’,故运行结果为b;
class VarDemo
{
public static void main(String[] args)
{
//定义变量的格式;
//数据类型 变量名 = 初始化值;
// 定义一个int类型变量.取值为4;
int x = 4;
System.out.println(x);
x = 10;
System.out.println(x);
//演示其他数据类型。
byte b = 2;//-128~127;
//byte b1 = 128;
short s = 30000;
long l = 4l;
float f = 2.3f;
double d = 34.56
char ch = '4';
char ch1 = 'a';
char ch2 = '+';
char ch3 = ' ';
boolean bo = true;
boolean bo1 = false;
int a = 5;
a = a + 6;
/*
什么时候定义变量?
当数据不确定的时候。需要对数据进行存储时。
就定义一个变量来完成存储动作。
*/
//类型的转换。
byte b = 3;
b = b + 2;
System.out.println(b);
System.out.println((char)5);
byte b = 3;
b = 3 + 4;
b = b + 4;
System.out.println(b);
}
}
运算符
算术运算符
- 单目:+(取正)-(取负) ++(自增) - -(自减)
- a++ ——> a=a+1;
b=a++;a先赋值给b,在自加1;
b=++a;a先自加1,再将值赋值给b; - “+”符号的另一用法:字符串连接符:
字符串数据和任何数据使用”+”都是相连接,最终都会变成字符串;
- a++ ——> a=a+1;
- 双目:+(加) -(减) *(乘) /(除) %(取余)
用法与数学运算一样; - 三目:a>b?true:false
三元运算符:(条件表达式)?表达式1:表达式2;
如果条件结果为true,执行是表达式1;
如果条件结果为false,执行表达式2;
注:三元运算符为if else语句的简化形式,但其有局限性:三运运算符必须要有结果,但是if else无需结果亦可;
class OperateDemo
{
public static void main(String[] args)
{
//int x = 4270;
//x = x /1000 * 1000;
//System.out.println(-1%5);
int a = 3,b;
//a++; //--> a = a+ 1;
b = ++a;
System.out.println("a="+a);
//字符串数据和任何数据使用+都是相连接,最终都会变成字符串。
//System.out.println("5+5"+(5+5));//"5+5=55"
/*
转义字符:通过\ 来转变后面字母或者符号的含义。
\n:换行。
\b:退格。相当于backspace。
\r:按下回车键。window系统,回车符是由两个字符来表示\r\n.
\t:制表符。相当于tab键。
*/
System.out.println("hello \t world");
//System.out.println("hello java");
System.out.println("\\hello\\");
char ch = '\'';
char c = 'a';
int x = 1,y;
//三元运算符
y = (x>1)?'a':200;
System.out.println("y="+y);
}
}
赋值运算符
= += -= *= /= %= &= ^= |= <<= >>=
例:x+=4 ——>x=x+4;
这两者的区别在于:若x被定义为short类型时,x=x+4编译失败,x+=4编译通过;
解释:x为short,4为int,x+4运算后结果为int,无法赋值给short类型的变量;
x+=运算再给x赋值时,自动完成强制转换操作;
比较运算符
- 等于符号:==
- 大于符号:>
- 小于符号:<
- 小于等于符号:<=
注意:
1. 比较运算符的结果都是boolean型,也就是要么true,要么false;
2. 比较运算符”==”不能误写成”=”;
逻辑运算符
-
逻辑运算符用于连接boolean类型的表达式:
- 与 &:只要两边的boolean表达式结果,有一个为false,结果为false;只有两个都为true,结果为true;
true & true = true;
true & false = false;
false & true = false;
false & false = false; - 或 |:两边只要一个为true,结果为true;两边都为false,结果为false;
true | true = true;
true | false = true;
false | true = true;
false | false = false; - 异或 ^:两边相同结果为false;两边不同结果为true;
true ^ true = false;
true ^ false = true;
false ^ true = true;
false ^ false = false;
一个数异或同一个数两次,结果是它本身(应用于加密)。
示例:见下文代码; - 非 !:
ture==!false; false==!true;
- 与 &:只要两边的boolean表达式结果,有一个为false,结果为false;只有两个都为true,结果为true;
-
&&和||
- &&双与(短路):当左边为false时,右边不运算;&:左边无论真假,右边都进行运算;
- ||双或(短路):左边为真时,右边不参与运算;|:同理;
注:&&和||的运算效率稍微高一点;
class OperateDemo2
{
public static void main(String[] args)
{
int x = 7;
//逻辑运算符用于连接boolean类型的表达式。
//x>3 & x<6 = true & true = true;
/*
!!true
*/
int a = 2;
//a>3 && a<6;
System.out.println(false ^ false);
System.out.println(~6);
int n = 3,m = 8;
System.out.println("n="+n+",m="+m);
//交换两个数的值:
//1,通过第三方变量。
/*int temp;
temp = n;
n = m;
m = temp;
*/
//2不用第三方变量。
//11 = 3 + 8;
//3 = 11 - 8;
//8 = 11 - 3;
/*
n = n + m;//如果n和m的值非常大,容易超出int范围。
m = n - m;
n = n - m;
*/
//一个数异或同一个数两次,结果是它本身
n = n ^ m;
m = n ^ m;//(n^m)^m;
n = n ^ m;//n ^ (n ^ m)
System.out.println("n="+n+",m="+m);
}
}
位移运算符(二进制运算)
- <<:左移 其实就是乘以2的移动的位数次幂;
- >>:右移 就是除以2的移动的位数次幂;
特点:右移的时候,最高位是什么就补什么,例:负数的最高位补1; - >>>:无论最高位是什么,右移后都用0补;
- ~:取反;
综合代码示例:
class OperateDemo3
{
public static void main(String[] args)
{
//System.out.println(Integer.toBinaryString(60));
//System.out.println(Integer.toHexString(60));
int num = 26;
//获取60的最低4位,通过&15;
int n1 = num & 15;
System.out.println(n1>9?(char)(n1-10+'A'):n1);
//要获取下一组四位,将60右移4位。
int temp = num >>> 4;
//对temp的值进行最低四位的获取。
int n2 = temp & 15;
System.out.println(n2>9?(char)(n2-10+'A'):n2);
/*
0-9 'A' 'B' 'C' 'D' 'E' 'F'
65 66 67
10 11 12 13 14 15
12 - 10 = 2 + 'A' = (char)67;
*/
int x = 1,y;
y = (x>1)?'a':200;
System.out.println("y="+y);
}
}
转义字符
通过“\”来转变后面字母或者符号的含义;
- \n:换行;
- \b:退格,相当于backspace;
- \r:按下回车键,Windows系统,回车符由两个字符来表示,\r\n;
- \t:制表符,相当于tab键;
例:想要打印带双引号的字符串,书写格式如下:”\”hello\”“;
带斜线的字符串:”\hello\”;
程序流程控制
1.判断结构:if else语句
三种常见格式:
- 格式一:
if(条件表达式)
{
执行语句;
}
格式二:
if(条件表达式)
{
执行语句;
}
else
{
执行语句;
}-
格式三:
if(条件表达式)
{
执行语句;
}
else if(条件表达式)
{
执行语句;
}
else
{
执行语句;
}注:当if下的控制语句只有一条时,”{}”可不写;
代码示例:
class IfTest
{
public static void main(String[] args)
{
//需求1:根据用户定义的数值不同。打印对应的星期英文。
/*
int num = 1;
if(num==1)
System.out.println("monday");
else if(num==2)
System.out.println("tsd");
else
System.out.println("nono");
*/
//需求2:根据用于指定月份,打印该月份所属的季节。
//3,4,5 春季 6,7,8 夏季 9,10,11 秋季 12, 1, 2 冬季
int x = 4;
if(x==3 || x==4 || x==5)
System.out.println(x+"春季");
else if(x==6 || x==7 || x==8)
System.out.println(x+"夏季");
else if(x==9 || x==10 || x==11)
System.out.println(x+"秋季");
else if(x==12 || x==1 || x==2)
System.out.println(x+"冬季");
else
System.out.println(x+"月份不存在");
if(x>12 || x<1)
System.out.println(x+"月份不存在");
else if(x>=3 && x<=5)
System.out.println(x+"春季");
else if(x>=6 && x<=8)
System.out.println(x+"夏季");
else if(x>=9 && x<=11)
System.out.println(x+"秋季");
else
System.out.println(x+"冬季");
}
}
2.选择结构
-
switch语句
格式:
switch(表达式)//switch表达式的值仅接收byte、short、int、char四中类型;
{
case 取值1:
执行语句;
break ;
case 取值2:
执行语句;
break ;case 取值3:
执行语句;
break ;
……
default:
执行语句;
break ;//最后一条break可省略;
} 注:
当case后面没有执行与且也没有break时,将从与它最近的执行语句开始执行;
case之间与default没有顺序,先执行第一个case,诶呦匹配case执行default,当default在case前面且所有case都不满足时,执行default接着不再判断case并将所有能执行的语句全执行一遍;
当答案选项不多时,且为byte、short、int、char这四种类型时,用switch结构,当区间范围较大时用if结构;- 特点:
if可判断区间及boolean型值;
switch的执行效率较高;
代码示例:
class SwitchTest
{
public static void main(String[] args)
{
//需求2:根据用于指定月份,打印该月份所属的季节。
//3,4,5 春季 6,7,8 夏季 9,10,11 秋季 12, 1, 2 冬季
int x = 4;
switch(x)
{
case 3:
case 4:
case 5:
System.out.println(x+"春季");
break;
case 6:
case 7:
case 8:
System.out.println(x+"夏季");
break;
case 9:
case 10:
case 11:
System.out.println(x+"秋季");
break;
case 12:
case 1:
case 2:
System.out.println(x+"冬季");
break;
default:
System.out.println("nono");
}
/*
if和switch语句很像。
具体什么场景下,应用哪个语句呢?
如果判断的具体数值不多,而是符合byte short int char这四种类型。
虽然两个语句都可以使用,建议使用swtich语句。因为效率稍高。
其他情况:对区间判断,对结果为boolean类型判断,使用if,if的使用范围更广。
*/
System.out.println("Hello World!");
}
}
3.循环结构
代表语句:while、do while、for
while 语句格式:
while(条件表达式)//注:该语句()后面不可加”;”否则进入死循环;
{
执行语句;
}do while语句格式;
do
{
执行语句;
}
while(条件表达式);//此处分好不可少,代表语句结束;
注:do while特点是条件无论是否满足,循环体至少被执行一次(先执行循环体一次,再判断条件再执行循环体);-
for语句格式:
for(初始条件表达式;循环条件表达式;循环后的操作表达式)
{
执行语句;
}注:
- for里面的表达式运行的顺序:
1.执行初始化表达式(只执行一次);
2.执行判断循环条件:真就执行循环体,假就跳出循环;
3.执行循环后的操作表达式;
4.重复步骤2和3; - while与for可互换,区别在于for循环内定义的变量在for循环结束就在内存中释放,而while循环使用的变量在循环结束还可以继续使用;
- 最简单的无限循环格式:while(true),for( ; ; );
- 条件表达式必须有真假(可判断);
- 当有多条表达式时,可用”,”隔开;
例:for(初始化表达式1,~2,~3;循环条件表达式;循环后表达式1,~2){} - 计数器思想:通过一个变量记录注数据的状态变化,也许通过循环完成;
- 其他:嵌套循环的应用。
- for里面的表达式运行的顺序:
/*
2,1~100之间 7的倍数的个数。并打印。
思路:
1,先对1~100进行循环(遍历)通过循环的形式。
2,在遍历的过程中,定义条件。只对7的倍数进行操作。
3,因为7的倍数不确定,只要符合条件,就通过一个变量来记录住这个变化的次数。
步骤:
1,定义循环语句,选择for语句。
2,在循环中定义判断。只要是7的倍数即可。使用if语句。条件:7的倍数 x%7==0;
3,定义变量,该变量随着7的倍数的出现而自增。
*/
class ForTest
{
public static void main(String[] args)
{
int count = 0;
for(int x=1; x<=100; x++)
{
if(x%7==0)
//System.out.println("x="+x);
count++;
}
System.out.println("count="+count);
/*
计数器思想。
通过一个变量记录住数据的状态变化。
也许通过循环完成。
*/
}
}
其他流程控制语句
- break(跳出)
break语句:应用范围 选择结构和循环结构; continue(继续);
continue语句:应用于循环结构;-
注:
- 这两个语句离开应用范围,存在是你没有意义的;
- 这两个语句单独存在下面都不可以有语句,因为执行不到;
- continue语句是结束本次循环继续下一次循环;
- 标号的出现可以让这个两个语句作用于指定的范围;
给循环起名可用标号 方式,使用方式:
w:for(;;)//给循环起名for前面 循环名+":"的形式;
{
q:for(;;)
{
System.out.println("hello");
break w(q);//break后跟谁就跳谁,若break语句后无循环名,默认跳出break语句所在的循环体;
}
}
经典示例:
/*
练习:3000米长的绳子,每天减一半。问多少天这个绳子会小于5米?不考虑小数。
*/
class ForTest4
{
public static void main(String[] args)
{
int day = 0;
for(int x=3000; x>=5; x/=2)
{
day++;
}
System.out.println("day="+day);
/*
for(int x=3000; x>=5; day++)
{
x = x/2;
}
*/
}
}
/*
打印等腰三角形图形
----*
---* *
--* * *
-* * * *
* * * * *
* * * * *
-* * * *
--* * *
---* *
----*
*/
class ForForTest2
{
public static void main(String[] args)
{
for (int x=0; x<5 ;x++ )
{
for(int y=x+1; y<5 ; y++)
{
System.out.print(" ");
}
for(int z=0; z<=x ; z++)
{
System.out.print("* ");
}
System.out.println();
}
}
}