5.1 继承基础

1. 继承是现有类创建新类的机制,子类复用父类属性与方法,使用extends关键字实现,Java只支持单继承,一个类只能直接继承一个父类,间接实现多继承效果。

2. 子类可以继承父类public、protected、默认访问权限的成员,无法继承private私有成员,私有成员可通过父类的get/set方法访问。

3. 子类构造方法默认第一行隐含super(),调用父类无参构造;父类只有有参构造时,子类必须手动用super(实参)调用父类构造。

5.2 重写与super关键字

1. 方法重写:子类方法和父类方法方法名、参数列表、返回值一致,访问权限不能严于父类;父类private方法不能被重写。

2. super用法:一是super.成员访问父类被重名覆盖的成员变量/方法;二是super()调用父类构造方法,必须放在构造首行。

3. this关键字:指代当前对象,this.成员访问本类成员,this()调用本类其他构造。

5.3 多态

1. 多态分为编译时多态(方法重载)、运行时多态(方法重写),运行多态前提:继承/实现、方法重写、父类引用指向子类对象。

2. 父类引用只能调用父类定义的方法,运行时执行子类重写后的方法;想要调用子类独有方法需要向下强制类型转换。

3. 向上转型:子类对象自动转为父类类型;向下转型需要强转,配合instanceof判断类型避免转型异常。

5.4 抽象类abstract

1. 被abstract修饰的类是抽象类,不能new实例化对象;可以有普通成员变量、普通方法、构造方法、抽象方法。

2. 抽象方法:只有方法声明没有方法体,abstract 返回值 方法名();,包含抽象方法的类必须是抽象类。

3. 普通子类继承抽象类,必须重写全部抽象方法;子类也被abstract修饰则可以不用实现抽象方法。

5.5 接口interface

1. 接口用interface定义,类通过implements实现接口,一个类可以实现多个接口,接口之间用extends多继承。

2. JDK8之前接口:常量(默认public static final)、抽象方法(默认public abstract);JDK8新增default默认方法、static静态方法。

3. default方法:有方法体,实现类可重写可不重写,通过实现类对象调用;static接口方法只能用接口名.方法名()调用,实现类不能继承重写。

4. 函数式接口:只有一个抽象方法的接口,标注@FunctionalInterface注解,可配合Lambda使用。

5.6 内部类

1. 成员内部类:定义在类中方法外,依附外部类对象,可直接访问外部类所有成员;创建格式外部类.内部类 对象 = 外部对象.new 内部类()。

2. 静态内部类:static修饰,只可访问外部类静态成员,创建外部类.内部类 对象 = new 外部类.内部类()。

3. 局部内部类:定义在方法里,仅当前方法可用,作用域局限在方法内部。

4. 匿名内部类:没有类名,实现接口/继承父类,创建对象时直接重写方法,常用作方法参数,简化代码。

5.7 Lambda表达式

1. 作用:简化函数式接口的匿名内部类写法,格式(参数列表)->{方法体}。

2. 简写规则:参数只有一个可省略小括号;方法体只有一行代码可省略大括号和return。

3. JDK8内置四大函数式接口

1. Supplier:无参有返回值,T get();

2. Consumer:有参无返回,void accept(T t);

3. Predicate:有参返回布尔,boolean test(T t);

4. Function:有参有返回,R apply(T t)。

4. 方法引用:::静态方法引用类名::静态方法、实例方法对象::实例方法、构造引用类名::new。

5.8 泛型

1. 泛型<T>:编译期约束数据类型,避免类型转换异常,泛型类、泛型方法、泛型接口三种定义形式。

2. 泛型通配符:?任意类型;? extends E上限,只能E及子类;? super E下限,只能E及父类。

3. 泛型只在编译期生效,运行时泛型被擦除。

5.9 Comparable与Comparator比较接口

1. Comparable:自然排序,类实现该接口重写compareTo(),this-参数升序,集合排序Collections.sort(集合)。

2. Comparator:比较器排序,不修改原类,排序时传入比较器对象重写compare(),o1-o2升序。

5.10 反射

1. 反射在运行期获取类信息,获取Class对象三种方式:对象.getClass()、类名.class、Class.forName("全类名")。

2. Class常用功能

1. 获取构造器:getConstructor()获取公共构造、getDeclaredConstructor()获取所有构造;

2. 创建对象:newInstance()(空参构造),有参构造用构造器对象new实例;

3. 获取成员变量:getField()公共属性、getDeclaredField()全部属性,setAccessible(true)关闭权限校验;

4. 获取成员方法:getMethod()公共方法、getDeclaredMethod()全部方法,invoke(对象,参数)执行方法。

5.11 枚举类enum

1. enum定义枚举,枚举常量写在类首行,常量本质是静态常量对象。

2. 枚举自带ordinal()获取序号、values()遍历所有枚举常量,枚举不能被继承。

5.12 Java注解

1. 注解是代码标注信息,内置注解:@Override重写、@Deprecated过时、@SuppressWarnings压制警告。

2. 元注解:修饰自定义注解,@Retention生命周期、@Target注解作用位置。

5.13 注解Annotation

1. 自定义注解使用@interface关键字定义,注解参数格式:类型 参数名() default 默认值;,注解参数不能抛异常、参数类型限定为基本类型、String、枚举、注解、对应类型数组。

2. 四大元注解(用来修饰自定义注解)
1)@Target:限定注解标注位置,取值为ElementType枚举(类、方法、成员变量、构造器、局部变量等)。
2)@Retention:设置注解生命周期,RetentionPolicy三个枚举:SOURCE源码期、CLASS字节码期、RUNTIME运行期;RUNTIME级别注解可通过反射获取。
3)@Documented:被修饰的注解会生成到API文档。
4)@Inherited:注解具备继承性,子类可继承父类身上的该注解。

3. 注解解析:通过反射获取类/方法/属性上注解对象,getAnnotations()获取全部注解、isAnnotationPresent(注解.class)判断是否标注指定注解、getDeclaredAnnotations()获取本元素直接注解,拿到注解对象后调用注解方法获取参数值。

5.14 反射结合JDBC实操

1. 反射+JDBC核心思路:数据表字段名和实体类成员变量名保持一致,利用反射动态获取类名、属性名,拼接通用SQL语句,实现一张通用DAO工具类,不用为每张表单独写查询代码。

2. 实现步骤:
1)DBFactory工厂类:封装JDBC驱动加载、获取数据库连接的代码。
2)实体类:属性名和数据表字段一一对应,提供get/set方法。
3)通用查询方法:传入实体类Class对象和主键id,反射提取类名作为表名、属性名作为字段名,拼接select语句;执行SQL后通过反射实例化实体对象,给成员变量赋值并返回。

5.15 本章习题核心知识点

1. Java继承规则:Java只支持单继承(一个子类只能直接继承一个父类),可以多层继承;子类拥有父类非私有成员,不能直接访问父类private属性。

2. 接口与抽象类:接口多实现,抽象类单继承;接口默认方法、抽象方法,抽象类可包含普通变量、构造、抽象方法。

3. 多态实操:父类引用指向子类对象,编译看父类、运行看子类重写方法。

5.16 枚举补充

1. 枚举常量定义在类首行,多个常量逗号分隔;枚举构造方法默认私有、不能手动修改访问权限;枚举可拥有成员变量、普通方法。

5.17 本章整体补充要点

1. 内部类使用场景:封装回调、简化匿名实现;Lambda只适配函数式接口。

2. 泛型擦除:编译后泛型被消除,运行不存在泛型类型;通配符上限用于读取数据、下限用于存入数据。

3. 两种比较器:Comparable写在实体类内部、自然排序;Comparator单独建类、临时排序,不改动原实体代码。

4. 反射权限:setAccessible(true)绕过private权限校验,暴力访问私有属性和方法。

更多推荐