面向对象-类的继承,方法重写

  !!!本来是放想放日记里的结果发现首页看不到..这就尴尬了,又重新复制一遍.

  因为个人的文化素养太低,所以写得不好,请多多包涵!

  今天讲了类的继承,继承中方法的重写(覆盖).

  首先是继承,顾名思义,子承父业,子类继承父类的部分资源,要继承先要满足一个条件,即判断两个类是否能构成继承关系,比如你只能继承你老爸的财产,当然有例外,如你对一个老人有恩,他又膝下无子,可能会把财产给你,但java中没有这种例外(反正我目前没发现有特殊哈,如有特殊请注明回复,多谢!),又如,笔记本类,电脑类,电器类,笔记本是电脑类的子类,电脑类是电器类的子类,java中只能单继承不能多层继承,java中的类是单根性的,即一个子类只能有一个父类,一个父类可以有多个子类.子类不是父类的子集,而是父类的扩展,用关键字  extends(扩展,延伸) 表示: 电脑 extends 电器;

  另外,还有部分资源不能被继承:

    1.父类的 private(私有) 成员(属性和方法);

    2.不同包中的 默认修饰符(default) 成员;

    3.构造函数(构造方法);

  继承的语法结构:

    <修饰符> class 子类名 extends 父类{

        属性声明;

        方法声明;

    }

 在这里需要用到调用父类属性,方法的关键字 super 和 this,它们有什么区别呢:

super:

  代指父类或父类的父类的对象引用,可以访问子类能够继承的成员,可以访问父类的构造函数,不但可以访问父类 ,还能访问父类的父类的父类......

this:

  代指当前类的对象引用,当通过this调用某个属性或方法时,如果本类中没有,将会在父类或父类的父类..中查找,只是优先本类中.

方法重写(覆盖),在此写一下前面的方法重载,看一下他们的区别

  方法重写:

    1.分别在父类和子类中

    2.方法完全相同(返回值相同,参数列表相同)

    3.子类的修饰符大于或等于父类修饰符的范围(不能比父类小)

  方法重载:

    1.方法名相同

    2.在同一个类中

    3.参数顺序,类型,数量不同

    4.跟返回值,修饰符,参数名无关

以上是两者的区别.注意不要混淆了.

在此附一个修饰符权限范围表

私有    默认      保护   公共

private < default < protected < public    <--修饰符
同类        v      v        v    <--同一个类中
x          同包      v      v    <--同一个包中
x        x      子类      v      <--子类(包类,外)
x        x       x     整体    <--整体项目

 

这里有三个类:

1.

//创建一个圆类(父类)
public class Circle {
  private double radius;// 半径(私有)

  public Circle() {
    radius = 1;// 无参构造函数初始化radius为1
  }

  // 下面是封装,只是演示就不设置条件了直接返回值给方法
  public double getRadius() {
    return radius;
  }

                //形参,由实参传递过来 

  public void setRadius(double radius) {
    this.radius = radius;//蓝色属性是指本类的成员radius,this代指本类,绿色radius通过实参传过来的变量
  }

  // 计算圆的面积
  public double findArea() {
  // 面积公式,还是问人的,十几年没用过都忘了,2*半径*3.14(符号怎么打?尴尬)
    return this.radius * this.radius * 3.14;

  }
}

 

2.

//创建一个圆柱体类继承上面的圆(子类)
public class Cylinder extends Circle {
  private double length;// 圆柱的高度(长度也可以,咳..)

   public Cylinder() {
     length = 1;// 初始化
   }

   // 这里也不附加限制条件了
   public double getLength() {
     return length;
   }

   public void setLength(double length) {
     this.length = length;
   }

   // 计算圆柱的体积,从父类调用圆的面积算法*高
   public double findVolume() {
     return super.findArea() * this.length;//super 调用父类方法
   }

   // 这个是计算圆柱的表面积的也是调用父类的圆算法,圆柱有两个圆嘛,再加上侧面是长方形,知道一条

   //边了.另一条可以用底部圆的半径来算它的周长,即是长方形的边长
   public double findArea() {
     return super.findArea() * 2 + 2 * 3.14 * getRadius() * length;
   }
}

 

3.

//测试类
public class TestCylinder {
  public static void main(String[] args) {
    // 创建圆柱的对象
    Cylinder cylinder = new Cylinder();
    // 调用圆柱类继承过来的半径radius赋值
    cylinder.setRadius(5);
    // 输出给半径的值
    System.out.println("半径:" + cylinder.getRadius());
    // 调用圆柱类的高度赋值
    cylinder.setLength(10);
    // 输出
    System.out.println("高:" + cylinder.getLength());
    // 调用体积计算方法
    System.out.println("体积:" + cylinder.findVolume());
    // 调用表面积计算方法
    System.out.println("表面积:" + cylinder.findArea());
    // 下面是圆的对象
    Circle circle = new Circle();
    // 赋值半径
    circle.setRadius(2);
    // 调用父类的面积计算方法
    System.out.println("圆的面积:" + circle.findArea());
  }
}

 

这里是测试的输出:

半径:5.0
高:10.0
体积:785.0
表面积:471.0
圆的面积:12.56

上面是练习继承的题,今天就学到这了,感觉讲课好慢,这几天的大多是理论,感觉难受,还是喜欢逻辑思考!

我喜欢考试,但是不喜欢,做作业,这可怎么是好.

 

posted @ 2017-06-07 20:38  龙鱼  阅读(1731)  评论(0编辑  收藏  举报