今天来开坑关于Java的复习博客
我们来说一下继承吧。继承就好比一个族谱,父类中的变量和方法会被子类继承继承(特别注意,父类中private的方法和变量也会被继承,但是子类要借助父类的setter和getter方法来进行修改和获取,特别注意,如果父类中没有此方法,那么可以告诉你,这个变量在子类中是无法修改的)。还有,父类中的静态方法不能被继承!!
举个简单的例子吧,先来看看下面一张关系图
在这张图中,有三个类,其中最上面的是父类(几何体类),然后是它的两个傻儿子(圆类和长方形类)。英文不错的朋友可以看到,几何体类中定义了三个变量:颜色,创建时间和是否被填充,以及一个toString方法。根据刚刚说过的内容,子类将继承了父类中所有变量和方法,因而子类也可以添加上述三个变量以及调用toString方法。
多说无益,我们直接上代码吧。
class GeometicObject{
String color = "white";
private boolean filled;
java.util.Date dateCreat;
public void setFilled(boolean filled) {
this.filled = filled;
}
GeometicObject(){
dateCreat = new java.util.Date();
}
GeometicObject(String color,boolean filled){
dateCreat = new java.util.Date();
this.color = color;
this.filled = filled;
}
public void setColor(String color) {
this.color = color;
}
public String getColor() {
return color;
}
public boolean isFilled() {
return filled;
}
public String toString(){
return "creat on " + dateCreat +
"\ncolor " + color + "\nwheather filled :" + filled;
}
public double getArea(){
return -1;
}
}
我们继续来创建Circle类
class Circle extends GeometicObject{
private double radius;
Circle(){
this.radius = 1.0;
}
Circle(double radius,String color,boolean filled){
this.radius = radius;
setColor(color);
setFilled(filled);
}
public double gerArea(){
return Math.PI*radius*radius;
}
public double getPerimeter(){
return 2*Math.PI*radius;
}
public String printCircle(){
return toString() + "\nradius is " + radius;
}
}
在上述圆的代码中,反复套用了父类的方法,这就是继承的优势,不必重复写代码,同时,如果子类中的方法与父类中的方法重名,那么将启动重载(overied)技术,覆盖之前的方法,重新载入你写的方法,值得注意,重写方法要满足两同两小一大原则(即方法名和参数相同,且返回值要小于或等于父类的返回值,比如父类返回double,则子类重写的方法返回值可以是double,float甚至是int。另外一小是子类的错误抛出要比父类错误抛出更小)这里后面会提到错误抛出的,大家了解一下概念即可。
还有一大就是子类的方法可见性要比父类大,比如父类是默认访问(包访问),则子类可以是默认或者public。
接下来我们来谈一谈super()这个方法:
这个super()方法其实就是显式调用父类的构造方法和方法。我们先来说一下显式调用父类构造方法的情况。
Circle(double radius,String color,boolean filled){
super(color,filled);
this.radius = radius;
}
刚刚我们圆的构造方法代码可以提换成这样子,这个super() 实际上就是显式调用了父类GeometicObject中这个构造方法。
GeometicObject(String color,boolean filled){
dateCreat = new java.util.Date();
this.color = color;
this.filled = filled;
}
特别要注意!!!!这个super() 方法一定要用在第一条语句,不然会报错!!!
然后我们再说说用super() 语句来显式调用父类的方法:
public String printCircle(){
return super.toString() + "\nradius is " + radius;
}
这里小朋友肯定有很多问号,不就是在源代码中加了个super吗?是的,这里本来继承后,toString就是可以直接调用,加个super在于提醒系统这个toString方法是父类的(完全多此一举)。但是存在一种情况:当子类方法与父类方法重名时候,若想调用父类的重名方法,就必须用到super了
例如我在Circle类中加入一个toString方法:
public String toString(){
return super.toString() + "\nradius is " + radius;
}
这里调用的toString方法就是父类中的toString方法。给你们看看父类toString的方法吧:
public String toString(){
return "creat on " + dateCreat +
"\ncolor " + color + "\nwheather filled :" + filled;
}
好了,今天的内容大致这么多,其实继承很简单,但要学会灵活运用,比如在实际情况中,要创建多个类,要先思考看看类有没有共同点,然后将共同点集合成一个父类,再将子类继承父类即可。