1. Java的main方法
1.1 main方法实例
public class Test{ public static void main(String[] args) { System.out.println("Hello World"); } }
- 数组的形式与C语言有区别:
C语言:int arr[5]
Java:int[5] arr
- 打印函数有三:
printf()
;与C语言相同print()
;不换行println()
;换行 - 如果类名是
public
修饰的,类名需要和文件名一致
例子
public class Test{ public static void main(String[] args) { for(int i = 0; i < args.length; i++){ System.out.println(args[i]); } } }
1.2 运行
前提概要:
Java的程序具有良好的可移植性,即不论它运行在何种CPU、操作系统或Java编译器上,都将产生同样的结果。C/C++也可以做到,但这比Java实现起来难多了。因为Java将C/C++的许多细节都严格定义,例如内存自动回收、定义变量必须初始化,以及越界报错等等。
Java 的 Slogan 是 "Write once, run anywhere”,即一次编写,到处运行。(个人认为将write理解为编译更好,事实就是如此:一次编译,到处运行)
JVM:Java虚拟机。用软件模拟硬件,实现程序在相同环境下运行的效果。
Java程序的运行过程:
- 编译:javac命令
- 运行:java命令
Java程序源代码(文件名.java)文件再经过编译后,会在相同的目录下生成一个(类名 .class)字节码文件(二进制文件),它包含了当前类的信息。字节码文件的数量取决于源代码中类的数量。
每个字节码文件的开头前4个字节都有一段标识符:cafe babe
链接,用来让机器识别字节码文件。
字节码文件是与平台无关,面向JVM的文件,最后Java虚拟机运行字节码文件,然后以平台对应的方式运行。
使用cmd和记事本运行Java程序注意事项:
当出现中文注释时,编译会出现以上错误。原因简言之是记事本(notepad++/sublime等)默认的编码方式为UTF-8,而cmd窗口的编码方式默认为GBK。有两种解决办法:一是修改记事本的默认编码方式,二是在编译时指定编码方式为UTF-8。下面使用第二种方式。
指令:java 文件名 -encoding utf-8
2. 数据类型
不同的变量类型就像不同容量的容器,它们被用来储存不同大小的数据。
语法格式:必须在声明变量的同时将变量初始化。
//数据类型 变量名 = 初始值;
*2.1 整型变量
例:
//int数据类型范围 public class Test{ public static void main(String[] args) { System.out.println(Integer.MAX_VALUE); System.out.println(Integer.MIN_VALUE); } }
- 在Java中,一个int型变量大小是4个字节,与平台无关。
结果为:
2147483647(2^31)
-2147483648(-2^31-1)
2.2 长整型变量
例:
long num = 10L;
注意:
- Java中的long型变量占8个字节
- 初始值的末尾要加上字母L,表示这个数是长整型,一般为大写(较易区分)。如果例中10不加L,编译器不会报错,因为默认10是一个int型,占4个字节,可以放入long型变量中
System.out.println(Long.MAX_VALUE); System.out.println(Long.MIN_VALUE);
结果:
9223372036854775807(2^63)
-9223372036854775808(-2^63-1)
*2.3 双精度浮点型变量
例1:
int a = 1; int b = 2; System.out.println(a / b);
结果:0.
原因是和C语言中相同:小数部分被舍弃。
所以要用double型计算
double a = 1.0; double b = 2.0; System.out.println(a / b);
结果:0.5
例2:
double num = 1.1; System.out.println(num * num);
结果:1.2100000000000002
因为浮点数在内存中的存储有精度损失,有很多浮点数的小数部分无法用二进制精确表示。
- double在Java中占8个字节
2.4 单精度浮点型变量
例:
float num = 1.0f;
- 与长整型变量类似,需要在单精度浮点型变量初始值的末尾加一个f(或F)标识。
- float在Java中占4个字节
2.5 字符类型变量
例:
char ch = 'A';
- 使用方法与C语言相同
- Java中使用Unicode字符,所以一个字符类型变量占2个字节。所以它能表示更多字符类型,包括ASCII,许多国家的文字等等。【Unicode】【Java char型】
2.6 字节类型变量
例:
byte value = 0; System.out.println(value);
结果:0
- 字节类型变量是整数,占1个字节。(-27~27-1)
- 与字符类型变量无关
2.7 短整型变量
例:
short value = 0; System.out.println(value);
结果:0
- 短整型变量占2个字节(-27~27-1)
2.8 布尔类型变量
例:
boolean value = true; System.out.println(value);
- boolean 类型的变量只有两种取值,true 表示真, false 表示假。boolean 类型的值不是0或1,因此不能对它进行数值运算
- 官方未规定boolean 类型变量的大小。所以有些JVM中boolean 类型变量可能占1个字节或1个比特位等
*2.9 字符串类型变量
例:
String name = "zhangsan"; System.out.println(name);
结果:zhangsan
- Java可以用双引号、加号和若干字符灵活表示字符串
当+
的一边有字符串时,都是字符串拼接
System.out.println("hello"+"world"); //helloworld //字符串+字符串 直接拼接 -> 字符串 System.out.println("hello"+111+222); //hello111222 //字符串+其他 直接拼接 -> 字符串 System.out.println(111+222+"hello"); //333hello //其他+字符串 先处理其他,再拼接 ->字符串 System.out.println(111+""+222+"hello"); //111222hello //用空字符串链接111和222,然后让111222这个字符串继续拼接
- 使用转义字符表示某些特定字符。使用方法同C语言
- String不是基本类型,属于引用类型数据类型:
- 基本类型(8种):byte、short、int、long
float、double char boolean
- 引用类型:String、数组、类、接口、枚举等(后期)
2.10 变量的作用域
一个变量的作用域在离它最近的花括号内。
class Test { public static void main(String[] args) { { int x = 10; System.out.println(x); // 编译通过; } System.out.println(x); // 编译失败, 找不到变量 x. } }
2.11 变量的命名规则
硬性:
- 一个变量名只能包含数字、字母和下划线
- 不能以数字开头
语法允许使用中文、$命名变量,当这样做是不合理的
弹性:
- 使用小驼峰命名发命名变量,即第一个单词首字母小写,其他单词首字母均大写
- 知名见意,尽量使用名词
- 不使用拼音
2.12 常量
在这里首先强调变量的特点,以便于与常量区分:
变量:在程序运行时可以改变的量。
常量:在程序运行时不能改变的量。
2.12.1 字面值常量
10 // int 字面值常量(十进制) 010 // int 字面值常量(八进制) 由数字 0 开头. 010 也就是十进制的 8 0x10 // int 字面值常量(十六进制) 由数字 0x 开头. 0x10 也就是十进制的 16 10L // long 字面值常量. 也可以写作 10l (小写的L) 1.0 // double 字面值常量. 也可以写作 1.0d 或者 1.0D 1.5e2 // double 字面值常量. 科学计数法表示. 相当于 1.5 * 10^2 1.0f // float 字面值常量, 也可以写作 1.0F true // boolen 字面值常量, 同样的还有 false 'a' // char 字面值常量, 单引号中只能有一个字符 "abc" // String 字面值常量, 双引号中可以有多个字符.
2.12.2 final 关键字修饰的常量
final int a = 10; a = 20; // 编译出错. 提示 无法为最终变量a分配值
- final有点类似C的const/static修饰符,但Java中并无全局变量的概念。final修饰变量仅代表这个变量已经是常量。
编译出错的原因:常量是在程序运行时不能改变的量。
2.13类型转换
Java中也有与C类似的强制类型转换,但有所区别。Java是一门强类型语言,Java中对类型之间的类型转换检查更加严格。
例:
int a = 10; long b = 20; a = b; // 编译出错, 提示可能会损失精度 b = a; // 编译通过
long占8个字节,int占4个字节
int a = 10; double b = 1.0; a = b; // 编译出错, 提示可能会损失精度 b = a; // 编译通过
double占8个字节,int占4个字节
原因:小的能放大的,大的不能放小的
为什么小的能放到大的里面呢?
不同数字类型的变量之间赋值,表示范围更小的类型能隐式转换成范围较大的类型
int和Boolean可以互相赋值吗
int a = 10; boolean b = true; b = a; // 编译出错, 提示不兼容的类型 a = b; // 编译出错, 提示不兼容的类型
- Boolean的大小是不确定的
- Boolean和int是两种无关的类型
int字面值常量 给 byte 赋值
byte a = 100; // 编译通过 byte b = 256; // 编译报错 提示 从int转换到byte可能会有损失
byte 表示的数据范围是 -128 ~ 127, 256 已经超过其范围,而 100 还在范围之内
原因:使用字面值常量赋值的时候,Java编译器会自动进行检查校验, 判定赋值是否合理
使用强制类型转换
int a = 0; double b = 10.5; a = (int)b; int a = 10; boolean b = false; b = (boolean)a; // 编译出错 提示不兼容的类型
注意:
- 强制类型转换有风险,例如将10.5强制转换为int,会有精度损失。
- 无关的类型之间无法强制类型转换
2.14 数值提升
int和long混合运算
int a = 10; long b = 20; int c = a + b; // 编译出错, 提示将 long 转成 int 会丢失精度 long d = a + b; // 编译通过.
原因:
当 int 和 long 混合运算的时候, int 会提升成 long, 得到的结果就是 long 类型,所以需要使用 long 类型的变量来存放果。
btye和byte运算
byte a = 10; byte b = 20; byte c = a + b; System.out.println(c); // 编译报错 Test.java:5: 错误: 不兼容的类型: 从int转换到byte可能会有损失 byte c = a + b; ^
原因:
虽然 a 和 b 都是 byte, 但是计算 a + b 会先将 a 和 b 都
提升成 int, 再进行计算, 得到的结果也是 int, 再赋给byte型的 c,编译器就会抛出异常。
改正:
byte a = 10; byte b = 20; byte c = (byte)(a + b); System.out.println(c);
总结:
由于计算机的 CPU 通常是按照 4 个字节为单位从内存中读写数据.,为了硬件上运算方便,就会将诸如 byte 和 short 这种低于4 个字节的类型,会先提升成 int,再进行计算。
2.15 int 和 String 之间的相互转换
一串数字和字符串之间相互转换,在C中可能要单独写接口实现该功能,但Java本身就带有许多这样的功能。
int 转成 String
int num = 10; // 方法1 String str1 = num + ""; // 方法2 String str2 = String.valueOf(num);
结果:10(字符串)
String 转成 int
String str = "100"; int num = Integer.parseInt(str);
结果:100(数字)
3. 运算符
3.1 算术运算符
基本运算符+ - * / %
这些我们再熟悉不过,在此强调/
和%
的注意事项
- 分母不为零
- 需要用浮点数储存int与int的商
- %也可以对浮点数取模
增量赋值运算符 += -= *= /= %=
- 如果不取自增运算的表达式的返回值,则前置自增和后置自增没有区别,结果都是+1。用法同C语言。
- 如果对大于四个字节(int)的数据进行自增自减运算,运算符会自动进行整型提升。
如:
float a = 1.4f; System.out.println(++a);
- 实际上就是在浮点数的个位上+1,但Java中只允许相同类型数据之间的运算,所以要把1整型提升为float型,然后再加
3.2 关系运算符
== != < > <= >=
例:
int a = 10; int b = 20; System.out.println(a == b);//false System.out.println(a != b);//true System.out.println(a < b);//true System.out.println(a > b);//false System.out.println(a <= b);//true System.out.println(a >= b);//false
注意: 关系运算符的表达式返回值都是 boolean 类型
*3.3 逻辑运算符
&& || !
注意: 逻辑运算符的操作数(操作数往往是关系运算符的结果)和返回值都是 boolean
逻辑与(&&)
规则: 两个操作数都为 true,结果为 true, 否则结果为 false
int a = 10; int b = 20; int c = 30; System.out.println(a < b && b < c);
结果:true
逻辑或(||)
规则: 两个操作数都为 false,结果为 false,否则结果为 true
int a = 10; int b = 20; int c = 30; System.out.println(a < b || b < c);
结果:true
逻辑非 (!)
规则: 操作数为 true, 结果为 false; 操作数为 false, 结果为 true(这是个单目运算符, 只有一个操作数)
int a = 10; int b = 20; System.out.println(!(a < b));
结果:false
短路求值
&&:只要左边的语句块结果为false,右边的语句块不会执行,直接返回false;反之全部执行,根据结果返回值。
||:两边的语句块都要执行,根据结果返回值。
例:
System.out.println(10 > 20 && 10 / 0 == 0); // false System.out.println(10 < 20 || 10 / 0 == 0); // true
3.4 位运算符
& | ~ ^
其中运算规则与C语言相同.
区别在于:当 & 和 | 的操作数为整数(int,short,long,byte) 的时候,表示按位运算;当操作数为 boolean 的时候表示逻辑运算
3.5 移位运算
<< >> >>>
其中前两个(左移<<
、右移>>
)的使用方法和C语言相同
复习:
<<
:舍弃最左侧位,右侧补0
>>
:舍弃最右侧位,左侧补符号位(正补0,负补1)
无符号右移>>>
:舍弃最右侧位 ,最左侧补 0。与>>
的区别就是只补0
3.6 条件运算符
表达式1?表达式2:表达式3
用法同C语言。
是Java中唯一一个三目运算符。
日志
4/27/2022