继承关系下构造方法的访问特点
清心咒 : 子类对象要加载优先加载父类对象; //子类要加载优先加载父类 -> 也对 构造方法的小秘密: 1. 每一个构造方法的内部第一句代码 默认隐藏着一句 : super(); 2. 在构造方法内调用其他构造方法的 这句代码必须是构造方法的第一句有效代码 3. super(实参) : 调用父类的含参构造 4. 如果你在构造方法的第一句代码中调用了其他任何一种构造方法,默认赠送的super()就不送了 5. 一个构造方法内不可以出现2次调用其他构造方法 6. 一个构造方法内不可以调用自己 7. 子类中的构造方法必须有一个构造是用来加载父类对象
this 和 super 的使用
this: 本类对象的引用 this.成员变量 : 打破局部位置的约束,强制访问本类成员位置上的变量 this.成员方法() : -> 无意义的 所有的方法都是成员方法 每一次调用本类中的方法,其实前方都隐藏着 this. this() : 调用本类的无参构造方法 this(实参) :调用本类的含参构造方法 super: 本类父类对象的引用 super.成员变量 : 打破本类位置的约束,强制访问本类父类成员位置上的变量 super.成员方法() : 打破本类位置的约束,强制调用本类父类的成员方法 super() : 调用本类父类的无参构造 super(实参) : 调用父类的含参构造
继承的好处和弊端
继承的好处: 1.把子类的共性(共同的属性和共同的行为)抽取到父类中 -> 提高了代码的复用性 // 从子类往父类看 2.父类约束子类的行为 //从父类往子类看 继承的弊端: 高内聚低耦合 内聚: 自己独立完成功能的能力 耦合: 依赖关系 需要继承的时候果断继承,继承利大于弊! 00
继承知识点的题型讲解
抽象类
抽象类 : 比类更抽象的类叫抽象类 原因: 抽象类中可能有抽象方法 抽象类为什么存在 : 严格约束子类的行为 abstract : 抽象的 adj. 可以用来修饰类: 类变抽象类 可以用来修饰方法 : 方法变成抽象方法 格式: public abstract class 类名{ }
抽象方法
抽象方法 : 没有方法体的方法 格式: public abstract 返回值类型 方法名(形参列表); 作用: 约束子类的行为,要求子类实现抽象方法!! (或者子类自己变成抽象类 抽象方法只能在抽象类或者接口中)
抽象类的成员
//自定义常量 : 可以有,也可以有多个 1. 成员变量 : 可以有,也可以有多个 2. 构造方法 : 可以有,也可以有多个 3. 普通成员方法 : 可以有,也可以有多个 4. 静态成员方法 : 可以有,也可以有多个 5. 抽象方法 : 可以有,也可以有多个
抽象类的使用
虽然抽象类中有构造方法但是抽象类却不可以直接创建对象!! 第一种使用方式: //最常用 1. 找一个子类,让子类继承抽象父类 2. 在子类中重写父类中的所有抽象方法.选择性的重写父类的普通方法 3. 在测试类中,创建子类的对象,使用子类对象调用 子类重写的抽象方法或者父类的非私有非抽象的功能 第二种使用方式: 1. 找一个子类,让子类继承抽象父类 2. 让子类自己也变成抽象类 3. 让子类的子类去实现父类和爷爷类中的所有抽象方法 4. 创建子类的子类对象,调用功能
接口 interface
接口 interface : Java 三大引用数据类型中的一种; 老程序员的常识: 如果一个抽象类中只有抽象方法,那么我们不会去定义类而是去定义接口
接口的思想
1. 对外提供规范 -> 规范的特别好,带来很多便捷 2. 对子类的功能提供了功能的拓展 对外提供规范最重要的因素 : 公开! -> public : 接口板块中最为重要的关键字!
接口的定义格式
格式: public interface 接口名{//接口名 : 和类的命名规范一致 大驼峰 //定义一个接口也是定义一种引用数据类型 }
接口和类之间的关系
类与类之间 : 继承关系 -> 单一继承,多层继承 类与抽象类之间 : 继承关系 -> 单一继承,多层继承 抽象类/类与接口之间 : 实现关系 (implements) -> 多实现 接口与接口之间 : 继承关系 -> 多继承 interface Uncle1Mother{ } interface Uncle1Father{ } //接口于接口之间是继承关系,多继承 interface Uncle1 extends Uncle1Mother,Uncle1Father{ } interface Uncle2{ } class Fu{ } //实现类 多实现 //一个类继承一个父类实现多个父接口的格式 class Son extends Fu implements Uncle1,Uncle2 { }
final
final : 最终的 adj. 修饰 : 类 class , 成员变量 , 成员方法 , 局部变量 final 修饰的类 : 没有子类 final 修饰成员变量 : 不能修改 -> 常量 自定义常量 : 标准格式 : public static final 数据类型 常量名 = 初始化值;//自定义常量一定要给值 //自定义常量的命名方式: 全部大写,多个单词之间用_分隔 -> JAVA_HOME final 修饰成员方法 : 不能被重写 final 修饰局部变量 : 不能修改 -> 变成了局部位置的常量 //实时final adj : public(权限修饰符),static,final,abstract 形容词的先后顺序是可以修改的 static public void main(String[] args) { }
JDK_8版本之前的接口的成员(重要)
JDK8版本之前的接口成员: 可以什么都没有 自定义常量 : 接口中没有成员变量,定义出来的成员变量都是自定义常量 接口中的成员变量默认被 public static final 修饰 -> 一定是自定义常量 抽象方法 : 可以有,也可以有多个 接口中的成员方法默认被 public abstract 修饰 不可以有的: 1. 成员变量 : 接口中不可以有成员变量 2. 构造方法 : 接口中不可以有构造方法 -> 不能直接创建接口对象 3. 普通成员方法 : 接口中不可以有成员方法 4. 静态成员方法 : 接口中不可以有静态成员方法
JDK_8版本的接口的成员(理解)
JDK8版本的接口成员: 可以什么都没有 自定义常量 : 接口中没有成员变量,定义出来的成员变量都是自定义常量 接口中的成员变量默认被 public static final 修饰 -> 一定是自定义常量 抽象方法 : 可以有,也可以有多个 接口中的成员方法默认被 public abstract 修饰 -------------------------------新增成员--------------------------- 默认方法 : 可以有多个 格式: public default 返回值类型 方法名(形参列表){ //方法体 } 默认方法默认被 public 修饰 1. 默认方法可以选择性重写(实现类可以不重写父接口中的默认方法) 2. 默认方法有一种场景下是必须重写的 -> 当多个父接口中出现了相同声明的默认方法,实现类必须重写父接口中的默认方法! 默认方法的调用方式: 使用实现类对象调用接口中默认方法 静态方法 : 可以有多个 格式: public static 返回值类型 方法名(形参列表){ //方法体 } 静态方法默认被 public 修饰 静态方法就没有重写的概念! 静态方法的调用格式 : 只能用接口名调用!! 不可以有的: 1. 成员变量 : 接口中不可以有成员变量 2. 构造方法 : 接口中不可以有构造方法 -> 不能直接创建接口对象 3. 普通成员方法 : 接口中不可以有成员方法
JDK_9版本的接口成员(了解)
JDK9版本的接口成员: 可以什么都没有 自定义常量 : 接口中没有成员变量,定义出来的成员变量都是自定义常量 接口中的成员变量默认被 public static final 修饰 -> 一定是自定义常量 抽象方法 : 可以有,也可以有多个 接口中的成员方法默认被 public abstract 修饰 默认方法 : 可以有多个 格式: public default 返回值类型 方法名(形参列表){ //方法体 } 默认方法默认被 public 修饰 1. 默认方法可以选择性重写(实现类可以不重写父接口中的默认方法) 2. 默认方法有一种场景下是必须重写的 -> 当多个父接口中出现了相同声明的默认方法,实现类必须重写父接口中的默认方法! 默认方法的调用方式: 使用实现类对象调用接口中默认方法 静态方法 : 可以有多个 格式: public static 返回值类型 方法名(形参列表){ //方法体 } 静态方法默认被 public 修饰 静态方法就没有重写的概念! 静态方法的调用格式 : 只能用接口名调用!! -------------------------------新增成员--------------------------- 私有方法: 不可以有的: 1. 成员变量 : 接口中不可以有成员变量 2. 构造方法 : 接口中不可以有构造方法 -> 不能直接创建接口对象 3. 普通成员方法 : 接口中不可以有成员方法
如何使用接口
接口中是没有构造方法的,所以不可以创建接口对象 1. 创建一个普通类 (接口的实现类) 2. 让实现类实现父接口 (implements) 3. a. 要么让实现类重写父接口中所有的抽象方法 b. 要么让实现类变成抽象类,让实现类的子类重写接口中的抽象方法 4. 在测试类,创建实现类的对象,并使用实现类的对象调用重写后的方法