Java的特点:
平台无关性 高可靠性和安全性 分布式应用和多线程
Java的跨平台的实现原理:
java在操作系统上加入了jvm虚拟机,程序运行在jvm上,jvm会自动根据不同操作
系统将相同的.class字节码解释成不同的机器码
关于Java跨平台原理的说法:
Java源程序要先编译成与平台无关的字节码文件(.class),然后字节码文件再被解释成机器码运行
Java语言具有一次编译,到处运行的特点,可以在所有的平台上运行
JDK、JRE、JVM 的区别和联系:
JDK(java development kit) >JRE(java runtime enviroment) >JVM(java virtual machine)
Java程序的开发和执行过程:
编写源文件->编译源文件(使用编译器javac)->字节码->执行字节码(使用解释器java)
标识符:
标识符必须以字母、下划线_、美元符号$开头。
标识符其它部分可以是字母、下划线“_”、美元符“$”和数字的任意组合。
Java 标识符大小写敏感,且长度无限制。
标识符不可以是Java的关键字。
定义常量:
在Java语言中,主要是利用关键字 final 来定义一个常量。 常量一旦被初始化后不能再更改其值
例如:final double PI = 3.14;
数据类型:
引用数据类型的大小统一为4个字节,记录的是其引用对象的地址!
类型 占用存储空间 表数范围
byte 1字节 -2**7 ~ 2**7-1(-128~127)
short 2字节 -2**15 ~ 2**15-1 (-32768~32767)
int 4字节 -2**31 ~ 2**31-1 (-2147483648~2147483647) 约21亿
long 8字节 -2**63 ~ 2**63-1
Java语言的整型常数默认为int型,声明long型常量可以后加‘ l ’或‘ L ’
如:long b = 55555555555L;
Java 语言整型常量的四种表示形式:
十进制整数,如:99, -500, 0
八进制整数,要求以 0 开头,如:015
十六进制数,要求 0x 或 0X 开头,如:0x15
二进制数,要求0b或0B开头,如:0b01110011
类型 占用存储空间 表数范围
float 4字节 -3.403E38~3.403E38
double 8字节 -1.798E308~1.798E308
浮点型常量默认类型是double
如 float PI = 3.14; 报错,默认是double类型,但可以 float PI = 3.14F;
Java浮点类型常量有两种表示形式:
十进制数形式,例如:3.14 314.0 0.314
科学记数法形式,如314e2 314E2 314E-2 <==> (314/10²) <==> 314*10^(-2)-->3.14
浮点数存在舍入误差,数字不能精确表示。如果需要进行不产生舍入误差的精确数字计算,需要使用BigDecimal类
避免比较中使用浮点数,需要比较请使用BigDecimal类
字符型变量/常量:
字符类型与整数进行逻辑或者算数运算时自动转为ascii码值.
字符型在内存中占2个字节,在Java中使用单引号来表示字符常量。例如’A’是一个字符,它与”A”是不同的,
”A”表示含有一个字符的字符串.
char 类型用来表示在Unicode编码表中的字符。Unicode编码被设计用来处理各种语言的文字,它占2个字节,
可允许有65536个字符.
Unicode具有从0到65535之间的编码,他们通常用从’\u0000’到’\uFFFF’之间的十六进制值来表示(前缀为u表示Unicode)
如: char c = '\u0061';
转义字符表
转义符 含义 Unicode值
\b 退格(backspace) \u0008
\n 换行 \u000a
\r 回车 \u000d
\t 制表符(tab) \u0009
\“ 双引号 \u0022
\‘ 单引号 \u0027
\\ 反斜杠 \u005c
我们学的String类,其实是字符序列(char sequence)
注意 'a' + 'b'; 得到的是数字 如果想得到字符串"ab" 则可以这样写 “” + 'a' + 'b' ;
boolean类型变量/常量:
注: boolean类型有两个常量值, true和false, 在内存中占一位(不是一个字节), 不可以使用 0 或
非 0 的整数替代 true 和 false, 这点和C语言不同. boolean 类型用来判断逻辑条件,一般用于程序流程控制.
运算符:
算术运算符 二元运算符 +,-,*,/,%
一元运算符 ++,--
赋值运算符 =
扩展运算符 +=,-=,*=,/=
关系运算符 >,<,>=,<=,==,!= instanceof
逻辑运算符 &&,||,!,^
位运算符 &,|,^,~ , >>,<<,>>>
条件运算符 ? :
字符串连接符 +
整数运算:
1. 如果两个操作数有一个为Long, 则结果也为long。
2. 没有long时,结果为int。即使操作数全为short,byte,结果也是int。
浮点运算:
3.如果两个操作数有一个为double,则结果为double。
4.只有两个操作数都是float,则结果才为float。
取模运算:
其操作数可以为(“浮点数”),一般使用整数,结果是“余数”,“余数”符号和左边操作数相同,如:7%3=1,-7%3=-1,7%-3=1.
注意事项:
=是赋值运算符,而真正的判断两个操作数是否相等的运算符是==。
==、!= 是所有(基本和引用)数据类型都可以使用
> 、>=、 <、 <= 仅针对数值类型(byte/short/int/long, float/double。以及char)
运算符 说明
逻辑与 &( 与) 两个操作数为true,结果才是true,否则是false
逻辑或 |(或) 两个操作数有一个是true,结果就是true
短路与 &&( 与) 只要有一个为false,则直接返回false
短路或 ||(或) 只要有一个为true, 则直接返回true
逻辑非 !(非) 取反:!false为true,!true为false
逻辑异或 ^(异或) 相同为false,不同为true
短路与和短路或采用短路的方式.从左到右计算,如果只通过运算符左边的操作数就能够确定该逻辑表达式的值,
则不会继续计算运算符右边的操作数,提高效率.
位运算符 说明
~ 取反
& 按位与
| 按位或
^ 按位异或
<< 左移运算符,左移1位相当于乘2
>> 右移运算符,右移1位相当于除2取商
雷区:
1. &和|既是逻辑运算符,也是位运算符。如果两侧操作数都是boolean类型,就作为逻辑运算符。如果两侧的操作数是整数类型,就是位运算符。
2. 不要把“^”当做数学运算“乘方”,是“位的异或”操作。
位运算中的取反
a = 3
先转换成二进制,然后全部取反 0011 取反 1100
然后除了符号位,取反,负数取反后加一 1100 取反加一 1100
转换成十进制 1100 对应十进制 -4
使一个数翻倍最快的操作是右移, …左移
字符串连接符:
“+”运算符两侧的操作数中只要有一个是字符串(String)类型,系统会自动将另一个操作数转换为字符串然后再进行连接
3 + 4 + "8" ==> 7 + "8" ==> "78";
"" + 3 + 4 ==> "3" + "4" ==> "34";
条件运算符:
语法格式: x ? y : z
其中 x 为 boolean 类型表达式,先计算 x 的值,若为true,则整个运算的结果为表达式 y 的值,
否则整个运算结果为表达式 z 的值。
如: int x = -10; int flag = x > 0 ? 1 : (x == 0 ? 0 : -1); --> flag = -1;
运算符优先级:
优先级 运算符 类 结合性
1 () 括号运算符 由左至右
2 !、+(正号)、-(负号) 一元运算符 由左至右
2 ~ 位逻辑运算符 由右至左
2 ++、-- 递增与递减运算符 由右至左
3 *、/、% 算术运算符 由左至右
4 +、- 算术运算符 由左至右
5 <<、>> 位左移、右移运算符 由左至右
6 >、>=、<、<= 关系运算符 由左至右
7 ==、!= 关系运算符 由左至右
8 & 位运算符、逻辑运算符 由左至右
9 ^ 位运算符、逻辑运算符 由左至右
10 | 位运算符、逻辑运算符 由左至右
11 && 逻辑运算符 由左至右
12 || 逻辑运算符 由左至右
13 ? : 条件运算符 由右至左
14 =、+=、-=、*=、/=、%= 赋值运算符、扩展运算符 由右至左
不需要去刻意的记这些优先级,表达式里面优先使用小括号来组织!!
逻辑与、逻辑或、逻辑非的优先级一定要熟悉!(逻辑非>逻辑与>逻辑或)
自动类型转换:
自动类型转换指的是容量小的数据类型可以自动转换为容量大的数据类型。
可以将整型常量直接赋值给byte、 short、 char等类型变量,而不需要进行强制类型转换,只要不超出其表数范围即可.
如:short b = 12; //合法
short b = 1234567;//非法,1234567超出了short的表数范围
char
|
v
byte --> short --> int --> long int|long->float可能会损失精度
\ / \ long->double可能会损失精度
\ / \
\ / \
\|/ \|
v V
float --> double
强制类型转换:
强制类型转换,又被称为造型,用于显式的转换一个数值的类型.在有可能丢失信息的情况下进行的转换是通过造型来完成的,
但可能造成精度降低或溢出.
语法格式: (type)var 运算符“()”中的type表示将值var想要转换成的目标数据类型。
如: double x = 3.14; int nx = (int)x;
基本类型转化时常见错误和问题:
操作比较大的数时,要留意是否溢出,尤其是整数操作时
int money = 1000000000; //10亿
int years = 20;
int total = money*years; //返回的total是负数,超过了int的范围
System.out.println("total="+total);
//返回的total仍然是负数。默认是int,因此结果会转成int值,再转成long。但是已经发生//了数据丢失
long total1 = money*years;
System.out.println("total1="+total1);
//返回的total2正确:先将一个因子变成long,整个表达式发生提升。全部用long来计算。
long total2 = money*((long)years);
instanceof:
instanceof是Java中的二元运算符,左边是对象,右边是类;当对象是右边类或子类所创建对象时,返回true;
否则,返回false.
使用Scanner获取键盘输入:
import java.util.Scanner;
Scanner scanner = new Scanner(System.in);
System.out.println("请输入名字:");
String name = scanner.nextLine(); // 读取一行
System.out.println("请输入你的爱好:");
String favor = scanner.nextLine();
System.out.println("请输入你的年龄:");
int age = scanner.nextInt(); // 按整数形式读入
流程控制语句:
基本同c语言...
特殊的地方: break 标签; continue 标签;
例子:
求1000以内的素数:
outer:
for (int i = 2; i < 1000; i++) {
for (int j=2;j<=Math.sqrt(i);j++){
if(i%j==0){
continue outer;
}
}
System.out.println(i);
}
加static的方法:
方法名前面加static的,可以不用new对象然后用对象调用该方法,可以直接用方法名直接调用.
方法的重载:
方法的重载是指一个类中可以定义多个方法名相同,但参数不同的方法. 调用时,会根据不同的参数自动匹配对应的方法.
重载的方法,实际是完全不同的方法,只是名称相同而已!
构成方法重载的条件:
1.不同的含义:形参类型、形参个数、形参顺序不同
2.只有返回值不同不构成方法的重载
3.只有形参的名称不同,不构成方法的重载
关于时间的函数:
System.currentTimeMillis(); 返回当前的时间戳,可用于测试某方法的运行时间.
sleep方法:
try{
Thread.sleep(3);
}catch (InterruptedException e){
e.printStackTrace();
}