初识Java

第一个java程序

1
2
3
4
5
public class HelloWorld {
public static void main(String[] args) {
System.out.println("HelloWorld");
}
}
  • 一个java文件中,只能有一个public类,且类名要与文件相同。

  • 类存在于源文件里面;方法存在于类中;语句存在于方法中。

  • 类名要采用大驼峰形式(首字母均大写)命名。

面试问题:

main方法为什么是static:main方法是程序的入口,如果不是静态的话,要启动就必须创建一个实例,但是main是程序入口,创建一个实例又得从main开始。如果一个方法不是静态的,则要先实例化该类,比如要这样 test t=new test();
然后才能调用 t.main(); 而这对于运行一个程序的主函数来说是不现实的,所以比如把main函数定义为static,使t.main()可以直接被调用。

String[] args的作用是什么:运行时命令行参数,例如我运行时输入这条指令:java HelloWorld panghutx is a stupid bird,会将panghutx、is、a、stupid、bird存入args这个字符串数组。

如何运行java程序

image-20211120114709234

大致过程就是,我们写好的.java文件(源文件)被编译器编译后变成.class文件(字节码),然后被JVM的类加载器加载到内存,通过字节码校验器去做一些校验,校验通过后交由解释器将字节码文件解释成计算机能够识别的机器指令。

面试问题:双亲委派模型、类加载器

JDK Java开发工具 ;JRE Java运行环境 ;JVM Java虚拟机

image-20211120114912827

1
2
3
4
5
6
7
8
9
10
class zzz {
public static void main(String[] args) {
System.out.println("zzz");
}
}
public class HelloWorld {
public static void main(String[] args) {
System.out.println("HelloWorld");
}
}

image-20211120115549069

image-20211120115606886

Java中,一个类就会生成一个字节码文件。

为何这样设置?为了方便使用,如果需要HelloWorld这个类,就加载对应的字节码文件。

变量和类型

在这里插入图片描述

变量均存储在内存中。

变量

整形
1
2
int i=10; //定义一个整形变量
System.out.println(i);

一个int变量占4个字节。

什么是字节?

字节是计算机中表示空间大小的基本单位. 计算机使用二进制表示数据. 我们认为 8 个二进制位(bit) 为一个字节(Byte). 我们平时的计算机为 8GB 内存, 意思是 8G 个字节. 其中 1KB = 1024 Byte, 1MB = 1024 KB, 1GB = 1024 MB. 所以 8GB 相当于 80 多亿个字节

1
2
System.out.println(Integer.MAX_VALUE); // 2147483647
System.out.println(Integer.MIN_VALUE); // -2147483648

4 个字节表示的数据范围是 -2^31 -> 2^31-1 , 也就大概是 -21亿 到 +21亿

1
2
3
4
int maxValue = Integer.MAX_VALUE;
System.out.println(maxValue+1); // -2147483648
int minValue = Integer.MIN_VALUE;
System.out.println(minValue-1); // 2147483647

如果运算的结果超出了 int 的最大范围, 就会出现溢出的情况。

image-20211120121410693

图:int的取值范围

长整型

long占8个字节,取值范围是-2^63—2^63-1

1
2
3
4
long num=10L;
System.out.println(num);
System.out.println(Long.MAX_VALUE);
System.out.println(Long.MIN_VALUE);

初始化长整型变量是记得在数字后面加上L

双精度浮点型

double占8个字节,浮点数在内存中的存储与整形不同,不能单纯用2^n表示其取值范围,且浮点数的存储会存在精度误差。

1
2
double num = 1.1;
System.out.println(num * num) // 1.2100000000000002
单精度浮点型

float占4个字节,初始化时要在数字后面加上f

1
2
float num = 1.0f;    // 写作 1.0F 也可以
System.out.println(num);
字符型

char在java中占2个字节

1
char ch='A';
  • Java 中使用单引号 + 单个字母 的形式表示字符字面值.
  • 计算机中的字符本质上是一个整数. 在 C 语言中使用 ASCII 表示字符, 而 Java 中使用 Unicode 表示字符. 因此一个字符占用两个字节, 表示的字符种类更多, 包括中文.
  • 使用一个汉字表示一个字符时,报错是要用javac -encoding UTF-8 文件名.java
字节型

byte占1个字节,范围大小是-128–>127

byte类型相加减时会进行整形提升,要用int保存。

短整型

short占2个字节,范围大小是-2^15-2^15-1,范围较小,一般不使用。

布尔型

boolean只有两种取值,true或false。Java中的布尔型和整形不能相互转换,不能用1或0表示布尔型。

字符串型

String占8个字节,Java 使用 双引号 + 若干字符 的方式表示字符串字面值。

1
String s = "胖虎同学";

使用+可以进行字符串的拼接,任何类型的变量与字符串进行拼接时,都会转换成字符串。

1
2
3
int a=20;
int b=21;
System.out.println(""+a+b); //2021
总结

image-20211120154001169

常量

1
2
final int a = 10;
a = 20; // 编译出错. 提示 无法为最终变量a分配值

常量不能在程序运行过程中发生修改。

类型转换

  • 不同数字类型的变量之间赋值, 表示范围更小的类型能隐式转换成范围较大的类型
  • 如果需要把范围大的类型赋值给范围小的, 需要强制类型转换, 但是可能精度丢失。不相关的类型不能进行类型转换。
  • 将一个字面值常量进行赋值的时候, Java 会自动针对数字范围进行检查.

总结

image-20211120154336948

运算符

算术运算符

+-*/%

1
2
3
4
System.out.println(5/2); // 2
System.out.println(5.0/2); //2.5
System.out.println((double)5/2); //2.5
System.out.println((double)(5/2)); // 2.0
1
2
3
4
5
System.out.println(5%2); // 1
System.out.println(-5%2); //-1
System.out.println(5%-2); //1
System.out.println(-5%-2); //-1
//正负看被除数

Java中,不仅仅可以对 int 求模, 也能对 double 来求模。

值得注意的是,下图中i=10,而c语言是11。

image-20211120172159321

增量运算符

+= -= *= %=

可以自动进行类型转换

关系运算符

== != < > <= >=

关系运算符表达式返回值都是布尔值。

逻辑运算符

&& || !

Java中,逻辑非!只能作用于布尔值

1
2
3
int a=10;
int b=20;
System.out.println(!a < b);

image-20211120165938626

位运算符

& | ~ ^

移位运算符

>> << >>>

无符号右移 >>>:最右侧位不要了, 最左侧补 0.

1
2
3
int a = 0xffffffff;
System.out.printf("%x\n", a >>> 1);
// 运行结果(注意, 是按十六进制打印的) 7fffffff
  • 左移 1 位, 相当于原数字 * 2. 左移 N 位, 相当于原数字 * 2 的N次方
  • 右移 1 位, 相当于原数字 / 2. 右移 N 位, 相当于原数字 / 2 的N次方
  • 由于计算机计算移位效率高于计算乘除, 当某个代码正好乘除 2 的N次方的时候可以用移位运算代替