1.引入dog类public class Dog { public String name; public int age; public void eat(){ System.out.println(this.name正在吃饭); } public void bark(){ System.out.println(this.name正在汪汪汪); }cat类public class Cat { public String name; public int age; public void eat(){ System.out.println(this.name正在吃饭); } public void mew(){ System.out.println(this.name正在喵喵喵); }继承所针对的就是类与类之间的对共性进行抽取从而达到代码的复用。我们发现上面两个类有很多共同的部分继承就是把两个类相同的部分抽离出来放到一个公共类当中public class animal{ public String name; public int age; public void eat(){ System.out.println(this.name正在吃饭); } }将来要用这个公共的东西就是继承那这个公共的类就叫父类/基类/超类原来定义的小猫和小狗就是子类/派生类。这时候只需要在小猫小狗的类里面加上extends Animal就可以正常使用了2.继承概念是⾯向对象程序设计使代码可以复⽤的最重要的⼿段它允许人们在保持 原有类特性的基础上进⾏扩展增加新功能这样产⽣新的类称派⽣类。继承呈现了⾯向对象程序 设计的层次结构体现了由简单到复杂的认知过程。继承主要解决的问题是共性的抽取实现代码复⽤。继承最⼤的作⽤就是实现代码复⽤还有就是来实现多态。3.继承的语法修饰符 class ⼦类 extends ⽗类 { // ... }注意1. ⼦类会将⽗类中的成员变量或者成员⽅法继承到⼦类中2. ⼦类继承⽗类之后必须要新添加⾃⼰特有的成员体现出与基类的不同否则就没有必要继承了4.⽗类成员访问①⼦类中访问⽗类的成员变量创建一个父类public class Base { public int a; public int b; }1.⼦类和⽗类不存在同名成员变量public class Derived extends Base{ public int c; public void method(){ this.a 10; this.b 20; this.c 30; System.out.println(this.a);//访问base继承下来的a System.out.println(this.b);//访问base继承下来的b System.out.println(this.c); } public static void main(String[] args) { Derived derived new Derived(); derived.method(); }2.⼦类和⽗类成员变量同名public class Base { public int a 8; public int b; }public class Derived extends Base{ public int a 9; public int c; public void method(){ //this.a 10; this.b 20; this.c 30; System.out.println(this.a);//打印9 System.out.println(this.b); System.out.println(this.c); } public static void main(String[] args) { Derived derived new Derived(); derived.method(); }在⼦类⽅法中或者通过⼦类对象访问成员时如果访问的成员变量⼦类中有优先访问⾃⼰的成员变量。如果访问的成员变量⼦类中⽆则访问⽗类继承下来的如果⽗类也没有定义则编译报错。如果访问的成员变量与⽗类中成员变量同名则优先访问⾃⼰的。②⼦类中访问⽗类的成员⽅法子类和父类的方法构成了重载通过⼦类对象访问⽗类与⼦类中不同名⽅法时优先在⼦类中找找到则访问否则在⽗类中找 找到则访问否则编译报错。通过派⽣类对象访问⽗类与⼦类同名⽅法时如果⽗类和⼦类同名⽅法的参数列表不同(重载)根 据调⽤⽅法适传递的参数选择合适的⽅法访问如果没有则报错5.super关键字Java提供了super关键字该关键字主要 作⽤在⼦类⽅法中访问⽗类的成员。总结super可以访问⽗类的成员变量super可以访问⽗类的成员⽅法super还可以调⽤⽗类当中指定的构造⽅法注意事项1. 只能在⾮静态⽅法中使⽤。2. 在⼦类⽅法中访问⽗类的成员变量和⽅法。6.子类构造方法当在构造完子类之前先要帮父类进行构造public class Animal { super(name,age);//必须放在第一行 }当我们在构造⼦类对象的时候需要先调⽤基类构造⽅法然后执⾏⼦类的构造⽅法。所 以我们需要在⼦类对象构造完成之前先帮助⽗类对其中的成员进⾏初始化。注意事项通过super(参数)的形式可以调⽤⽗类指定的构造⽅法super()的形式只能出现在⼦类的构造⽅法当中且必须在第⼀⾏当⽗类的构造⽅法是不带参数的构造⽅法且只有这⼀个的情况下默认会添加⼀个super()1.构造子类的时候先执行完父类的构造方法再执行完子类的构造方法2.若⽗类显式定义⽆参或者默认的构造⽅法在⼦类构造⽅法第⼀⾏默认有隐含的super()调⽤即调⽤基类构造⽅法3.如果父类的构造方法不止一个在子类的构造方法里面必须使用super指定掉哪个4.super必须在第一行5.super(...)只能在⼦类构造⽅法中出现⼀次并且不能和this同时出现6.super()只能出现在子类的构造方法中如果我们写了一个类没有显示说明继承谁默认继承Object这个类7.super和this相同点1.都是Java关键字2.只能阿紫类的非静态方法中使用用来访问非静态成员方法和字段3.在构造方法中调用时必须时构造方法中的第一条语句并且不能同时存在不同点1.this是当前对象的引⽤当前对象即调⽤实例⽅法的对象super相当于是⼦类对象中从⽗类继承下来部分成员的引⽤2.在⾮静态成员⽅法中this⽤来访问本类的⽅法和属性super⽤来访问⽗类继承下来的⽅法和属性3.在构造⽅法中this(...)⽤于调⽤本类构造⽅法super(...)⽤于调⽤⽗类构造⽅法两种调⽤不能 同时在构造⽅法中出现4.构造⽅法中⼀定会存在super(...)的调⽤⽤⼾没有写编译器也会增加但是this(...)⽤⼾不写则没 有8.继承关系上代码块等的初始化顺序①回顾之前的初始化顺序1. 静态代码块先执⾏并且只执⾏⼀次在类加载阶段执⾏2. 当有对象创建时才会执⾏实例代码块实例代码块执⾏完成后最后构造⽅法执⾏②继承关系上的执⾏顺序顺序是1.父类的静态2.子类的静态3.父类的实例4.父类的构造5.子类的实例6.子类的构造第二次执行第⼆次实例化⼦类对象时⽗类和⼦类的静态代码块都将不会再执⾏静态的只会被执行一次9.访问修饰限定符-protected关键字①private关键字如果被 private 关键字修饰该类当中成员变量成员⽅法等只能在当前类当中使⽤②不加任何的关键字如果不加任何的关键字修饰该类当中成员变量成员⽅法等表⽰默认权限默认权限代表的也是包访 问权限意味着只能在当前包当中使⽤③protected关键字如果被 protected 关键字修饰该类当中成员变量成员⽅法等表⽰要么只能在同⼀个包中的类中进 ⾏访问要么在不同包中只能通过在继承关系上的⼦类对象来访问。不同包子类情况下不能通过父类对象的引用来访问protected受保护的成员变量因为限制主要的交点是子类想办法通过子类的形式访问。super访问也是可以的。④public 关键字如果被 public 关键字修饰该类当中成员变量成员⽅法等表⽰该成员变量和成员⽅法是公开的。什么时候下⽤哪⼀种呢?我们希望类要尽量做到封装,即隐藏内部实现细节,只暴露出必要的信息给类的调⽤者. 因此我们在使⽤的时候应该尽可能的使⽤⽐较严格的访问权限.例如如果⼀个⽅法能⽤private,就尽 量不要⽤public. 另外,还有⼀种简单粗暴的做法:将所有的字段设为private,将所有的⽅法设为public.不过这种⽅式属于是对访问权限的滥⽤,还是希望我们写代码的时候认真思考,该类提供的字段⽅法到底 给谁使⽤(是类内部⾃⼰⽤,还是类的调⽤者使⽤,还是⼦类使⽤).10.继承⽅式Java支持单继承、多层继承、不同类继承同一个类、但是不支持多继承。final 关键字修饰变量或字段表⽰常量(即不能修改)final int a 10;//a是常量不能进行修改 a20;//会报错public final int age 10; //final修饰字段必须要初始化否则会报错修饰类表⽰此类不能被继承final public class Animal { ... }final还可以修饰方法证明这个方法是不能被重写的11.继承与组合继承表⽰对象之间是is-a的关系⽐如狗是动物猫是动物组合表⽰对象之间是has-a的关系⽐如汽⻋组合和继承都可以实现代码复⽤应该使⽤继承还是组合需要根据应⽤场景来选择⼀般建议能 ⽤组合尽量⽤组合。