初识JavaSE
一、基础语法
注释
-
行内注释//
-
多行注释/**/
-
文档注释/** */
javadoc生成帮助文档
标识符
注:所有标识符应该以字母、美元符、下划线开始,标识符大小写是敏感的、标识符可以使用中文命名,但不建议。
- 关键字
abstract | assert | boolean | break | byte |
---|---|---|---|---|
case | catch | char | class | const |
continue | default | do | double | else |
enum | extends | final | finally | float |
for | goto | if | implements | import |
instanceof | int | interface | long | native |
new | package | private | protected | public |
return | strictfp | short | static | super |
switch | synchronized | this | throw | throws |
transient | try | void | volatile | while |
注:String不是关键字,是类。
数据类型
- 基本数据类型
-
整数
byte(占一个字节)、short(占两个字节)、int(占四个字节)(默认)、long(占八个字节)
注:long类型要在数字后面加个L,作为区分。
-
浮点数
float(占四个字节)、double(占八个字节)(默认)
注:float类型要在数字后面加个F,作为区分。尽可能少的使用浮点数进行比较,必要时可以用BigDecimal数学工具类。
-
字符
char(占两个字节)、ASCII、UTF-8、Unicode
注:所有字符char的本质还是数字。
-
布尔值
boolean(一位):true、false
- 引用数据类型
- 类
- 接口
- 数组
- 数据类型扩展
- 二进制:0b
- 八进制:0
- 十六进制:0x
类型转换
注:数据类型由低到高的排序是:byte,short,char—>int—>long—>float—>double。不能对布尔值进行转换。数字之间可以用下划线分割,例如:int num=1000000000 等价于 int num=10_0000_0000。
-
自动类型转换
低转高
-
强制类型转换
高转低:(类型)变量名
变量和常量
- 变量
-
变量的定义
type varName [=value];
-
作用域
- 局部变量:写在方法里,必须声明和初始化值
- 实例变量:写在类里方法外,从属于对象,如果不自行初始化,则使用这个类型的默认值(布尔值默认flase、除了基本类型,其余的默认值均为null)
- 类变量:static
- 常量
-
常量的定义
例如:final MAX_A = 10;
- 命名规范
- 见名知意
- 驼峰命名(变量、方法)
- 类:首字母大写,驼峰命名
- 常量:大写+下划线
- 尽量不要使用拼音命名
运算符
-
算术运算符
+、-、*、/、%、++、–
注:例如:b=a++是先复制再自增,b=++a是先自增再复制。
-
赋值运算符
=
-
关系运算符
>、<、>=、<=、==、!=、instanceof
-
逻辑运算符
&&、||、!
注:在&&运算符中,例如:a&&b,如果a错了,那么b将不进行运算。
-
位运算符
&、|、^、~、>>、<<、>>>
注:(1)<<:左移,相当于乘2;
(2)>>:右移,相当于除2。
-
条件运算符
?:
-
扩展运算符
+=、-=、*=、/=
注:(1)a+=b 等价于 a=a+b;
(2)a-=b 等价于 a=a-b。
包机制
- 一般利用公司域名倒置作为包名
- 导入包的语法:import
Java生成文档
/** */
- author 作者名
- version 版本号
- since 指明需要做早使用的JDK版本
- param 参数名
- return 返回值情况
- throws 异常抛出情况
二、流程控制
用户交互scanner
-
需要导入的包:java.util.scanner
-
可以通过scanner类来获取用户的输入
import java.util.Scanner; public class Hello { public static void main(String[] args) { Scanner scanner=new Scanner(System.in);//创建一个扫描器对象,用于接收键盘数据 if(scanner.hasNext()){//判断用户有没有输入字符串 String str=scanner.next();//使用next()方式接受 } scanner.close(); } }
注1:这里定义的scanner对象在使用完后建议用scanner.close()语句关闭,凡是属于IO流的类如果不关闭会一直占用资源。
注2:next()不能得到带有空格的字符串,nextLine()可以得到带有空格的字符串。hasNextInt()、hasNextDouble()等语句可以判断下一个是否为int或double类型。
顺序结构
- 程序默认的结构,自上而下的执行
选择结构
-
if单选择结构
-
if-else双选择结构
-
if-else if-else多选择结构
-
switch
JDK1.7及之后的版本可以比较String类型
循环结构
-
while
尽量避免死循环
-
do……while
-
for循环
-
增强for循环
例如:遍历数组的元素
int[] array={10,20,30,40,50}; for(int num:array){ System.out.println(num); }
break&continue
-
break
用于强制跳出循环
-
continue
用于终止当次循环
-
return
结束方法的运行
三、方法
方法的定义
-
修饰符 返回值类型 方法名(参数类型 参数名) {
方法体;
}
注:return可以终止方法。
方法调用
- 类名.方法
- 对象.方法
方法重载
-
方法重载的规则
(1)方法名称必须相同;
(2)参数列表必须不同;
(3)方法的返回类型可以相同也可以不相同;
(4)仅仅返回类型不同不足以成为方法的重载。
可变长参数
-
在方法声明中,在指定参数类型后加一个省略号
-
一个方法中只能指定一个可变参数,它必须是方法的最后一个参数,任何普通的参数必须在它之前声明。
例如:
public static void show(double d1,double d2,int...num){ //方法体 }
递归
- 自己调用自己,给自己一个出口
四、数组
数组的定义
-
创建数组
dataType[] arrayRefvar(首选)或dataType arrayRefvar[]
dataType[] arrayRefvar=new dataType[arraySize]
-
数组初始化
-
静态初始化
例如:int a[]={1,2,3};
-
动态初始化
例如:int[] a=new int[2];
a[0]=1;
a[1]=2;
-
默认初始化
-
数组的使用
- 拿到下标拿到值
- 增强for循环遍历
- ArraylndexoutofBounds为数组下标越界异常
二维数组
- dataType[] [] arrayRefvar
Arrays工具类
-
使用前先导入Arrays包
import java.util.Arrays
-
Arrays类中有很多关于数组的操作
例如:查找、排序等。
排序算法
- 冒泡排序
- 选择排序
- 插入排序
- 快速排序
- 归并排序
- 希尔排序
- 堆排序
- 基数排序
五、面向对象
类与对象
-
本质
以类的方式组织代码,以对象的形式封装数据
-
类是对象的抽象
-
对象是类的具体
构造方法
- 不能有返回值,方法名和类名一致,如果手动定义了有参构造就必须要手动再加一个无参构造
注:快捷键:Alt+Insert直接生成构造函数。
new 对象
- 栈存放引用
- 堆存放具体对象
封装
- 子类仅可以调用父类public的属性,private的属性可以用set和get方法调用
继承
- 关键字extends
- 子类拥有父类的全部特性
注1:所有的类都默认继承Object(直接或间接)。
注2:Java中只有单继承没有多继承(说的通俗一点,一个儿子只能有一个爸爸,一个爸爸可以有多个儿子)。
注3:父类构造器在子类中是默认调用的,可以不写,子类如果调用父类的构造器,必须在子类构造器的第一行用super()。
注4:如果父类和子类的属性或方法重名,子类中可以用super.调用父类的属性或方法。
注5:方法的重写:非静态方法可以被子类重写,静态方法重写与定义的数据类型有关,且重写时修饰符范围可以扩大,不能缩小(public>protected>default>private)。
多态
-
父类的引用指向子类的对象
例如:Person person=new Student();
-
子类可以调用的方法是自己或继承父类的,父类不能调用子类独有的方法
-
instanceof关键,如果匹配,可以进行类型之间的转换
注1:多态是方法的多态,属性没有多态。
注2:多态存在的条件:(1)有继承关系;
(2)方法要重写;
(3)父类引用指向子类对象;
(4)static、final、private无法重写,所以没有多态。
注3:类型转换:(1)把子类转换为父类,不需要强制转换,可能丢失自己本来的一些方法。
(2)把父类转换为子类,需要强制转换。
修饰符
-
public
-
protected
-
private
-
static
- static静态变量可以由类名直接调用
- 非静态方法可以调用静态方法。静态方法可以调用静态方法,但不可以调用非静态方法
-
final
-
abstract
- 抽象类的定义格式,例如:public abstract class A{}
- 抽象类的所有方法,继承它的子类都必须要实现,除非子类也是抽象类
- 抽象类中方法的定义格式,例如:public abstract void B();
注:抽象方法必须在抽象类中,抽象类中可以写普通方法。
接口
- 关键字interface
- 只能定义方法名
- 子类实现接口,必须实现其中的方法
- 只有一个方法的接口叫做函数式接口,可以使用lambda表达式简化
- 接口比抽象类更抽象
注1:接口中所有定义的方法都是抽象的,定义的属性都是常量(public static final)。
注2:implements关键字用于实现接口,例如:public class A implements B{},其中B为接口。
注3:接口可以多继承。
内部类
- 局部内部类
- 静态内部类
- 匿名内部类
六、异常
Throwable
-
Exception
- 运行时异常
-
Error
- AWT错误
- JVM错误
五个关键字
-
try{}
-
catch(){}
先小后大
-
finally{}
-
throw
- 手动抛出异常,一般在方法中使用
例如:throw new 异常();
-
throws
- 方法抛出异常,假设方法中处理不了这个异常,可以在方法上抛出
例如:public void test()throws 异常{}
注1:捕获异常的代码格式:
try{
}catch(Throwable e){
}finally{
//最后执行的代码
}
注2:(1)finally可以不用;
(2)catch后的括号里写想要捕获的异常类型,位置异常或错误可以用Throwable;
(3)可以有多个catch,但是要把最大的异常写在最后面(Error—>Exception—>Throwable)。
注3:相关快捷键:Ctrl+Alt+T,可以选择生成try、catch、finally。
自定义异常
- 继承Exception类即可