之前说过,学生这个类它包括好多,包括大学生、高中生、初中生、小学生等等,他们都有一定的共性,属性都有姓名,学号,班级等等,但是学习方法是不同的,学习的内容是不同的。那当我们定义类的时候,大学生要定义一个,小学生、初中生、高中生都要定义一个,非常麻烦。因为都属于学生,都有共性,我们就可以将共性写一次就好,其他的不同的方法我们再重新定义一下,这样我们就需要类的继承。那么父类的话我们就可以定义那些相同的属性,不同的我们再子类中再重写。简单来说,使用继承就是提高了代码的重用性,并且提高了程序的扩展性。
继承的语法格式:public class 子类名 extends 父类名 {
}
父类和子类就像现实中的父子关系一样,儿子不会遗传父亲的所有特征,长得像那是必然的。所以说子类不会继承父类的所有属性和方法。
当父类和子类在同一个包下:子类可以继承父类那些默认的,受保护,公有的属性和普通方法。
当父类和子类在不同的包下:子类可以继承使用父类的公有的属性和普通方法;但是在子类中调用方法的时候,受保护的方法和属性可以被继承下来使用。
那当我们子类中的方法的内部实现和父类不尽相同时,我们就要用到方法的重新(即方法的定义不变)。也就是说,无论是哪种学生,都有学习方法,但又不相同,不相同的部分我们进行重写。那在子类重写方法时,必须要注意a.方法的返回值数据类型,方法名,参数个数,参数类型和参数顺序都必须要和父类的完全相同。它和重载不一样,重载时参数个数,参数类型和参数顺序必须得有一个不同。b.子类在重写方法的时候,方法的访问修饰符可以大于或等于父类方法的访问修饰符。例如:private-默认的-protected-public 这是顺序,如果父类方法的访问修饰符是默认的,那么子类方法的就可以用protected和public。
那么,在调用方法时怎样才可以知道我们调用的到底是父类中的方法还是子类中的呢。当实例化类的对象是子类的时候,那么会优先执行子类的方法,如果子类中没有这个方法,则调用父类的方法。例如:
// 实例化一个CLScript类的对象 CLScript cl=new CLScript(); //设置字体的名字 cl.setName("隶书"); //调用区分方法 cl.sort();
这时调用的就是子类中的方法。
Script scr=new Script(); //设置字体的名字 scr.setName("楷书"); //调用区分方法 scr.sort();
这时调用的就是父类中的方法。
自动转型,今晚继续。。。