JavaSE
1、java基本概念
1.1、类和对象
类:具有相同属性和方法的一组对象的集合,类是对象的抽象,对象是类的具体
类图:用于分析和设计类
1.2、方法和方法的重载
- 形参用来约束变量类型,参数名可以随便取
- 引用基本类型(能点出属性和方法)和基本数据类型
1.2.1、方法传参
参数传递为基本数据类型 | 参数变化不会保留,参数传值(传递一个副本过去) |
---|---|
参数传递为引用数据类型 | 参数变化会保留 ,参数传址(操作的是同一个对象) |
参数可以传引用数据类型数组
1.3、封装(面向对象的三大特征之一)
- 为什么使用封装:结束属性随意访问,不合理的赋值
- 将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问
封装的两个原则
- 把尽可能多的东西藏起来,对外提供便捷的接口
- 把所有的属性藏起来
优点:
- 防止错误修改属性
- 有助于系统之间的松耦合,提高系统的独立性
- 提高软件的可重用性
- 降低了构建大型系统的风险
1.4、static
1.4.1、static变量
类变量(静态变量:被static修饰的变量)
- 在内存中只有一个拷贝
- 在类内部,可以在任何方法直接访问静态变量
- 在其他类,可以直接通过类名访问
实例变量
- 没有被static修饰的变量
- 每创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响
- 可以new一个实例去访问这个变量
1.4.2、static代码块
- jvm加载类时,加载静态代码块
- 如果有多个静态块,按照顺序加载
- 每个静态代码块只会被执行一次
1.5、继承
将重复操作的代码提取到父类
子类继承父类哪些东西:
- 继承public和protected修饰的属性和方法,不管子类和父类是否在同一个包里
- 继承默认权限修饰符修饰的属性和方法,但是子类和父类必须在同一个包里
使用super关键字,代表父类对象
- 在子类构造方法中调用且必须是第一句
- 不可以范文父类中定义private的属性和方法
1.5.1、继承条件下的构造方法调用规则
- 子类构造方法没有通过super显式调用父类的有参构造方法,也没有通过this显式调用自身其他构造方法,系统默认调用父类的无参构造方法
- 子类构造方法通过super显式调用父类的有参构造方法,执行父类相应的构造方法,而不执行父类无参构造方法
- 子类构造方法通过this显式调用自身的其他构造方法,在相应构造方法中应用以上两条规则
单根继承
访问父类的父类成员,super代表的是所有父类
java只支持单根继承
一个类只有一个直接父类,却有很多间接父类
1.6、方法重写
规则:
-
方法名相同
-
参数列表相同
-
返回值类型相同或者其子类
-
访问权限不能严于父类(里氏代换原则:子类可以扩展父类的功能,但不能改变父类原有的功能)
-
父类的静态方法不能被子类覆盖为非静态方法,父类的非静态方法不能被子类覆盖为静态方法
-
子类可以定义与父类同名的静态方法,以便在子类中隐藏父类的静态方法在静态方法中无法使用super
-
父类的私有方法不能被子类覆盖
-
不能抛出比父类方法更多的异常
1.7、Object类
object类经常被重写的方法
toString() | 返回当前兑现本身的有关信息,按字符串对象返回 |
---|---|
equals() | 比较两个对象是否是同一个对象,是则返回true |
hashCode() | 返回该对象的哈希代码值 |
getClass() | 获取当前对象所属的类信息,返回class对象 |
1.7.1、equals()方法
== | equals() |
---|---|
简单数据类型,直接比较值 | / |
引用数据类型,比较两者是否为同一对象 (内存地址是否一样) | 默认为比较两者是否为同一对象 (内存地址是否一样) |
示例1:new两个实体类对象,分别使用==和equals方法
Employee e1 = new Employee();
Employee e2 = new Employee();
System.out.println(e1==e2);
System.out.println(e1.equals(e2));
结果如下:
false
false
原因:内存地址不一样,此时的==和equals都是比较地址
示例2:new一个e1对象,然后赋值给e2
Employee e1 = new Employee();
Employee e2 = e1;
System.out.println(e1==e2);
System.out.println(e1.equals(e2));
结果如下:
true
true
原因,他们在地址里指向同一个对象
1.7.1.1、重写equals()方法
告诉计算机一个新的规则,只要值相同,就认为是同一对象
public boolean equals(Object obj) {
if(this==obj) {
return true;
}
if(!(obj instanceof Student){
return false;
}
}
1.8、多态?
具体实现
- 使用父类作方法的形参,是java中实现和使用多态的主要方法
- 使用父类作方法的返回值,也是java中实现和使用多态的主要方式
动态绑定
- 实例方法(动态绑定机制):在调用时与引用变量实际引用对象绑定,调用重写后的方法,由运行时的java的jvm决定
- 静态方法(静态绑定机制):不管返回的具体,调用的静态方法与引用变量所声明类型绑定,编译阶段就进行了绑定
向上转型和向下转型
1.9、接口
- 接口中的成员变量:默认都是public static final的,必须显式初始化
- 接口中的方法:默认都是public abstract的,除了成员变量和方法,不能包含其它
- 接口没有构造方法,不能被实例化
- 一个接口不能实现另一个接口,但是可以继承多个接口
- 一个类必须实现接口抽象方法(implements),除非这个类也是抽象类
接口和抽象类的区别
相同点:
- 代表系统的抽象层
- 都不能被实例化
- 都能包含抽象方法,用于描述系统提供的服务,不必具体实现
不同点:
- 在抽象类中可以为部分方法提供默认实现,而接口中只能包含抽象方法
- 一个类只能继承一个直接父类,但是可以实现多个接口
- 已存在的继承树,可以方便的抽取接口,但是抽取的抽象类不容易
1.10、异常
java编程语言使用异常处理机制为程序提供了错误处理的能力
如果程序出现了异常——对异常进行处理——处理完毕,程序继续进行
技巧:在异常上面Ctrl+e可以看见部分异常
如果抓住了异常,就可以进行异常处理,程序可以继续进行下去
- 无异常,try-catch后面的代码
- 有异常,而且恰好和catch后面的异常类型匹配:try-catch里面的代码-catch后面的代码
如果没有抓住异常,程序就会中断
- 无异常:try-catch后面的代码
- 有异常:而且恰好和catch后面的异常类型匹配:try-catch里面的代码-catch后面的代码
- 有异常:但是和catch后面的异常类型不匹配:try-中断
常见的异常处理
异常类型 | 说明 |
---|---|
Exception | 异常层次结构的父类 |
ArithmeticException | 算术错误情形,如0做除数 |
ArrayIndexOutOfBoundsException | 数组下标越界 |
NullPointerException | 尝试访问null对象成员 |
ClassNotFoundException | 不能加载所需的类 |
IllegalArgumentException | 方法接收到非法参数 |
ClassCastException | 对象强制类型转换出错 |
NumberFormatException | 数字格式转换异常 |
finally和return(先执行finally再执行return)
- finally唯一不执行的情况是exit(1)
多重catch块:因为一段程序可能出现多种类型的异常
- 排列catch语句的顺序,先子类后父类(先小后大)
- 发生异常时按顺序逐个匹配
- 只执行第一个与异常类型匹配的catch语句
throw和throws异常
throw | throws |
---|---|
生成并抛出异常 | 声明方法内抛出异常 |
位于方法体内部,可作为单独语句使用 | 必须跟在方法参数列表后面,不能单独使用 |
抛出一个异常对象,且只能是一个 | 声明抛出异常类型,可以跟多个异常 |
异常处理原则:
- 异常只能用于非正常情况
- 不要将过于庞大的代码块放在try中
- 在catch中制定具体的异常类型
- 需要对铺获的异常做处理