类的继承是一个及其重要的概念。
什么是类的继承?
继承就是从已有的类中派生出新的类,让新类拥有父类中已经有的东西,比如属性、方法等。
用一个例子说话。
前面一直用的一个类:Person。它代表了“人”
我们还可以定义很多本质上是“人”的类,比如:中国人、老师、工人、学生、母亲、女儿 ….. 不胜枚举。
这些东东,都可以继承与“人”,因为他们有拥有“人”的属性,比如:姓名、年龄、性别、爱好。
下面以老师为例子,我们再定义一个类:
public class Teacher{
private String name;
private int age;
private String sex;
private String favorite;
private String emp_code;//教师编号
private String zhicheng;//职称
private String course;//教学课程
//接下来写一堆set/get方法,用于访问属性。为了节省篇幅,我就不写了
//定义了一个方法:向别人介绍自己
public void introduceToSomeone(String someone){
System.out.println("hello " + someone + ", my name is " + this.name + ", I like " + this.favorite);
System.out.println("I have working 10 years, and my age is " + age);
System.out.println("I am teaching " + course);
}
}
现在仔细看看这个类,它里面很多属性是不是和Person里面的属性一样,比如都有name/age/sex/favorite。
因为老师本质上是一个人,所以,人有的属性,老师当然应该同样拥有。
从代码的角度上,有什么办法能让“老师”“继承”于“人”,从而拥有人的属性,这样老师就不用重复编写这些代码了呢
这个办法就是使用JAVA里面的“继承”:
public class Teacher extends Person{
private String emp_code;//教师编号
private String zhicheng;//职称
private String course;//教学课程
//接下来写一堆set/get方法,用于访问属性。为了节省篇幅,我就不写了
//定义了一个方法:向别人介绍自己
public void introduceToSomeone(String someone){
sayHi(someone);
System.out.println("I have working 10 years, and my age is " + age);
System.out.println("I am teaching " + course);
}
}
看看修改后的代码,与原来的代码有什么区别。
仔细看,一共有三处区别。
……
……
……
……
……
……
等着你琢磨这些区别……
……
……
……
……
……
……
现在,告诉我,这三处不同是什么?
实际上,如果你把这段代码放到eclipse中,会出现一个错误:The field Person.age is not visible。
你再琢磨一下,这个错误提示的用词为什么是这样的
……
……
……
你可以暂时先把这一行注释掉,然后用RunClass来调用Teacher这个类,运行一下,看看是什么结果。
//把main方法修改成下面的代码来运行
public static void main(String[] arg)
{
Teacher teacher = new Teacher();
teacher.introduceToSomeone("小明");
}
记得,运行之前,要把Teacher类里面的get/set方法都写进去。
顺便说一下可以使用eclipse这个工具,快速生成这些get/set方法,如下图:
(1)点Source下的Genarator Gettors and Settors
(2)选中这几个属性,点OK,即可。
现在你看到运行结果了,但是,运行结果中有很多null,先不管null是啥东西,总之,这个运行结果不是你希望的。
我们先做如下修改,然后再讲原因。
1)把Person类中的属性前面的private修改为protected
2)把introduceToSomeone方法中,原来因为错误注释掉的一行打开(现在不会再有错误了)
3)把RunClass的main方法改的饱满一些:
public static void main(String[] arg)
{
Teacher teacher = new Teacher();
teacher.setName("helen");
teacher.setAge(30);
teacher.setFavorite("落基山露营看星星");
teacher.setCourse("英语");
teacher.introduceToSomeone("小明");
}
运行一下看看结果。
至此,通过代码,我们写了一个继承自Person的类Teacher,也运行了程序,看到了结果。
同时,你大约会有如下疑问:
1、能不能再总结一下,继承是什么
2、突然冒出来的protected是什么东西
解释来了:
1、继承是什么
继承就是让一个类,通过extends关键字,自动拥有另外一个类中已经有的东西。
Teacher类通过继承Person类自动拥有了Person类中如下东西:
1)它自己的代码里面没有name、age等属性,但是它仍然能使用这些属性,就象自己的代码中已经写了一样
2)它自己的代码里面没有sayHi这个方法,但是它也可以在代码中直接使用sayHi这个方法,就象自己的代码中已经写了一样
这就是继承的神奇之处!
2、突然冒出来的protected是什么东西
在前面一个课程中,已经介绍了两个东东:
- private:私有的
- public:公开的
- 通过这些关键字,定义类里面的属性或方法以怎样的形式在代码中被访问。
类似的,protected的作用是,对自己儿孙类们(就是继承于自己的类)是公开可被访问的,对外人(其他各种类)是私有的不可被访问。
Person类中的属性,原来是private,意味着这些属性仅仅能被自己使用,当修改为protected后,就可以被他的继承者Teacher类访问了。
最后留个作业:写一个叫“数学老师”的类,继承与Teacher类,看看你能写出来一个什么样的代码。