目录
- 1. 为什么要继承
- 2. 继承的特点
- 3. 子类访问父类的成员
1. 为什么要继承
classPainter{Stringname;intage;publicvoidsleep(){System.out.println(name+" sleep ");}publicvoidpaint(){System.out.println(name+" ("+age+") "+"paints");}}classDancer{Stringname;intage;publicvoidsleep(){System.out.println(name+" sleep ");}publicvoidpaint(){System.out.println(name+" ("+age+") "+"dances");}}发现dancer和painter有很多共通的部分。
- name
- age
- sleep
于是,为了代码更简洁和更易于维护,把共通的部分分离出来,用关键字extends来继承共通的部分。
classPerson{Stringname;intage;publicvoidsleep(){System.out.println(name+" sleep ");}}classPainterextendsPerson{publicvoidpaint(){System.out.println(name+" ("+age+") "+"paints");}}classDancerextendsPerson{publicvoidpaint(){System.out.println(name+" ("+age+") "+"dances");}}这里,Dancer和Painter就是子类(派生类),Person就是父类(基类/超类)。
继承语法:
修饰符class子类extends父类{//.....}这样,可以提高代码的复用率,重复代码只需要写一次。
2. 继承的特点
- 子类继承父类时,会继承父类的所有属性和方法
publicstaticvoidmain(String[]args){Painterp1=newPainter();p1.name="da Vinci";p1.age=61;p1.paint();}- 继承会受到访问权限关键字的限制
例如private:
classPerson{Stringname;privateintage;publicvoidsleep(){System.out.println(name+" sleep ");}}classPainterextendsPerson{publicvoidpaint(){System.out.println(name+" ("+age+") "+"paints");//编译会报错}}
private修饰的成员可以被继承,但是只能在当前类里访问。
如果要访问private修饰的成员,运用封装就可以。private是权限限定关键字,不是继承的权限关键字。
classPerson{Stringname;privateintage;publicvoidsleep(){System.out.println(name+" sleep ");}publicvoidsetAge(intage){this.age=age;}publicintgetAge(){returnthis.age;}}classPainterextendsPerson{publicvoidpaint(){System.out.println(name+" ("+getAge()+") "+"paints");}}publicstaticvoidmain(String[]args){Painterp1=newPainter();p1.name="da Vinci";p1.setAge(61);p1.paint();}3. 子类访问父类的成员
在子类方法中或者通过子类对象访问成员变量时:
- 如果访问的成员变量子类中有,优先访问自己的成员变量。
- 如果访问的成员变量子类中无,则访问父类继承下来的,如果父类也没有定义,则编译报错。
- 如果访问的成员变量与父类中成员变量同名,则优先访问子类的(除super)。
- 成员变量访问遵循就近原则,自己有优先自己的,如果没有则向父类中找。
classF{inta=10;}classSextendsF{inta=15;publicvoidprint(){System.out.println(a);}}publicstaticvoidmain(String[]args){Ss=newS();s.print();}在子类方法中或者通过子类对象访问成员方法时:
- 访问父类与子类中不同名方法时,优先在子类中找,找到则访问,否则在父类中找,找到则
访问,否则编译报错。 - 访问父类与子类同名方法时,如果父类和子类同名方法的参数列表不同(重载),根据调用
方法时传递的参数选择合适的方法访问,如果没有则报错;(除重写)
classF{publicvoidprint(){System.out.println("F:print");}}classSextendsF{publicvoidprint(inta){System.out.println("S:print");}}publicclassTest{publicstaticvoidmain(String[]args){Ss=newS();s.print(10);s.print();}}