!!!本来是放想放日记里的结果发现首页看不到..这就尴尬了,又重新复制一遍.
因为个人的文化素养太低,所以写得不好,请多多包涵!
今天讲了类的继承,继承中方法的重写(覆盖).
首先是继承,顾名思义,子承父业,子类继承父类的部分资源,要继承先要满足一个条件,即判断两个类是否能构成继承关系,比如你只能继承你老爸的财产,当然有例外,如你对一个老人有恩,他又膝下无子,可能会把财产给你,但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
上面是练习继承的题,今天就学到这了,感觉讲课好慢,这几天的大多是理论,感觉难受,还是喜欢逻辑思考!
我喜欢考试,但是不喜欢,做作业,这可怎么是好.