一、继承的概述 继承:就是子类继承父类的属性和行为,使得子类对象具有与父类相同的属性、相同的行为。 继承的好处: 1.提高代码的复用性,从而提高开发效率 2.提高代码的扩展性 3.学习继承是学习多态的前提条件之一 继承的格式: public class 父类类名{} public class 子类类名extends 父类类名{}
二、继承的特点
继承的特点:1.私有成员;2.静态成员;3.实例变量;4.实例方法;5.构造器 继承的特点1:私有成员 官方结论: (1)子类可以继承父类所有的属性和行为 (2)子类可以继承同包下父类的私有成员 (3)子类不可以继承父类的私有成员 个人总结: 子类可以继承父类的私有属性和行为,因为是私有的,子类无法直接方法,但可以通过set和get进行方法。 继承的特点2:静态成员 个人总结:子类可以继承父类的静态变量和静态方法。
继承的特点3:实例变量 回顾: this关键字的第一种用法: 应用场景: 子类的实例方法中或者构造器中 格式: this.实例变量名 this.实例方法名(实参); 作用: 用来区分同一个类中同名的实例变量和局部变量 含义: 哪个对象调用了this所在的实例方法或者的造器,this就代表哪个对象 super关键字的第一种用法: 应用场景: 子类的实例方法中或者构造器中 格式: super.实例变量名; super.实例方法名(实参); 作用: 用来区分子父类继承关系中子类和父类同名的实例变量或者实例方法 含义: 哪个对象调用了super所在的实例方法或者构造器,super就代表哪个对象的父类对象
继承的特点4:实例方法 个人总结:子类可以继承父类中实例方法。
继承的特点5:构造器 1.子类无法继承父类的构造器(受构造器语法规则的约束); 2.初始化子类成员之前先初始化父类成员; 补充:当一个构造器没有任何的super()和this()时,JVM自动提供一个默认无参的super(),完成父类的成员初始化工作;一旦构造器中含有任何super(实参),JVM不再进行提供。 回顾this关键字的第二种用法 应用场景: 子类的构造器中 格式: this(实参); 含义: 当构造器自身无法完成成员初始化工作时,调用本类中其它构造器完成成员初始化工作。 super关键字: 应用场景: 子类的构造器中 格式: super(实参); 含义: 在初始化子类成员之前,通过super(实参)先初始化父类的成员。 其中,super关键字和this关键字的注意事项: 1.在静态方法或者静态代码块中不能含有super关键字和this关键字; 2.this 和super关键字第二种使用方式必须写在构造器的第一行; 3.this 和super关键字第二种使用方式不可以同时使用;
继承的注意事项: 1.Java不支持多继承,只支持单继承,同时也支持多层继承 2.在程序中子类和父类只是一对相对概念,比如:C类继承B类,B类继承A类C类是B类的直接子类,C类也是A类的子类,B类是A类的直接子类;A类是B类的直接父类,A类也是C类的父类,B类是C类的直接父类。 3.一个类只可以拥有一个直接父类,但是一个父类可以拥有多个直接子类 4.Java中所有的类都拥有一个共同的父类object类
三、方法的重载 方法的重载的含义:在同一个类中或者子父类继承关系中,出现了方法名相同,形参列表不同的现象 方法的重载特点: 1.必须在同一个类中或者子父类继承关系中 2.方法名必须相同 3.形参列表必须不同(至少满足以下一点) a.形参的个数不同 b.形参的数据类型不同 c.形参的数据类型的顺序不同 方法的重写: 在子父类继承关系中(实现关系中)出现了方法名相同,形参列表也相同,且权限修饰符和返回值类型遵循相关规定的现象 方法的重写的特点: 1.必须含有子父类继承关系中(实现关系中); 2.方法名必须相同; 3.形参列表必须相同; 4.子类重写后方法的权限修饰符必须大于等于父类方法的仅限修饰符(); 5.返回值类型; a.当父类方法的返回值类型是void时,子类重写后的方法返回值类型也必须是void,否则编译报错; b.当父类方法的返回值类型是基本数据类型时,子类重写后的方法返回值类型也必须和父类方法的返回值类型一致,否则编译报错; c.当父类方法的返回值类型是引用数据类型(类)时,子类重写后的方法返回值类型也必须和父类方法的返回值类型一致或者子类重写后方法的返回值类型也可以是父类方法返回值类型的子类类型(多态),其它情况编译报错; 注解: 针对类,接口,方法,变量等进行特定的语法约束的作用 方法重写的注解:用于检查子类方法是否符合父类方法重写的条件,如果不符合直接编译报错
方法重写的注意事项: 1.父类的私有方法不可以被子类所重写; 2.非同包下父类的缺省方法不可以被子类所重写;
四、四种权限访问
四种权限访问级别:public > protected > 缺省 > private 四种权限访问级别修饰范围: public protected 缺省 private 在同一个类中 Yes Yes Yes Yes 在同一个包中 Yes Yes Yes No 不同包有继承 Yes Yes No No 不同包无继承 Yes No No No 如果跨模块和项目需要进行数据的访问,使用序列化和反序列化方式。 回顾:封装思想真正意义上的体现其实就是四种权限访问级别 类文件(cLass,interface,enum) 权限:必须是pubLic或者缺省,推荐使用public 成员变量 权限:四种都可以,推荐使用private 自定义常量 权限: 如果是类中自定义常量,四种都可以,推荐使用private 如果是接口中的自定义常量,只能是public 成员方法 权限: 类中的普通方法,四种都可以,推荐使用public 接口中普通方法,只能使用public 无论类中还是接口中抽取的私有方法:只能是private 构造器 权限: 类中的构造器,四种都可以,推荐使用public 如果是工具类,推荐使用private,望面的方法需要修饰为static 如果是枚举类,只能是private 构造器代码块 权限:只能是缺省 静态代码块 权限:只能是缺省 局部变量 权限:只能是缺省
五、抽象
抽象的由来: 1.通过继承关系抽取的父类是多个子类共有的属性和行为,理论上不应该被实例化,实际中可以创建父类对象; 2.通过继承关系抽取的父类的行为方法,需要被子类重写时,写完父类后很容易忘记,理论上如果忘记重写,编译报错 3.通过继承关系抽取的父;类的行为方法,因为需要被子类重写时,父类的方法实体比较多余,理论上,不要写方法实体,交给子类完成,提高开发效率; 抽象的出现就是专门解决上述的3个问题的。 抽象的分类: 1.抽象类; 2.抽象方法; 抽象类的基本格式:public abstract class 父类类名{} 此外,抽象类也被称之为”加强版”父类。 抽象方法的基本格式:修饰符 abstract 返回值类型 方法名(); 抽象方法作用于被重写的方法。 抽象的注意事项: 1.抽象类不可以实例化对象; 2.抽象类中可以没有抽象方法,但是含有抽象方法的类一定是抽象类; 3.抽象类中可以含有构造器,构造器的作用创建子类对象时,初始化父类成员; 4.抽象类的子类必须重写抽象类中所有的抽象方法,否则编译报错,除非该类也是抽象类;
六、final关键字
final关键字:最终的,不可改变的 final关键字修饰内容: 1.修饰类:不能被继承; 2.修饰方法:不能被重写; 3.修饰变量:不能被重新赋值; final关键字修饰类: 1.格式:修饰符 final class {类名}; 2.注意事项:abstract和final二者不可以同时修饰一个类; 3.结论:被final修饰类不可以有子类。
final 关键字修饰方法 1.格式:修饰符 final 返回值类型 方法名 () {} 2.注意:abstract和final二者不可以同时修饰一个方法
final修饰变量 1.格式:修饰符 final 数据类型 变量名 = 初始化值; 2.总结:被final 修饰的变量不可以被重新赋值,其实就是自定义常量; 3.常量名的命名规范:一个单词:单词全部大写;多个单词:单词全部大写,且每个单词同用"_"; final关键字的注意事项: 先定义后赋值; final修饰局部变量:因为局部变量没有默认值,不用特殊考虑; final修饰实例变量: 1.JVM不会让堆内存给其分配默认值; 2.如果是先定义后赋值,需要在所有的构造器中完成该自定义常量的初始化; final修饰静态变量: 1.JVM不会让堆内存给其分配装认值; 2.如果是先定义后赋值,需要在唯一的一个静态代码块中完成该自定义常量的初始化工作;