A is-a B extends继承 implements实现

    1.子类继承父类的所有成员(所有成员指的是属性 方法 块) 通过关键字extends
    2.子类的对象可以访问父类中的属性和方法(只有public和protected可以调用 private这种私有的不能调用)
    注意区分继承和访问权限 继承是全部继承 访问权限只有public和protected可以调用
    2.1 构造方法严格意义来说 不算子类继承过来的
    只是单纯的在子类调用构造方法时默认调用父类的构造方法
    2.2 程序块严格意义来说 不算子类继承过来的(子类调用不到 因为程序块没名字)
    程序块子类不能直接调用 子类执行构造方法之前 默认调用了父类的构造方法
    父类的构造方法之前自动执行父类的块
    3.子类可以添加自己独有的属性或方法的
    4.子类从父类中继承过来的方法不能满足子类的需要 (比如动物都能吃饭 但是人类对吃饭的要求更多)
    因此可以在子类中重写(覆盖)父类的方法 重写更多指的是内容上的修改 保留了父类的方法结构
    5.每一个类都有继承类 如果不写extends关键字 则默认继承Object 若写了 则继承后面的
    可以理解为Object类非常重要 是任何一个引用类型的父类(直接或间接的继承Object) 且Object类没有父类
    6.Java中继承是单个存在的(单继承) 每一个类只能有一个继承类(即在extends关键字后面只能写一个类)
    目的是为了让类变得更安全 分不清调用的到底是哪个父类中的方法
    但是可以通过传递的方式实现多继承的效果 后续还会有多实现
    7.继承在内存中的存储形式
    8.关于this和super的使用
    this和super都是指代词 代替的是对象
    this代替的是当前执行方法/属性时的那个对象 不一定是当前类
    super代替的是当前执行方法时的对象的父类
    都能调用一般属性 和 一般方法
    可以放置在类成员(属性 方法 构造方法 程序块)的任意位置
    可以调用构造方法 但是要放在构造方法第一行

    继承内存.png

    1. public class Animal {
    2. public Animal() {
    3. System.out.println("Animal中无参数的构造方法");
    4. }
    5. public Animal(int a) {
    6. System.out.println("Animal中带int参数的构造方法");
    7. }
    8. {
    9. System.out.println("Animal的程序块1");
    10. //在子类调用父类的构造方法时 会先自动执行父类的程序块
    11. //然后再执行父类的构造方法
    12. }
    13. {
    14. System.out.println("Animal的程序块2");
    15. }
    16. //权限修饰符 权限由大到小 public protected 默认不写 private
    17. public void eat(){
    18. System.out.println("动物的吃饭方法");
    19. }
    20. public void sleep(){
    21. System.out.println("动物的睡觉方法");
    22. }
    23. }
    1. public class Person extends Animal{
    2. public Person(){
    3. this.eat();
    4. //子类的构造方法第一行中都会隐藏一行代码 super(); 即调用当前对象的父类的构造方法
    5. //若在这里调用其他类的构造方法 如this(10); 则super();这行代码会被覆盖
    6. System.out.println("Person中无参数的构造方法");
    7. }
    8. public Person(int p){
    9. //隐藏了一行代码 super();
    10. //因为this和super在构造方法中调用另一个构造方法时都要出现在构造方法中的第一行
    11. //所以它们两个在构造方法中调用另一个构造方法时不能同时出现
    12. System.out.println("Person中带int参数的构造方法");
    13. }
    14. {
    15. System.out.println("Person的程序块");//在执行构造方法前都先自动执行程序快
    16. }
    17. //方法重写
    18. public void eat(){
    19. this.study();
    20. super.eat();//this和super调用一般方法时可以同时出现
    21. System.out.println("人类的吃饭方法,色香味俱全");
    22. }
    23. //人类自己独有的
    24. public void study(){
    25. System.out.println("好好学习");
    26. }
    27. }