Java面向对象四之继承
学习笔记,仅供参考
本文重点:继承 | 方法重写 | super | final
之前通过 static 解决了社区名及社区通知功能,随后居委会又来要求,希望将这个小区养狗系统扩展为社区宠物管理系统。即让小区其他宠物也能加入到这个系统中,扩展用户量。
继承
为了将系统改为社区宠物管理系统,小伙找到了继承这种新的方法。
继承的思想即是理清 共性与个性 的关系。将各类动物共有的属性或行为放到一起写进一个类中,然后每类动物都能使用这些属性和行为。同时每类动物都还有一些自己独特的个性,将这些个性分别写入各自的类中。
继承 :描述父类与子类之间的关系,子类能继承父类的属性和行为,就像儿子继承父亲的遗产一样。
在 Java 中使用 extends 修饰词表示继承,如 class Son extends Father() { ... }
// example
@Getter
@Setter
public class Animal() {
// 父类中的成员变量
private String name;
private int age;
private String variety;
// 父类中的方法
public void eat() {
}
public void sleep() {
}
/*********分割线*********/
// 子类继承父类
public class Dogs extends Animal() {
}
/**********分割线*********/
public class Test() {
public static void main(String args[]) {
// 子类使用父类方法
Dogs zhangDog = new Dogs();
zhangDog.setName = "Jerry";
zhangDog.setAge = 2;
zhangDog.setVariety = "拉布拉多";
zhangDog.eat();
zhangDog.sleep();
}
}
}
多层继承 :儿子继承父亲,孙子继承儿子,一层一层继承下去,底层的类继承上层类的特性。一类一类细分下去,更加贴近于现实生活。就像动画中灰太狼的饿狼传说,子孙们继承了永远吃不到狼的特性。
多继承 :一个子类同时继承多个父类,在 Java 中是 不允许 多继承的。
方法重写
在子类中要想修改所调用父类方法中的内容,就要在子类中对该方法进行重写,重写后的方法就成了子类的特性。就像儿子能赚钱了,不再花父亲的钱了。在 Java 中用 @Override
来修饰重写的方法,在 IDEA 中 Alt+Insert,找到 Override Methods,选择要重写的方法即可
。
public class Animal() {
// 动物类中的叫
public void barking() {
System.out.println("动物叫!");
}
}
/**********分割线************/
public class Dogs extends Animal() {
// 狗类重写动物类中的叫
@Override
public void barking() {
System.out.println("汪汪汪!");
}
}
/************分割线*************/
public class Cats extends Animal() {
// 猫类重写动物类的叫
@Override
public void barking() {
System.outprintln("喵喵喵!");
}
}
super 啃老
(犯贱操作):当在重写父类方法时,又想重新调用父类的原方法,就重写方法中用 super.方法名
。就像儿子能赚钱了,还要花老子的钱,啃老行为。
// 对上面的狗类使用 super
public class Dogs extends Animal() {
@Override
public void barking() {
// 此处狗类中的叫变为 "动物叫"
super.barking();
}
}
又因为子类不能继承父类的构造方法,所以要想使用子类中的构造方法,就要在子类中写无参、有参的构造方法。
若是还想用父类的构造方法,那么就在子类的构造方法中用 super 调用父类构造方法。啃老啃到底。
在 IDEA 中,Alt+Insert, Constructor, 选择父类的构造方法即可
。
public class Animal() {
public Animal() {
// 无参构造方法
}
// 有参构造方法
public void Animal(String name, int age, String variety) {
this.name = name;
this.age = age;
this.variety = variety;
}
}
/*************分割线*******************/
public class Dogs extends Animal() {
public Dogs() {
// 子类的无参构造方法
}
// 子类调用父类的有参构造方法
public void Dogs(String name, int age, String variety) {
super(name, age, variety);
}
}
final
final : 表示最后、最终。可以修饰类、方法和变量名
作用:
所修饰的类,不再有子类继承它
所修饰的方法,其子类不能重写该方法
所修饰的变量,变为常量,不能在被修改。而且常量的书写格式要全大写,以下划线分割单词