面向对象的特征之二
一、继承性的好处
1、减少了代码的冗余,提高了代码的复用性
2、便于功能的扩展
3、为多态性的使用提供前提
二、继承性的格式:class a extends b{}
a:子类
b:父类
体现一旦子类a继承了父类b,则子类a就获取了父类b中的声明结构的所有属性、方法
特别的:当父类中声明为private的属性和方法以后,子类仍然继承这个属性和方法,但由于封装性的影响不能直接调用这个属性和方法
子类继承父类以后除了父类的属性方法还可以自己定义属性和方法:实现功能扩展
三Java中关于继承的规定
1一个父类可以被多个子类继承
2Java中的单继承性:一个子类只能继承一个父类
3 子类与父类是一个相对的概念
4子类直接继承的父类叫直接父类。间接继承父类叫间接父类
5子类继承父类以后就获得了直接父类以及间接父类中声明的属性和方法
四、1如果我们没有显示声明一个类的父类的话,则此类就继承与java.lang.object类
2所有的类(除了java.lang.object类以外)都直接或间接的继承于java.lang.object类
3所有Java类都具有java.lang.object类声明的属性和方法
练习圆与圆柱
package text1; //父类 public class Circle {double radius; public Circle(){ this.radius=1; } public void setRadius(double radius){ this.radius=radius; } public double findArea(){ return Math.PI*radius*radius; } }
//子类继承父类
public class Cylinder extends Circle {double length; public Cylinder(double length){ this.length=length; } public void setLength(double length){ this.length=length; } public double getLength(){ return length; } public double findvoid(){ return findArea()*length; } } 测试类
public class text { public static void main(String[] args) { Cylinder d=new Cylinder(1); d.setLength(3.4); d.setRadius(2.1); double a=d.findvoid(); double b=d.findArea(); System.out.println("圆的面积为:"+b); System.out.println("圆柱的体积为:"+a); } } 结果
圆的面积为:13.854423602330987
圆柱的体积为:47.10504024792536
方法重写
重写:子类继承父类以后,在子类写上和父类同名同参的方法覆盖父类(在调用时调用子类重写的方法)
约定俗称:子类中的方法就叫重写方法,父类中的那个被覆盖的方法叫做被重写方法
1子类重写的方法名、形参列表和父类被重写的方法名、形参列表相同
2子类重写的方法权限修饰符不小于父类被重写的方法权限修饰符
>特殊情况:子类不能重写父类中权限修饰符为private的方法
3返回值类型:
>当父类被重写的方法返回值是void是,那么重写的方法返回值类型也为void
>当父类被重写的返回值类型为a类型(是具体类型时例:object),那么子类重写的返回值类型可以是a类型或a类的子类
>当父类被重写的返回值类型为基本数据类型,那么子类重写方法的返回值类型必须是相同的基本数据类型
4子类重写的方法抛出的异常类型不大于父类被重写的方法抛出的异常类型
子类和父类中的同名同参的方法声明要么都是非static的(考虑重写),要么都是static的(不可重写)
练习:圆与圆柱的表面积
//父类
public class Circle {double radius; public Circle(){ this.radius=1; } public void setRadius(double radius){ this.radius=radius; } public double findArea(){ return Math.PI*radius*radius; } }
//子类继承父类
public class Cylinder extends Circle {double length; public Cylinder(double length){ this.length=length; } public void setLength(double length){ this.length=length; } public double getLength(){ return length; } // public double findvoid(){ // return findArea()*length; // } @Override public double findArea() { return Math.PI*radius*radius*2+2*Math.PI*radius*length; } }
测试类
public class text { public static void main(String[] args) { Cylinder d=new Cylinder(1); d.setLength(3.4); d.setRadius(2.1); // double a=d.findvoid(); double b=d.findArea(); System.out.println("圆柱的表面积为:"+b); } }
结果
圆柱的表面积为:72.57079029792422