Java 面向对象:类的继承(extends)与重写
前言
这是学习Java类与继承的笔记,用动物作为父类,狗,猫作为子类进行一个示范。本篇记录继承相关的基础知识。
环境
- JDK 17
- IntelliJ IDEA
- 纯 Java 项目(未使用 Maven)
一、什么是继承
继承,也就是让子类自动拥有父类所有的属性和方法,关键字extends:
publicclassDogextendsAnimal{...}即Dog为Animal的子类,这样Dog就不用重复写Animal已经有的属性和方法了。
有利于进行代码复用:公共的部分放父类,各子类只写自己特有的部分。
二、父类与子类
父类Animal,代表所有动物的共性:名字、年龄,会叫、会动。
publicclassAnimal{privateStringkind;//设置私有属性种类,私有属性只能通过类中设定的方法访问privateintage;//年龄publicvoidsetKind(Stringkind){this.kind=kind;//设置函数让外界可以访问私有属性}publicStringgetKind(){returnkind;//设置函数让外界可以获取私有属性}publicvoidsetAge(intage){this.age=age;}publicintgetAge(){returnage;}publicvoidshout(){System.out.println(kind+"发出叫声");//通用函数}publicvoidmove(){System.out.println(kind+"做出动作");}}注意
kind、age都是private私有属性。这是"封装":属性私有,外面要通过setKind/getKind这类方法(合称getter/setter)来访问。
三、子类与"私有属性不能直接访问"
让Dog继承Animal:
publicclassDogextendsAnimal{publicvoidspeakKind(){System.out.println(getKind());}}这里Dog里不能写kind,因为kind是父类的私有属性,无法直接访问,只能通过继承来的getKind()来访问。
这就是封装的作用,子类虽然能继承,但不能直接访问,只能通过公有的 getter/setter来读写。
四、方法重写(override)与 super
父类的shout()只打印通用的"发出叫声"。对于子类Dog应该有狗的叫法,因此需要重写方法:
publicclassDogextendsAnimal{publicvoidshout(){super.shout();//先执行父类的通用方法System.out.println("汪汪!");//加上子类自己的}}重写(覆盖):方法名、参数、返回值必须完全一样,只有方法函数体换成子类的。
super.shout();表示先调用一遍"父类自己的那版方法"。- 注意!!!如果写成
this.shout();就变成了调用自己,就会形成死循环。
五、子类新增自己的方法
除了重写,子类可以加父类没有的方法,比如Dog的speakKind():
publicclassDogextendsAnimal{publicvoidspeakKind(){System.out.println(getKind());}}用"猫"再写一个子类Cat作为对比,只需重写shout()/move():
publicclassCatextendsAnimal{publicvoidshout(){super.shout();System.out.println("喵喵!");}publicvoidmove(){super.move();System.out.println("走动");}}六、测试
publicclassTest{publicstaticvoidmain(String[]args){Dogdog=newDog();//新建Dog对象dog.setKind("小狗");//通过方法设置私有属性dog.setAge(3);dog.shout();//dog类重写过的方法,小狗发出叫声dog.move();System.out.println(dog.getKind()+"今年"+dog.getAge()+"岁");//通过getter来访问内容}}运行后发现:同样是shout(),狗"汪汪"、猫"喵喵",父类定好框架,子类则可以按照各自的需求具体实现。
七、错误记录
super写成了this:一开始重写时写this.shout();,结果方法自己调自己,造成了无限递归。调父类版本必须用super。
八、总结
本篇掌握了继承、方法重写的基本概念。
继承让共性代码放在父类复用,子类只需要重写差异部分,这就是面向对象"复用 + 扩展"的思想。