1、继承简介
举一个简单的例子:笔分为很多种,比如毛笔、钢笔、圆珠笔等等,这些笔都有一些相同的属性比如长度、笔迹的粗细等等;但他们也有不同的特点,比如他们的用途(毛笔可以写对联、钢笔可以写作业等等)等。这时候要编写一个程序用类表示这些笔,一般的方法就必须把各种笔的众多相同的属性重复写很多次,就很浪费时间。这时候就可以借助继承,先写一个拥有所有笔共同点的类,再分别写每一种笔的类,让其继承这个共同类即可。
先写一个笔的类:
public class pen {
//定义长度
private int length;
//定义品牌
private String brand;
//定义笔迹的粗细
private int width;
public void setLength(int l){
length = l;
}
public int getLength(){
return length;
}
public void setBrand(String b){
brand = b;
}
public String getBrand(){
return brand;
}
public void setWidth(int w){
width = w;
}
public int getWidth(){
return width;
}
public void write(){
System.out.println("写了一个字");
}
}
这时候写毛笔的类的时候,对于笔的共同属性就只需要先用extends关键字继承,再写其特有的属性和方法即可。(继承的格式class 子类/派生类 extends 父类/基类/超类 ,基类/父类/超类 就是拥有共同属性和方法的类, 子类/派生类则是从父类继承过来,拥有它自己特有的属性和方法的类。)
public class inkBrush extends pen{
public void writeCouplet(){
System.out.println("写了一副对联");
}
}
同样,钢笔类也只需先继承再写钢笔独有的属性和方法。
public class pencil extends pen{
public void doHomework(){
System.out.println("完成了一次作业。");
}
}
2、关于类类里面可以被继承的部分
Java里面的子类可以继承父类的所有属性和方法,只不过不能直接访问私有成员,默认的成员不能跨包继承。
3、关于方法的重写
不同的笔都可以写字,但不同的笔写出的子是不一样的。这时候就需要在各种笔的子类里重写write方法,如下所示:
public class pencil extends pen{
public void write(){
System.out.println("用钢笔写了一个字");
}
}
子类里重写的方法必须和父类里的方法的关键字、方法名、方法里的参数个数以及每一个参数的属性都必须相同。不然就成了方法的重载。
3、关于类的类型转换
每种笔都可以用来写字。当一个学生用钢笔写字的时候,我们可以说“他在用钢笔写字”,也可以说“他在用笔写字“。用类表示如下:
写一个学生类:
public class student {
public void write(pen p){
p.write();
}
}
主函数里面:
public class Manage {
public static void main(String [] args){
student stu1 = new student();
pencil p1 = new pencil();
stu1.write(p1);
}
}
学生类的doHomework方法里的参数是pen的类型,主函数里student对象stu1的doHomework方法里的参数是pencil,但并没有报错。这说明pencil自动转换为了pen对象。
自动类型转换只能从子类转换为父类,不能从父类转换为子类,从父类转换为子类必须使用强制类型抓换。
一个学生在写作业的时候,我们可以说“他用钢笔写作业”,也可以不用说明他用什么笔写作业,直接说“他用笔写作业”。用类表示如下:
写一个学生类:
public class student {
public void doHomework(pen p){
p.doHomework();
}
}
如果按照上述写法会报错,这是因为pen这个类没有doHomework的方法,doHomework时pen的派生类pencil里的方法。着也说明pen类的对象无法转换成pencil类对象。这时候可以采用强制类型转换(强制类型转换的格式: 转换前的类名 转换前的对象名 = (转换后的类名)需转换的对象名)。如下所示:
public class student {
public void doHomework(pencil p){
p.doHomework();
}
}