01 标识符
关键字: 就是被Java 赋予了特殊含义的单词, 不让用~
注释: // /* */ 文档:/** */(Java特有)
标识符: 在程序中自定义的一些名称。
26字母 , 0-9 , _ $
规则:数字不能开头 , 不可以使用关键字
Demo1 可以 , 1Demo不行
Java严格需分大小写。
类名接口名: 多单词的每个首字母大写!!
变量和函数名 : 驼峰原则
02 变量
常量:不能改变的数值。
布尔型常量 : True , false , 判断用
字符常量 : 字母数字符号 。
4, 整数 , ‘4’字符常量
‘ab’是错的, 单引号中只有一个字符
“ab”可以,是字符串常量
“”空内容的字符串~ 也是字符串
Null 空常量。 (用于引用数据类型)
Java中整数有四种表现形式
十进制, 8进制,16进制 (A-F)
满10进一, 满8进一,满16进一
23 023 0x23
03 进制的特点
星期:7, 月份 12 ,
电信号: 开 | 关 , 两个状态, 1 | 0 , 通过开关的组合,来表示数据->二进制
字节 : 8 个“开关组成的” , 8个二进制位 代表一个字节。
0110-0010
表示数据 : 其实就是一个映射关系 : 编码表 : ASCII | 中文编码表
2的1次幂 , 2进制, 2的3次幂 8进制 , 2的4次幂16进制 --- 位数越来越短,方便表现数据
04 进制的转换
10转2 , 除2取余数
2转10 , 从低位到高位 : 2的0次幂× 0|1 + 2的1次幂* 0|1 + …+ 2的n次幂× 0|1
IP地址的每一段都是用字节来表示的,每一段只能取到255
05 其他的进制转换
2- 16 , 每4位一算,然后换算成16进制 0x
0101-1010
5 10
5 A
0x5A
同理,8进制是用每3位一取
06 负数2进制
6=110
-6 = ?
-6 其实就是6的2进制取反加1
110 取反 --- 一个整数占用4个字节,所以在内存中是这样的
0000-0000 0000-0000 0000-0000 0000-0110
1111-1111 1111-1111 1111-1111 1111-1001 (取反)
1111-1111 1111-1111 1111-11111111-1010 (加1)
结论, 负数的最高位都是1
07 变量
就是将不确定的数据进行存储。
在内存中开辟一个空间,把值存入。
先声明 (给空间个名字), 后使用 。
变量:需要: 变量名 + 数据类型 + 数据
数据类型 两大类
基本数据类型 : 1数值 (byte , short , int ,long ,float double)2 字符型(char) 3 布尔型 (boolean)
引用数据类型 : 1类(class) 2 接口(interface) 3 数组 (【】)
整数之所以有4个类型是因为他们在内存中开辟的空间是不同的
Byte 1字节 -128 - 127 -2(7) - +2(7)-1 | 最小单位 |
Short 2字节 -32768 - +32767 |
|
Int 4字节 (32个2进制位) | 最常用的 |
Long (天文数字~) |
|
变量的定义:
数据类型 变量名 = 初始化值 ;
如果存储时,空间不够,装不下,会损失精度。
小数默认的数据类型是double :
Float f = 2.3 ;// 这个会报错
而 float f = 2.3f ; 这个就不会报错, 因为有F, 表示是单精度的
Char ch = '4';
char类型占2个字节的空间。
同一个区间中不能定义同名的变量。
Booleanbo = true ;
Booleanbo1 = false ;
关键是什么时候定义变量: 当数据不确定的时候,需要对数据进行存储时,就定义一个变量完成存储动作。
08 类型转换
Byte b =2,
B = b +3 ; //这一步是自动类型提升!
会报错, 因为2是整型,而b是byte型, 会损失精度。 要强转
B = (byte)(b + 2) //这个是强制类型转换
Int 和 float 做运算, 结果是float
‘a’ + 1 // a 是97 , 但是 ‘a’是2个字节, 1 是整型,是4个字节, 需要将'a'类型提升
(Char)(‘a’+2 ) // 数据类型提升加 强制数据类型转换
‘1’ 字符1 ,对应的ASCII表的值是49 ,
System.out.println('1'+0);
Char是可以运算的, 因为在ASCII中都有对应的值
09 算术运算符
运算符 : 算术运算符 , 赋值运算符 , 比较运算符 , 逻辑运算符, 位运算符, 三元运算符
Int x = 4333 ;
X = x/1000*1000;
打印x // 4333/1000=4.333 , 但是2个都是int,所以结果还是int , 4333/1000=4 × 1000 = 4000
5%2=1 , 取余数。
Int a , b =3 ; //a 没有值,而b的初始值是3,
a= b++ // a =3 , b=4 , b++ 含义是, b = b + 1 ,
a=++b// ++b优先于赋值运算执行。
+ 可以是字符串连接符 “haha”+"hehe"
"ab"+5 +5 , 打印出来是 ab55
“5+5=”+5+5 ==》 5+5=55 //字符串中的东西会原样的打印,string + int ,这里的+是字符串链接符
"5+5="+(5+5) ==> 5+5=10 //()中的东西会优先的执行
"a="+a+",b="+b 打印出来的东西更易懂 // 哪部分是固定的就放在“”中,变化的放在外边。
010 转义字符
Print ,不换行
Println,此语句完成后换行。
转义字符: 通过 \ 来转变后面字母或者符号的意义
\n | 换行 |
\b | 退格 |
\r | 回车 非win |
\r\n | 回车 win |
\t | 制表, tab |
中文每个是两个字节,char类型也是两个字节,没问题
011 赋值,比较运算符
+= -+ *= /= %=
Short s =4;
S = s+ 5; //损失精度 , 5 是int , 编译失败 这个是两次运算
|
Int a, b,c ;
A = b = c = 5 ; //同时给abc赋值
比较运算 :
== 是否向= , 比较返回真或者假
012 逻辑运算符
& | 位与 |
|
| | 位或 |
|
^ | 亦或 | 同对同错为假,一对一错位真 |
! | 非 |
|
| 短路与 | 条件1为假,条件2不执行 |
| 短路或 | 条件1为真,条件2不执行 |
013 014 位运算符
<< | 左移 | 3<<2 , 3左移两位 | 变大 3×2的n次幂 = 3 × 4 =12 |
>> | 右移 | 6>>2,6向右移两位 | 变小 6/4 = 1.5 = 1 (小数位舍弃) |
>>> | 无符号右移 |
| 无论最好位是什么都用0补 |
~ | 反码 |
|
|
6 & 3 //需要先转换为2进制
110
011
----
010 = 2
对于每一位来做& , | , ^的运算, 然后返回那个二进制的数
7^ x ^ x =7 , //一个数亦或同一个数两次,结果还是那个数。 密码锁~
015 016 位运算练习
做乘除时,其实用位运算最高效。
2×8 - 》 2<<3
n=3 , m=8 ; 让n , m值互换
n= n^m ; //原理就是 被同一个值亦或两次值不变。
m=n^m; //n^m^m , 右边是原来n的值
n=n^m; //n^m^(n^m^m) , 右面是原来m的值
在求一个数的16进制的时候,
就是在获取32位2进制中的每4位,
每4位如何获取??
Int a = xxx
比如想拿一个2进制的最低4位,就是拿最低4位有效位中的1, -->只需要&下, 1111, 原数右移4位,再与,以此类推
最低4位 : a & 15
次第4位 : (a>>4)&15
再次第4位 : ((a>>4)>>4) &15
….
Num =60 ;
Num & 15 = 12 // 最低4位
Temp = num >>> 4 //次第4位 , 保正是正数。
Temp& 15 = 3
0 - 9 A B C D E F
10 11 12
12-10 --- 2 + ‘A’ ---- (char)(2+'A')
三元运算符:
Int x=3 ,y;
Y = (x>1)?100:300; //当x的值大于1,则给y值100, 否则300
y=(x>2)? 'a':'b' //最后y是个数字,而不是a,或者b
017 流程控制, IF
If(x>1)
System.out.println("yes"); //注意代码的缩进,最好加括号吧
System.out.println("yes");
If else 简写可以
变量 = 条件表达式 ? 表达式1 : 表达式2;
相当与一个三元运算符,但是不同的是,三元运算符必须要有一个返回值。
If (){}
Else if() {}
Else if() {}
…
Else 虽然行数多,但是是单条语句。
019 switch 语句和练习
Switchcase break default
Case 取值,
执行语句
Switch (x) 备选的表达式的值,
{
Case 4:
System.out.println("a");
Break;
Case 6:
System.out.println("b");
Break;
Case 2:
System.out.println("c");
Break;
Default:
}
只接受4种类型的值: byte , short ,int , char , 7.0 可以判断字符串
在switch中语句中可以没有顺序, 但是Default会最后读。
switch结束 : break, 最后一个大括号
由于没有匹配的项,在读default时也没有break,则程序会继续向下读,且不判断case,直到遇到break或者最后的大括号。
最后的语句为 d , a , b
Case 3:
Case 4:
Case 5 :
xxxxx
Break;
3,4,5对应同一个答案
==============================================================
在练习中扩展的东西
需求1 : 根据用户定义的数值不同,打印对应的星期
想用到数组
需求2: 根据用户输入的月份,打印该月份的季节
/**
JerryJava
需求1 : 根据用户定义的数值不同,打印对应的星期
需求2: 根据用户输入的月份,打印该月份的季节
*/
class Res1
{
publicstatic void main(String[] args)
{
System.out.println("HelloWorld!");
intx;
x=3;
//调试了3遍才通过,
//第一次 int[] arr 结尾没有加;
//第二次 int[] arr , 数组的数据类型就定义错了, 改成了String[]
//第三次 给string数组赋值出错了,原来是arr = "星期1,星期2,…,星期日"
//其实应该是arr ={"","","",…,""}的格式,用大括号
String[] arr= {"星期1","星期2","星期3","星期4","星期5","星期6","星期7"};
for(int i=1;i<8 ;i++ )
{
if(x==i)
{
System.out.println("今天是"+arr[i]);
}
}
}
}
加入了 Scanner后有了交互, 改进了下
扩展的东西 :
1.采用java.util.Scanner类
采用Scannerd的next()方法读取,测试代码如下:
- Scanner sc=new Scanner(System.in);
- System.out.println("waiting inputchar:");
- String n=sc.next();
- System.out.println(n);
当然记得在上面引入相关包:
- import java.util.Scanner;
2.采用BufferedReader类取得用户输入
BufferedReader类是java.IO.Reader的子类
实例代码如下:
- //采用 BufferedReader取得用户输入
- //BufferedReader接收的是java.io.reader类的实例
- //这里我们可以用java.IO.InputStreamReader
- //使用流操作的时候记得加上异常处理,不然会报错误
- try
- {
- BufferedReader bt=new BufferedReader(new InputStreamReader(System.in));
- String s=bt.readLine();
- System.out.println(s);
- }
- catch(java.io.IOException ex)
- {
- System.out.println(ex.getMessage());
- }
这里要加上try..catch()异常处理块,不然会报以下异常信息:
- Exception in thread "main" java.lang.Error: Unresolved compilation problem:
- Unhandled exception type IOException
tring -> int
s="12345";
int i;
第一种方法:i=Integer.parseInt(s);
第二种方法:i=Integer.valueOf(s).intValue();