Java——继承学习

今天来开坑关于Java的复习博客

我们来说一下继承吧。继承就好比一个族谱,父类中的变量和方法会被子类继承继承(特别注意,父类中private的方法和变量也会被继承,但是子类要借助父类的setter和getter方法来进行修改和获取,特别注意,如果父类中没有此方法,那么可以告诉你,这个变量在子类中是无法修改的)。还有,父类中的静态方法不能被继承!!

举个简单的例子吧,先来看看下面一张关系图

在这里插入图片描述

在这张图中,有三个类,其中最上面的是父类(几何体类),然后是它的两个傻儿子(圆类和长方形类)。英文不错的朋友可以看到,几何体类中定义了三个变量:颜色,创建时间和是否被填充,以及一个toString方法。根据刚刚说过的内容,子类将继承了父类中所有变量和方法,因而子类也可以添加上述三个变量以及调用toString方法。

多说无益,我们直接上代码吧。

class GeometicObject{
    
    

    String color = "white";
    private boolean filled;   //此变量为私有变量
    java.util.Date dateCreat;
    
    public void setFilled(boolean filled) {
    
     //构造Filled的setter方法
        this.filled = filled;
    }

    GeometicObject(){
    
         //定义一个无参数的默认方法,最好养成习惯定义无参构造方法
        dateCreat = new java.util.Date(); //将创建时间传给dataCreat
    }

    GeometicObject(String color,boolean filled){
    
    
        dateCreat = new java.util.Date();
        this.color = color;  //通过this.+变量是制定该变量为这个类的总变量
        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(){
    
       //默认无参数情况下圆的半径为1.0
        this.radius = 1.0;
    }

    Circle(double radius,String color,boolean filled){
    
    
        this.radius = radius;
        setColor(color);     //这里的setcolor方法就是继承父类的方法,使得子类不用重写
        setFilled(filled);   //同理,这个如此,将参数直接传入方法就可以修改circle的属性了
    }

    public double gerArea(){
    
    
        return Math.PI*radius*radius; //这里调用的radius为全局变量radius,也成圆的属性circle
    }

    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.+变量是制定该变量为这个类的总变量
        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;
    }

好了,今天的内容大致这么多,其实继承很简单,但要学会灵活运用,比如在实际情况中,要创建多个类,要先思考看看类有没有共同点,然后将共同点集合成一个父类,再将子类继承父类即可。

猜你喜欢

转载自blog.csdn.net/MrChen666/article/details/106675999
今日推荐