javase 引入、基本语法
一、引入
JAVA语言特性
简单性:不像c++支持多继承,无指针。底层由c++实现。
面向对象
可移植性:一次编译,到处运行。在win上编译后可以在Linux上运行。
Java程序在Java虚拟机上运行,JVM : Java virtual machine
JDK :Java开发工具包
多线程
健壮性:产生的垃圾是自动回收的,不需要像c++一样手动回收内存空间。
安全性
JAVA的加载与执行
注:.class文件是字节码文件,不是纯粹的二进制文件,否则操作系统就可以直接运行了。
编译:使用JDK中自带的javac.exe进行编译
使用方法:
1 | javac java源文件的路径 |
- 一个源文件可能生成多个.class文件
- .class文件生成后,删除.java文件不影响程序的运行,但最好不要删掉,以防后面要修改。
运行:使用java.exe运行
使用方法:
磁盘上有一个A.class
1 | java A |
- JVM会启动类加载器ClassLoader
- ClassLoader会去硬盘上根据classpath搜索A.class文件,找到该文件则将该字节码文件装载到JVM中
- JVM将A.class文件解释成二进制数据
- 操作系统执行二进制文件,和底层硬件平台交互
三种注释方式
1 | // 单行注释 |
第一个程序
public class 和class
注:公共类与文件名强制绑定
文件名应该改为HelloWorld.java
一个class文件最多只能有一个公共类,也可以没有。
每个类中都可以编写入口main方法,想执行那个就用
java 类名
实际开发中对于一个软件来说一般入口只有1个
二、基本语法
标识符
- 字母(任何一个国家的语言)、数字、下划线、美元符号组成,不能包含其他符号。
- 数字不能开头
命名规范
加号运算符
- 求和
- 字符串拼接(加号两边有任意一边是字符串类型时进行,结果还是一个字符串)
变量
数据类型
- int 整型
- double 浮点型
- String 字符串型
- ……
变量类型
在方法体中定义的变量,是局部变量。
在类体中定义的变量,是成员变量,成员变量又分为静态变量、实例变量。
成员变量如果没有手动赋值,系统会自动赋默认值。
整型
自动类型转换
如果在整型类型后添加 L 或者 l ,那么这个整型数据就会被当成long类型处理。建议使用L,看的比较清楚。
- 面试题
强制类型转换
大容量无法自动转换成小容量,想让其编译通过,必须手动添加强制类型转换符。如 (int)
需记住:
- 当一个整型字面量没有超出某类型(byte short char)的取值范围时,可以直接赋值给该类型的变量,不需要强转。
- 多种数据类型混合运算时,先各自转成容量最大的,再做运算。
- byte short char混合运算时,先转成int再运算。
- 多种数据类型混合运算时,要先转成当前最大的类型再运算 double > float > long > int
1 | double i = 1; //存在自动类型转换,由整型转换为浮点型。 |
浮点型
数值后加F或f表示float类型,否则默认为double型
注:一旦有浮点型数据参与运算得出的结果,不要用“==”和别的数字进行相等比较!!! 一般相减然后小于一个很小的值,就认为相等。
字符型
- Java中的char类型统一采用Unicode编码
- 不允许空字符文字 ‘’
- char默认值: \u0000 空字符(不是空格,空格是\u0020)
布尔型
long , int等类型的数值不能直接赋值给布尔型变量
进制
java中规定,0开头的是八进制,0b开头的是二进制,0x开头的是十六进制
接收键盘输入
1 | // 创建键盘扫描器对象 |
注:以上的代码存在问题,nextInt()
,nextDouble()
,next()
在输入时肯定会输入换行符\r,但是这三个扫描器都不会吸收这个换行符,导致到nextLine()
时,直接吸收换行符就完成运行了。
或者在最开始 import scanner对应的包
1 | import java.util.Scanner; |
逻辑运算符
& 逻辑与
|逻辑或
&& 逻辑与(左边是false就短路,不运行右边的内容)
||逻辑或(左边是true就短路,不运行右边的内容)
按位运算符
操作数必须是整数
移位运算符
经典面试题:怎么让2快速变成8?左移2位
>>
算数右移
>>>
逻辑右移
按位或
应用:设置某一位的值为1。
如a | (1<<n)
按位异或
自反性:a^b^b = a
应用:简单的加密、解密
按位取反
应用:对某一位清零
赋值运算符
对于扩展的赋值运算符,不会改变变量的数据类型。
自带强制类型转换,把运算符右边的内容强制转换为左边的数据类型。
控制语句
字符串的比较不能使用==
,因为String是引用数据类型,==
此时比较的是两个变量是否指向同一个引用对象,比较的是地址。
比较两个字符串是否相等
1 | String s = "admin"; |
switch 语句
switch(x){ } 这个x可以是int(byte short char 放进去也可以自动类型转换),字符串,枚举类型。
Java 12 新特性
不需要自己写break了。
方法(C语言中的函数)
方法的调用
当这个方法修饰符列表有static关键字时,调用的格式为:
类名.方法名(实参列表)
什么时候调用时可以省略类名.
?
调用者和被调用者在同一个类时,可以省略。
方法重载 overload
什么情况构成了方法重载?
- 在同一个类中
- 方法名相同
- 形参列表不同:类型/顺序/个数 不同
哪个阶段的机制?
编译阶段的。
编译阶段已经完成了方法的绑定,即确定要调用哪个方法了。
什么情况下考虑使用方法重载?
功能类似,形参类型不同。
递归
递归调用很耗资源
能用循环就用循环。在实际开发中,有时候即使结束条件存在且合法,也可能出现栈溢出——递归太深了,栈内存不够导致。
package
作用
便于文件的管理,不同的类放在不同的包下,好维护。
定义包
在代码第一行添加语句 package 包名
包名规范
公司域名倒序+项目名+模块名+功能名
所有的包名都是小写
如何带包编译?
1 | javac -d 编译后存放的目录 java源文件路径 |
有了包机制后的类名
包名.类名
,在同一个包内不需要写包名,直接写类名即可。
import
使用不在同一个包的方法,需要import包
import支持静态导入(最好别用,可读性差)
1 | import static java.lang.System.* |
intellij idea 的快捷键
多行注释
ctrl shift /
复制一行
ctrl D
快速生成创建对象语句
类名.new.var
getter and setter
- alt + insert
- 选择getter and setter
- 选择要创建的内容
移动一行代码
alt shift 上键/下键
快速向下转型
变量名.castvar
快速查看方法的参数
ctrl + p
返回上一步
ctrl + alt + 左方向键
下一步
ctrl + alt + 右方向键
代码格式化
ctrl + alt + L
查看继承结构
ctrl + H
自动代码包裹
ctrl + alt + t