2020.12.30(晨测)
1、三大修饰符可以修饰什么以及修饰后的特点
概念 | 修饰内容 | 语法 | 特点 | |
abstrac | 抽象的 似是而非 像而不是 | 方法(抽象方法) 不完整的方法---没有方法实现! | 访问修饰符 abstract 返回值类型 方法名(形参列表); 或 abstract 访问修饰符 返回值类型 方法名(形参列表); | 1. 抽象方法没有方法实现,用;代替,表示结束 2. 供子类去实现(覆盖) |
类(抽象类) | abstract class 类名{} | 1. 不能实例化,即不能创建对象 2. 可以让子类继承,充当父类引用,强行使用多态 3. 有构造方法,供子类使用 | ||
static | 静态的 | 属性(静态属性\类变量\静态变量) | 访问修饰符 static 数据类型 属性名; 或 | 1.全类共有,不独属于某一个对象---被所有根据该类创建出来的对象共享 2.可以使用类名调用 : 类名.静态属性名; |
方法(静态方法) | 访问修饰符 static 返回值类型 方法名(形参列表){} 或 static 访问修饰符 返回值类型 方法名(形参列表){} | 1.可以通过类名直接调用 类名.静态方法名(实参); 2.静态方法中,不能访问本类的非静态成员(普通属性\普通方法) 3.静态方法中不能使用this和super 4.静态方法只能被静态方法覆盖,但没有多态!引用什么类型,则调用什么类型的静态方法 | ||
初始代码块(静态代码块) | static{ //代码 } | 特点: 只会在类加载的时候执行一次 作用: 后期常用于配置文件的读取 | ||
final | 最终的 最后的 不可变的 | 属性/局部变量(常量) | final 数据类型 变量名; | 一经赋值,不可改变 |
方法(最终的方法) | final 返回值类型 方法名(形参列表){} | 只能被继承,不能被覆盖 | ||
类(最终的类(断子绝孙类) ) | final class 类名{} | 不能被继承 |
2、什么是类加载,类加载的时机是什么时候?
当JVM(java虚拟机)第一次使用某一个类的时候,根据ClassPath(类路径)找到该类的.class文件,读取该.class文件,将类的全部信息读取到JVM中的过程就是类加载
类加载的时机:
1. 第一次创建对象的时候
2. 创建子类对象,会引发父类的类加载
3. 第一次使用静态成员(静态属性\静态方法)时
4. 使用Class.forName("类的全限定名");
注意: 声明引用,不会引发类加载
2020.12.31(周测)
1、方法重载和方法覆盖的区别和要求。
定义 | 语法要求 | |
方法重载 | 一个类中允许定义多个同名的方法 | 1 方法名必须相同 2 形参列表必须不同 3 返回值类型、修饰符、异常不做限定 |
方法覆盖 | 子类对父类的方法进行重新实现,也叫方法重写 | 1 方法三要素(返回值类型、方法名、形参列表)必须相同 2 访问修饰符相同或者更宽 3 子类上抛的异常不能比父类更多或 |
2、抽象类和抽象方法的联系
1.抽象类中可以有抽象方法和普通方法。
2.抽象类中不一定有抽象方法,但是有抽象方法的类一定是抽象类。
3.继承抽象类的子类必须要将父类中的所有抽象方法进行重新实现,否则自身也将变成抽象类。
注意:继承抽象类的子类不想成为抽象类,必须要实现的父类中所有的抽象方法,而不是实现父类中的所有方法。
3、请简述静态成员(静态属性、静态方法)的调用方式以及静态方法的使用要求。
调用方式:1、静态属性: 类名.静态属性名; 2、静态方法:类名.静态方法名(实参);
静态方法的使用要求:
1.不能访问本类中的费静态成员(普通方法、普通属性)
2.不能使用this和super
3.只能被静态方法覆盖,没有多态。引用什么类型,则调用什么类型的方法。
4、简述接口和抽象类的区别。
抽象类 | 接口 | |
关键字 | abstract class、extends | interface、implements |
属性 | 没有要求 | 公开静态常量(public static final 属性名;) |
方法 | 可以有抽象方法,也可以没有过抽象方法 | JDK8.0之前:必须是公开抽象方法(public abstract 方法名(形参列表){ // 方法实现}) JDK8.0之后可以定义默认、静态、私有方法 默认方法:default 返回值类型 方法名(形参列表){ //方法实现 } 静态方法:static 返回值类型 方法名(形参列表){ //方法实现 } 私有方法:private 返回值类型 方法名(形参列表){ //方法实现 } |
构造方法 | 具有构造方法 | 没有构造方法 |
继承性 | 单继承 | 多继承 |
2021.1.5(晨测)
1、equals和==的区别。
== :是java中的一个二元操作符
1.用于比较基本数据类型时,比较的是两个变量的值是否相等
2.用于比较引用类型时,比较的是两个对象的地址是否相同
equals:是Object类中的一个方法,适用于所有对象。
1. 未重写前,实际仍是==的比较方式
2.重写后,用于引用对象的比较,比较的是两个对象的内容是否相同
注意:如果没有对该方法进行覆盖的话,调用的仍然是Object类中的方法,而Object中的equals方法返回的却是==的判断。
2021.1.6(晨测)
1、List、Set和Map集合的特点
List:存储Object类型的对象,元素有序、有下标(0~size()-1)、元素可重复
Set:存储Object类型的对象,元素无序、无下标、元素不可重复
Map:存储Object类型的键值对
1. 键: 无序\无下标\元素不可重复 当键的类型为自定义类型,必须重写equals()与hashCode()方法
2. 值: 无序\无下标\元素可重复
2、ArrayList、LinkedList和Vector的区别。
出现时JDK的版本 | 底层实现 | 特点 | |
ArrayList | JDK1.2 | 数组实现 | 线程不安全,效率高;增删慢,查询快 |
LinkedList | JDK1.2 | 链表实现 | 线程不安全,效率高;增删快,查询慢 |
Vector | JDK1.0 | 数组实现 | 线程安全,效率低;增删慢,查询快 |
3、泛型的作用。
泛型: JDK5.0出现, 当定义数据类型时,若不明确具体类型,可以先暂时使用类型变量(泛型类型标识符)代替,等实际调用时,再传入确定类型;若没有明确传入数据类型,默认为Object类型。
2021.1.7(周测)
1、HashSet底层是如何使用数组和链表存储对象的?是如何去除重复的?
当向HashSet中存储对象时,会先调用对象的hashCode()方法,获取该对象的哈希码,使用哈希码%数组长度,得到数组下标;将该对象存储到该下标下,若此下标下已经存在对象,则调用equals()方法判断对象内容是否相同,相同则认为是同一对象,该对象直接舍弃;若不相同,则是不同对象,以链表形式添加到后面;注意:若链表上存在多个对象,需要使用equals()与每一个对象判断是否是同一对象!!!
2、String类中的常用方法(17个)。
1. int length() 返回当前字符串长度
2. char charAt(int index) 返回当前字符串index下标对应的字符
3. boolean contains(String s) 判断当前字符串中是否包含s
4. boolean startsWith(String prefix) 判断当前字符串是否以prefix开头
5. boolean endsWith(String suffix) 判断当前字符串是否以suffix结尾
6. equalsIgnoreCase(String anotherString) 比较字符串内容,忽略大小写
7. int indexOf(String str) 返回str在当前字符串中第一次出现的下标
8. int lastIndexOf(String str) 返回str在当前字符串中最后一次出现的下标
9. boolean isEmpty() 判断当前字符串是否为空串,是返回true 否则返回false
10. replace(String oldStr,String newStr) 将当前字符串中的oldStr替换为newStr
11. String[] split(String regex) 根据regex将当前字符串分割成字符串数组
12. String substring(int beginIndex) 根据beginIndex下标开始,从当前字符串中,截取子串 包含beginIndex下标
13. String substring(int beginIndex, int endIndex) 从当前字符串中截取,beginIndex到endIndex之间的子串
14. char[] toCharArray() 将当前字符串转为char数组
15. String toLowerCase() 将当前字符串转为全小写
16. String toUpperCase() 将当前字符串转为全大写
17. String trim() 删除当前字符串开头和末尾的空格,不会删除中间的空格
2021.1.8(周测)
1、异常的分类及其各自的特点。
Throwable:是所有异常(Exception)和错误(Error)的总父类,异常又可以分为运行时异常(Runtime Exception)和非运行时异常(非Runtime Exception)。
1.Error(错误):无法避免,无法处理,一般都是底层硬件出问题。
2.Exception(异常):异常的总父类,分为运行时异常(Runtime Exception)和非运行时异常(非Runtime Exception)。
运行时异常(Runtime Exception):编译通过,运行报错,可以处理,也可以不处理,尽量避免。
非运行时异常(非Runtime Exception): 编译报错,必须处理。
2、throw和throws 的区别。
throw是手动产生异常的关键字(语法:throw new 异常名(); ),该语句类似于return语句,可以终止程序运行,所以后面不能有其他代码。
throws是消极处理异常的关键字(throws 异常名1,异常名2,...),该语句添加在方法的形参列表之后(访问修饰符 返回值类型 方法名(形参列表) throws throws 异常名1,异常名2,...{} )
3、try\catch语句的两种执行流程
1. try中抛出了异常,被下面的catch语句捕获,执行catch语句块中的异常处理信息,最后执行下面的finally中的语句块。
2. try中抛出了异常,没有被下面的catch语句块捕获到,直接执行finally中的语句块
注意:无论何种情况下,finally中的代码块都是会被执行的,finally中通常用来进行资源的释放。
未完待更》》》》》》》》》》》》》》》》》