1、 变量与标识符
数学名词:
变数或变量, 是指没有固定的值, 可以改变的数。 变量以非数字的符号来表达, 一般用拉丁字母。 变量是常数的相反。 变量的用处在于能一般化描述指令的方式。
计算机解释:
变量就是系统为程序分配的一块内存单元, 用来存储各种类型的数据。 根据所存储的数据类型的不同, 有各种不同类型的变量。 变量名代表这块内存中的数据 。
变量分类:
按所属的数据类型划分:
- 基本数据类型变量
- 引用数据类型变量
按被声明的位置划分:
- 局部变量: 方法或语句块内部定义的变量
- 成员变量: 方法外部、 类的内部定义的变量
Java对包、 类、 方法、 参数和变量等要素命名时使用的字符序列称为标识符。
Java标识符命名规则:
- 由字母、 数字、 下划线(_) 和美元符号($) 组成。
- 不能以数字开头。
- 区分大小。
- 长度无限制。
- 不能是Java中的关键字和保留关键字。
- 标识符命名习惯: 驼峰命名法、 见名知意。 以单词或单词组合来命名
合法标识符:user_name、 _userName、 $abc_123
非法标识符:2UserName、 user#Name、 Hello 你好、 class
2、 八种基本数据类型
字节(Byte)是: 计算机文件大小的基本计算单位。
1个字节(Byte) = 8个位(Bit)
Bit意为“ 位” 或“ 比特” , 是计算机运算的基础; 二进制中的一位, 是二进制最小信息单位.
二进位可以用来表示一个简单的正/负的判断, 有两种状态的开关(如电灯开关) .
简单换算结果:
1个字节(Byte) = 8个位(Bit)
2个字节(Byte) = 16个位(Bit)
4个字节(Byte) = 32个位(Bit)
8个字节(Byte) = 64个位(Bit)
说明:
- 在内存计算过程中,字节少的数据运算速度更快;
- 在硬盘存储中,字节少的数据类型也可充分存入更多的数据
3、 基本数据类型的声明
声明变量的格式:
(1) 声明变量
类型 变量名;
(2) 声明的同时给变量赋值
类型 变量名 = 值;
(3) 给已声明过的变量赋值
变量名 = 值;
4、 进制与转换
计算机进制通常有: 十进制、 二进制、 八进制、 十六进制
十进制:
人类算数采用十进制, 可能跟人类有十根手指有关。 亚里士多德称人类普遍使用十进制, 只不过是绝大多数人生来就有10根手指这样一个解剖学事实的结果。
10、 150、 1050…
二进制:
计算机中的数据都以二进制数字保存。 二进制: 逢二进一。 即只有0、 1两个值。
如: 十进制的10在计算机内保存为二进制的1010
计算机中信息的存储单位
位(Bit) : 表示一个二进制数码0或1, 是计算机存储处理信息的最基本的单位。
字节(Byte) : 一个字节由8个位组成。 它表示作为一个完整处理单位的8个二进制数码
八进制:
基数为八。
Java中八进制数据要以0开头。 如: 0123
八进制转换成二进制: 只需将每个八进制数字替换为相对应的三个二进制位即可。
现在的计算机系统很少用八进制的了。
十六进制:
二进制表示法太冗长, 所以在程序中一般喜欢用十六进制
十六进制: 基数为十六, 逢十六进一。 它用abcdef表示从0-9之上的值
Java中十六进制数据要以0x或0X开头。 如: 0x23D
十六进制转换成二进制只需将每个十六进制数字替换为相对应的四个二进制位即可
补码:
事实上, 计算机内的二进制数值是以补码形式表示的。
补码: 一个正数的补码和其原码的形式是相同的。
负数的补码是: 将该数的绝对值的二进制形式, 按位取反再加1。
由此可知, 二进制补码数值的最高位(最左位)是符号位: 该位为0, 表示数值为正数; 该位为1, 表示数值为负数。
主要原因: 使用补码, 可以将符号位和其它位统一处理;
同时, 减法也可按加法来处理。
另外, 两个用补码表示的数相加时,
如果最高位(符号位) 有进位,
则进位被舍弃。
二进制数转换成十进制数 :
按权相加: 把二进制数首先写成加权系数展开式, 然后按十进制加法规则求和。
十进制转换成二进制
整数部分: “除2取余, 逆序排列”法
小数部分: “乘2取整, 顺序排列”法
5、基本数据类型转换
自动类型转换:
容量小的类型自动转换成容量大的数据类型
byte,short,int, 它们三者在计算时会转换成int类型
如果把int值转换为float值, 或者long转换为double值, 不需要强制转换, 但可能丢失精度
强制类型转换:
容量大的类型转换成容量小的数据类型时, 要加上强制转换符。
long n = 100L;
int i = (int)n;
有可能造成精度降低或数据溢出, 使用时要小心。
boolean 类型不能转换成任何其它数据类型。
/**
基本数据类型转换
*/
public class Test3{
public static void main(String[] args){
byte b = 10;
short s = b;// 把一个字节赋值给一个短整型变量,自动转换
int i = s; //把一个短整型赋值给一个整型变量,自动转换
long lon = i; //
//char -> int 自动转换
char sex = '男';
int sex2 = sex;
System.out.println(sex2);
float f = 20f;
double d = f;
System.out.println(d);
//float 和 double 是属于近似值
//byte char short int long 属于精确值
//精确值转近似值时可能丢失精度
int num = 2147483000;
float num2 = num;
//如果用于表示货币值,不建议使用float或double
System.out.println(num2);
//面试题:
//byte short int 在计算时会自动转换为int类型
short s1 = 10;
s1 = (short)(s1 + b);
System.out.println(s1);
//把大的容量类型转换为小的容量类型,需要添加强制类型转换
int x = (int)lon;
}
}
6、关键字
7、转义字符
//转义字符:用于转义的符号是:\
public class Test4{
public static void main(String[] args){
System.out.println("转义字符测试");
System.out.print("我想输出一个回车符\n\r");
System.out.print("\t这是一个制表符");
System.out.print("\\");
System.out.println("\"双引号\"");
System.out.println("\'单引号\'");
}
}
8、键盘输入
import java.util.Scanner; //接收键盘输入的工具类
Scanner input=new Scanner(System.in);
System.out.println("请输入一个整数:");
int x1 = input.nextInt();//从键盘接收一个整数,
System.out.println(x1);
System.out.println("请输入一个字符串");
String s1 = input.next();
System.out.println(s1);
9、运算符与优先级
算术运算符:
表达式: 由变量、 常量运算符组成的式子。
++:
- 如果是前缀: 先对此变量加1, 再执行其他的操作
- 如果是后缀: 先执行其他的操作, 再对此变量加1
—: 同理
int x = 3;
int y = 2;
y = x+y-(++y);
System.out.println("x="+x); //x=3
System.out.println("y="+y); //y=3+2-(2+1)=2
赋值运算符:
作用是将一个值赋给一个变量, 运算顺序从右到左
关系运算符:
作用是比较两边的操作数, 结果总是boolean型的。
逻辑运算符:
用于对boolean型结果的表达式进行运算, 运算结果总是boolean型, 后面结合条件结构讲解
在计算机中,
- 非0即真, 0为假
- 逻辑或: 或1则1
- 逻辑与: 全1才1
位运算符:
对两个操作数中的每一个二进制位都进行运算
位运算符功能:
- 按位取反 ~
- 按位与 &
- 按位或 |
- 按位异或 ^
位移运算符:
左移: “a<<b; “将二进制形式的a逐位左移b位, 最低位空出的b位补0
带符号右移: “a>>b; “将二进制形式的a逐位右移b位, 最高位空出的b位补原来的符号位
无符号右移: “a>>>b;”将二进制形式的a逐位右移b位, 最高位空出的b位补0
面试题: 以最快的速度计算8*4结果?
00000000 00000000 00000000 00001000 8
10000000 00000000 00000000 00100000 32
使用位移的方法是最快的。
int result = 8<<2;
左移算法: 位移数作为2的次幂与操作数相乘
10<<2=40
右移算法: 操作数除以位移数的2次幂
三目运算符:
X ? Y : Z
X为boolean类型表达式, 先计算x的值, 若为true, 整个三目运算的结果为表达式y的值, 否则整个运算结果为表达式z的值。
优先级
&与&&的区别
&:在逻辑运算时分别计算表达式两边的结果,再作&运算,在做位运算时&表示按位与
&&短路与运算,
先计算左边的表达式,如果结果是false,那么不用计算右边表达式,直接返回false,;如果左边的表达式结果是true,再计算右边的表达式,如果右边的表达式为true,结果为true,否则为false
| 和 ||的原理同上。
所以短路与 或 短路或的计算效率更高,建议使用。
10、分支语句
if条件结构是根据条件判断之后再做处理
简单判断语句:
if(表达式){
执行语句;
}else{
执行语句;
}
如果…那么
执行过程: 当程序执行到if时, 首先会判断( )里面表达式的值,如果表达式的值为真, 那么就执行( )后{ }里的执行语句,如果为假, 那么就执行else后面{ }里的执行语句
& ,| ,^ ,&& ,|| , ! ,==
分支嵌套:
if(表达式1){
执行语句1;
}else if(表达式2){
执行语句2;
}else if(表达式3){
执行语句3;
}else{//可有可无
执行语句4;
}
执行过程:当程序执行到if时,首先会判断( )表达式1的值,如果为真,那么就执行{ }里面的执行语句1;然后这个if-else if结束,如果表达式1的值为假,那么就会继续向下执行,else if后面的表达式2,为真,就执行语句2,为假,就继续向下执行,直到为真,如果所有表达式的值都不为真,那么就会执行else后面{ }里的执行语句,然后真个if-else if结束
/**
if 语句的嵌套(2)
多条件嵌套分支,设计一个程序,根据天气情况选择外出或在家,外出是逛街还是逛公园,在家是看电影还是玩游戏。
*/
import java.util.Scanner;
public class Test16{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
System.out.println("今天天气如何(1好,2霾):");
int weather = input.nextInt();
if(weather==1){
System.out.println("今天天气太好了,我是逛街还是逛公园呢(1逛街,2逛公园)");
int flag = input.nextInt();
if(flag==1){
System.out.println("逛街");
}else if(flag==2){
System.out.println("去公园");
}
}else if(weather==2){
System.out.println("今天天气不好,在家看电影还是玩游戏(1看电影2玩游戏)");
int flag = input.nextInt();
if(flag==1){
System.out.println("看电影");
}else if(flag==2){
System.out.println("玩游戏");
}
}
}
}
switch语句
语法:
switch(表达式){
case 取值1: 语句块1;
break;
case 取值n: 语句块n;
break;
default: 语句块n+1;
break;
}
switch与if嵌套
switch(表达式){
case 取值n: 语句块n;
if(表达式){…}
break;
default: 语句块n+1;
break;
}
switch语句有关规则:
- 表达式的返回值必须是下述几种类型之一: int, byte, char, short,确定的结果,jdk1.7后支持String;
- case子句中的取值必须是常量, 且所有case子句中的取值应是不同的;
- default子句是可选的;
- break语句用来在执行完一个case分支后使程序跳出switch语句块; 如果case后面没有写break则直接往下面执行!
- case后面的执行体可写{ }也可以不写{ }
Java 7 switch支持String的实现原理:
- 这个新特性是在编译器这个层次上实现的
- 在编译的过程中, 编译器会根据源代码的含义进行转换,不同的Java编译器可能采用不同的方式来转换
- 比如: 如果switch语句中只包含一个case语句, 那么就可以简单的将其转换成一个if语句。
如果包含一个case和一个default语句, 就可以转换成if-else语句。 而对于复杂的情况(多个case语句)也可以转换成Java 7 之前的switch语句, 只不过使用字符串的哈希值(整数) 作为switch语句表达式的值
/**
switch分支语句
直接用JDK1.7的字符串条件判断,确定两个数是执行加、减、乘、除操作。
*/
import java.util.Scanner;
public class Test19{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
System.out.println("请输入第一个数");
int num1 = input.nextInt();
System.out.println("请输入第二个数");
int num2 = input.nextInt();
System.out.println("请输入操作符(+,-,*,/)");
String op = input.next();
switch(op){
case "+":
int i = 10;
System.out.println("num1+num2="+(num1+num2));
System.out.println("i="+i);
break;
case "-":
i = 20;
System.out.println("num1-num2="+(num1-num2));
System.out.println("i="+i);
break;
case "*":
System.out.println("num1*num2="+(num1*num2));
break;
case "/":
System.out.println("num1/num2="+(num1/num2));
break;
default:
System.out.println("输入的操作符有误");
break;
}
}
}
11、循环语句
循环语句分为: while, do while, for
语法:
while(条件表达式){
//语句块;
}
符合条件, 循环继续执行; 否则, 循环退出
特点: 先判断, 再执行
语法:
do {
循环操作
}while ( 循环条件 );
先执行一遍循环操作, 符合条件, 循环继续执行; 否则, 循环退出
特点: 先执行, 再判断
语法:
for(初始化参数;判断条件 ;更新循环变量){
循环体;
}
关键字: continue 表示跳过当次循环, 继续下次循环。
For循环的六种写法:
- 标准写法
- 表达式1省略, 但在外部声明
- 表达式2省略, 死循环
- 表达式3省略, 但是要声明在循环内部
- 表达式1,3省略, 但是要声明在循环的外部和内部
- 三个表达式都省略,死循环