入门第二步,了解并掌握继承。提到继承二字,各位必定首先想到的是继承家业,继承遗产等等,而我想到的是“哈哈哈哈哈哈哈你想笑死我好继承我的蚂蚁花呗吗”这句话,可见日常生活中继承出现频率太高了。那么Java中的继承是什么意思呢?其实和这些也并没有多大区别,可以直接从字面意思去理解。继承就是存在包含关系的两个类中,通过extends关键字,子类获得父类的所有属性与方法(也就是子承父业嘛)。
为什么要使用继承呢?
用两个实际例子来说明:
创建了两个动物类,猫和老鼠,他们的要求如下:
猫:属性(姓名 年龄)方法(吃 睡 玩)
老鼠:属性(姓名 年龄)方法(吃 睡 玩)
那么在开发这两个类的时候,就要对它们共有的属性与方法重新写一遍,在类少的时候工作量还是可以接受,但如果是十个一百个呢?再这样去写不仅工作量巨大,代码显得臃肿,而且难以维护。所以要解决这一问题,就要使用继承了。
继承可以起到两个作用:1.提高代码的重用性;
2.提高代码的扩展性;
继承格式
了解完继承的作用后就要知道怎么去使用它,继承的格式如下:
public class 类名(子类、派生类、超类) extends 类名(父类、基类){
}
在定义大学生类的时候,就可以让大学生类去继承学生类:
public class UNstudent extends Student{
}
要注意的是,Java有区别与c++,它属于单继承,也就是一个子类只能继承一个父类。
继承能得到什么?
子类能继承到父类所有的属性和方法,没错,所有的,肯定会有人问:private的属性也能继承到吗?其实private的属性也继承了,只是由于访问权限的原因不能够直接使用。在这里,就很有必要补充一下各访问修饰符的访问范围了。
访问修饰符同类中同包中不同包中不同包但是有继承关系的子类中
public ✔ ✔ ✔ ✔
protected ✔ ✔ ✘ ✔
默认的✔ ✔ ✘ ✘
private✔ ✘ ✘ ✘
访问修饰符的作用是设置属性和方法的访问权限,与是否能够被继承无关。
同时,子类还可以定义它自己特有的属性和方法,但在调用子类特有的方法时,一定要是子类类型的对象才能调用。
方法重写
子类继承父类后,可以直接调用继承到的方法,但父类所定义的方法很难做到具体内容很详细,会比较笼统,因此子类在使用该方法的时候需要根据自身情况来重新定义方法。我们把子类将从父类继承来的方法重新写方法体叫做方法重写。
条件:
1.必须要有继承关系;
2.重写方法时子类方法的访问修饰符必须要大于或者等于父类方法的访问修饰符;
3.重写方法时子类方法的返回值类型,方法名,参数都必须要和父类的一致。
如何调用重写后的方法
子类和父类都会有同一个名字的方法,确定调用的是子类的还是父类的,需要根据
new关键字后的类名来决定,如果new关键字后的类名是子类,那么调用的就是子类的方法,如果new关键字后的类名是父类的,那么调用的就是父类的方法。子类重写父类的方法后,当你实例化子类的对象后,然后用对象名去调用方法时,只能调用子类重写的方法,父类的方法是不能被调用的。
想要父类的方法和子类的方法都执行怎么实现呢?
在重写的方法中使用super关键字来调用父类中的方法,与上一节的this关键字类似,super用于调用父类的方法,this则可用于调用当前类中的方法。
方法重写与方法重载
方法重写指的是在继承关系中,子类重写父类方法,方法名、参数类型、参数个数必须相同的情况。
方法重载指的是在同一类或具有继承关系的类中,方法名字相同,但参数类型、参数个数不同的情况。
自动转型
要求:
(1) 要实现自动转型就必须要有继承关系;
(2)自动转型只能是子类的类型向父类的类型进行转型;
(3)只能是小范围的数据向大范围的数据进行转型。
格式:
自动转型一般有以下两种格式
①父类名 对象名 = new 子类构造方法(参数值,...);
② public 返回值类型 方法名(父类名 对象名){
对象名.方法名();
}
父类名 对象名A = new 子类构造方法(参数值,...);
子类名 对象名B = new 子类构造方法(参数值,...);
方法名(对象名A);
方法名(对象名B);
在窗体开发JFrame中,add(JLabel) add(JButton)等语句中就是使用的第二种格式。
需要注意的是,在使用了自动转型后,子类特有的属性和方法就不能被调用,若还想调用子类特有的属性与方法,则必须要强制转型。