第一章 继承Java中提供了一个关键字extends,用这个关键字,可以让一个类和另一个类建立起父子关系。publicclassBextendsA{}A类称为父类(基类或超类)。B类称为子类(派生类)。1.1 子类继承子类能继承父类的非私有成员(成员变量、成员方法)1.2 继承后对象的创建子类的对象是由子类、父类共同完成的。继承的好处:1.代码复用 2.减少了重复代码1.2.1 People父类创建packagecom.kgl.extendsdemo;publicclassPeople{privateStringname;privateintage;privatecharsex;publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.namename;}publicintgetAge(){returnage;}publicvoidsetAge(intage){this.ageage;}publicchargetSex(){returnsex;}publicvoidsetSex(charsex){this.sexsex;}publicPeople(){}publicPeople(Stringname,intage,charsex){this.namename;this.ageage;this.sexsex;}}1.2.2 Teacher类packagecom.kgl.extendsdemo;publicclassTeacherextendsPeople{privateStringskill;publicStringgetSkill(){returnskill;}publicvoidsetSkill(Stringskill){this.skillskill;}publicTeacher(Stringname,intage,charsex,Stringskill){super(name,age,sex);this.skillskill;}publicTeacher(){}}1.2.3 Consultant类packagecom.kgl.extendsdemo;publicclassConsultantextendsPeople{privateintnum;publicintgetNum(){returnnum;}publicvoidsetNum(intnum){this.numnum;}}1.2.4 使用packagecom.kgl.extendsdemo;publicclassTest{publicstaticvoidmain(String[]args){TeachertnewTeacher(张三,18,男,java);System.out.println(t.getName());//张三System.out.println(t.getAge());//18System.out.println(t.getSex());//男System.out.println(t.getSkill());//javaConsultantcnewConsultant();c.setNum(10);System.out.println(c.getNum());//10}}1.3 权限修饰符定义就是用来限制类中的成员成员变量、成员方法、构造器能够被访问的范围。四种权限修饰符及范围private只能本类。缺省即默认不写修饰符本类、同一个包中的类。protected本类同一个包中的类、子孙类中。public任意位置。权限大小排序private 缺省 protected public权限修饰符访问范围表|修饰符|本类里|同一个包中的类|子孙类|任意类||private|√|||||缺省|√|√||||protected|√|√|√|||public|√|√|√|√|packagecom.kgl.extends2modifier;publicclassFu{privatevoidprivatemethod(){System.out.println(privatemethod);}voidmethod(){System.out.println(method);}protectedvoidprotectedmethod(){System.out.println(protectedmethod);}publicvoidpublicmethod(){System.out.println(public);}publicstaticvoidmain(String[]args){FufunewFu();fu.privatemethod();//privatemethodfu.method();//methodfu.protectedmethod();//protectedmethodfu.publicmethod();//public}}packagecom.kgl.extends2modifier;publicclassTest{publicstaticvoidmain(String[]args){FufunewFu();// fu.privatemethod();fu.method();//methodfu.protectedmethod();//protectedmethodfu.publicmethod();//public}}packagecom.kgl.extends3modifier;importcom.kgl.extends2modifier.Fu;publicclassDemo{publicstaticvoidmain(String[]args){FufunewFu();// fu.privatemethod();// fu.method();// fu.protectedmethod(); //protectedmethodfu.publicmethod();//public}}packagecom.kgl.extends3modifier;importcom.kgl.extends2modifier.Fu;publicclassZiextendsFu{publicstaticvoidmain(String[]args){ZizinewZi();// zi.privatemethod();// zi.method();zi.protectedmethod();//protectedmethodzi.publicmethod();//publiczi.show();//protectedmethod public}publicvoidshow(){// privatemethod();// method();protectedmethod();publicmethod();}}1.4 继承的特点单继承Java是单继承模式一个类只能继承一个直接父类。多层继承Java不支持多继承但支持多层继承。祖宗类Java中所有的类都是Object类的子类。就近原则优先访问自己类中自己类中的没有才会访问父类。1.4.1 Java中的类为啥不支持多继承反证法示例假设类A和类B都有同名方法method()。如果类C同时继承A和B (class C extends A, B)。当调用c.method()时编译器无法确定是调用A的方法还是B的方法从而产生歧义。结论因此Java中的类不支持多继承。1.4.2 Java中的祖宗类ObjectJava中所有类要么直接继承了Object要么默认继承了Object要么间接继承了Object。因此Object是所有类的祖宗类。1.5 继承后子类访问成员的特点就近原则访问顺序在子类方法中访问其他成员成员变量、成员方法是依照就近原则的。先子类局部范围找然后子类成员范围找然后父类成员范围找如果父类范围还没有找到则报错。重名处理如果子父类中出现了重名的成员会优先使用子类的如果此时一定要在子类中使用父类可以通过super关键字指定访问父类的成员语法super.父类成员变量/父类成员方法packagecom.kgl.extends4feature;publicclassTest{publicstaticvoidmain(String[]args){ZizinewZi();zi.show();}}classFu{Stringname父的name;publicvoidrun(){System.out.println(父类的run方法);}}classZiextendsFu{Stringname子的name;publicvoidshow(){Stringnameshow的name;System.out.println(name);//show的nameSystem.out.println(this.name);//子的nameSystem.out.println(super.name);//父的namerun();//子类的run方法this.run();//子类的run方法super.run();//父类的run方法}publicvoidrun(){System.out.println(子类的run方法);}}1.6 方法重写当子类觉得父类中的某个方法不好用或者无法满足自己的需求时子类可以重写一个方法名称、参数列表一样的方法去覆盖父类的这个方法这就是方法重写。重写小技巧:使用Override注解他可以指定java编译器检查我们方法重写的格式是否正确代码可读性也会更好。1.6.1 方法重写的其它注意事项子类重写父类方法时访问权限必须大于或者等于父类该方法的权限(public protected 缺省)。重写的方法返回值类型必须与被重写方法的返回值类型一样或者范围更小。私有方法、静态方法不能被重写如果重写会报错的。packagecom.kgl.extends5override;publicclassTest{publicstaticvoidmain(String[]args){CatcatnewCat();cat.cry(1);//是喵喵~System.out.println(cat.cry(1));//是喵喵~ 1}}classCatextendsAnimal{// 方法重写:方法名称形参列表必须一样这个方法就是方法重写。Override//方法重写的校验注解(标志):要求方法名称和形参列表必须与被重写方法一致否则报错 更安全可读性好更优雅publicintcry(inta){System.out.println(是喵喵~);returna;}}classAnimal{publicintcry(inta){System.out.println(动物会叫);returna;}}1.6.2 方法重写用场景当子类觉得父类的方法不好用或者不满足自己的需求时就可以用方法重写。子类重写object类的toString()方法以便返回对象的内容。packagecom.kgl.extends5override;publicclassTest2{publicstaticvoidmain(String[]args){// 子类重写Object的toStringStudentstudentnewStudent(张三,18,女);System.out.println(名字是student.getName()性别是student.getSex()年龄是student.getAge());//名字是张三性别是女年龄是18// System.out.println(student.toString()); // com.kgl.extends5override.Student5f184fc6 所谓的地址System.out.println(student);//Student{name张三, age18, sex女}// 注意1:直接输出对象默认会调用Object的toString方法(可以省略不写调用toString的代码)返回对象的地址信息// 注意2:输出对象的地址实际上是没有什么意义的开发中更希望输出对象时看对象的内容信息所以子类需要重写Object的toString方法。// 以便以后输出对象时就默认调用子类重写的toString方法返回对象的内容。}}classStudent{privateStringname;privateintage;privateStringsex;publicStudent(Stringname,intage,Stringsex){this.namename;this.ageage;this.sexsex;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.namename;}publicintgetAge(){returnage;}publicvoidsetAge(intage){this.ageage;}publicStringgetSex(){returnsex;}publicvoidsetSex(Stringsex){this.sexsex;}OverridepublicStringtoString(){returnStudent{namename\, ageage, sexsex\};}}