前言
在现实生活中继承更多的用于财产方面的继承,而在程序设计当中,谈到的继承和现实生活中的继承是有一定区别的。 程序当中更像是师傅和徒弟。财产继承会给子女进行均分或者怎样,但是徒弟从师傅那里获取的武功都是一样的。
一、继承概念
继承机制:是面向对象程序设计代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加新功能,这样产生新的类,称为派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。继承主要解决的问题是:共性的抽取,实现代码复用。
首先我们写一个狗类和一个猫类:
狗类:
public class Dog2 {
private String name;
private String color;
private String gender;
private int age;
public Dog2(String name, String color, String gender, int age) {
this.name = name;
this.color = color;
this.gender = gender;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void sleep(){
System.out.println(name+":睡觉~~~");
}
public void eat(){
System.out.println(name+":吃东西~~~");
}
public void bark(){
System.out.println(name+":汪汪汪~~~");
}
}
猫类:
public class Cat2 {
private String name;
private String color;
private String gender;
private int age;
public Cat2(String name, String color, String gender, int age) {
this.name = name;
this.color = color;
this.gender = gender;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void sleep(){
System.out.println(name+":睡觉~~~");
}
public void eat(){
System.out.println(name+":吃东西~~~");
}
public void mew(){
System.out.println(name+":喵喵喵~~~");
}
}
将这两个类仔细观察的话,会发现这两个类当中有好多重复的代码,那么我们能否将这些重复的东西提取出来呢?这就是继承在里边完成的事情。
二、继承的语法
在Java中如果要表示类之间的继承关系,需要借助extends关键字,具体如下:
修饰符 class 子类 extends 父类{
// …
}
那么下面对刚才的过程重新编写,创建一个Animal类,首先将它们共性的东西提取出来:
public class Animal {
//这里先把private拿掉,正常设计是要有的
String name;
String color;
String gender;
int age;
//构造方法...
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void sleep(){
System.out.println(name+":睡觉~~~");
}
public void eat(){
System.out.println(name+"吃东西~~~");
}
}
关于猫叫和狗叫这两个是不一样的,无法提取,分别创建一个Dog类和一个Cat类,狗和猫都是动物,只需要让其继承自Animal,好处:重复的方法不需要自己再来实现,直接从父类中继承。
Dog类:
public class Dog3 extends Animal{
}
Cat类:
public class Cat3 extends Animal{
}
下面写一个TestAnimal来测试一下:
public class TestAnimal {
public static void main(String[] args) {
Dog3 dog=new Dog3();
dog.name="小七";
dog.color="金黄色";
dog.gender="公";
dog.age=1;
dog.eat();
dog.sleep();
System.out.println("=================================");
Cat3 cat=new Cat3();
cat.name="元宝";
cat.color="灰色";
cat.gender="母";
cat.age=2;
cat.eat();
cat.sleep();
}
}
会发现虽然我们在Dog3类中什么都没有添加,但程序是可以编译通过的,假如把Dog3中的extends去掉,就会编译报错:
可是调试运行来看一下到底是调用的哪里的方法:
Animal可以称为父类或者基类或者超类,Dog类可以称为子类或者派生类。
在此基础上进行扩展:
注意:子类一定要对基类进行扩展,哪怕是增加一个成员变量
Dog类:
public class Dog3 extends Animal{
public void bark(){
System.out.println(name+":汪汪汪~~~");
}
}
Cat类:
public class Cat3 extends Animal{
public void mew(){
System.out.println(name+":喵喵喵~~~");
}
}
TestAnimal类:
public class TestAnimal {
public static void main(String[] args) {
Dog3 dog=new Dog3();
dog.name="小七";
dog.color="金黄色";
dog.gender="公";
dog.age=1;
dog.eat();
dog.sleep();
dog.bark();
System.out.println("=================================");
Cat3 cat=new Cat3();
cat.name="元宝";
cat.color="灰色";
cat.gender="母";
cat.age=2;
cat.eat();
cat.sleep();
cat.mew();
}
}
运行结果:
注意:
1.子类会将父类中的成员变量或者成员方法继承到子类中,注意:基类中构造方法没有被子类继承。
2.子类继承父类之后,必须要新添加自己特有的成员,体现出与基类的不同,否则就没有必要继承了。