基础之石——类的继承
前篇我们提到了类与对象之间的关系,那么类与类、对象与对象之间是否存在着一定的关系呢?比如说一对父母生下来一个小孩,在无突变异常的情况下,这个孩子的一条染色体来自于父亲,另一天则来自于母亲,那么这个孩子就会具有父亲或者母亲的某些基因特性。换句话说,这个孩子继承了父亲或者母亲的某一些特性。在JAVA中,继承是复用程序代码的有力手段。如果现在我需要定义一个博美狗类,博美狗具有所有狗所具有的属性和方法。此时我们采用继承的手段来使博美狗获得犬类具有的所有属性和方法。
/**
* 定义一个Pom类,继承Dogs类
* @author Daily
*
*/
public class Pom extends Dogs{ // 类与类的继承的关键字为:extends
// 定义博美的特定属性
public String another_name; // 别称
/** 主函数
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Dogs pom = new Pom("David"); // 类向上自动转型
pom.age = 1;
pom.location = "Germany";
pom.sex = "male";
pom.weight = 3;
pom.eating();
pom.walking();
pom.sleeping();
Pom pom1 = new Pom("Cute");
pom1.age = 2;
pom1.location = "Germany";
pom1.sex = "female";
pom1.weight = 2;
pom1.another_name = "fox_dog";
pom1.weightLimit(pom1);
pom1.eating();
pom1.walking();
pom1.sleeping();
Pom pom2 = (Pom)new Dogs(); // 类向下强制转换
pom2.age = 2;
pom2.location = "Germany";
pom2.sex = "female";
pom2.weight = 2;
pom2.another_name = "fox_dog";
pom2.weightLimit(pom1);
pom2.eating();
pom2.walking();
pom2.sleeping();
}
/**
* 构造方法重载
* @param name 博美的名字
*/
public Pom(String name){
this.name = name;
System.out.println("我出生的时候,也得到了名字哦~~~看我多了不起。。。");
}
/**
* 判断博美狗的体重的方法
* @param p 特定的博美狗
*/
public void weightLimit(Pom p){
if (p.weight < 3.5){
System.out.println("我是博美,我很瘦哟~~~");
} else {
System.out.println("哈哈~被骗了吧?我可不是博美哟~~~");
}
}
/**
* 覆盖掉Dogs原有的walking方法
*/
public void walking(){
System.out.println("我是小短腿,在公园里跑跑就好啦~~~主人别让我走快呀!");
super.walking(); // Dogs类中的walking方法
}
}
1、JAVA中不支持多继承,即一个类只能直接继承一个类。类的继承具有向上传递性,即一个类可以有多个间接的父类。以上例,Dogs类直接继承了Animal类的所有属性与方法,Pom类直接继承了Dogs类的所有属性与方法,所以Pom也会具有Animal类的所有属性与方法,也就是说Pom间接继承了Animal类的所有属性与方法。
2、有时候,类的同一种方法功能有多种实现方式。上例中Pom的默认构造方法为Pom();我们将其方法进行覆盖和重载,得到了Pom(Pom p)这一新的构造方法。
注:
方法重载必须满足的条件:a.方法名相同;b.给定的参数类型或者参数个数或参数顺序不同;
c.方法返回值类型可以不同;d.方法修饰符也可以不同。
方法覆盖:重写定义父类所给的方法。
3.super关键字可以调用父类的方法,即使其已被覆盖。
4.多态:JAVA中父类可以自动转型为子类;当子类要转化为父类时需要强制转型。