面向对象的特征之二:继承性
一、继承性的好处
- 减少了代码的冗余,提高代码的复用性
- 便于功能的扩展
- 为了以后的多态性的使用提供了前提
二、继承性的格式:class A extends B{}
extends:延展、扩展
A:子类、派生类、subclass
B:父类、超类、基类、superclass
体现:
- 一旦子类A继承了父类B以后,子类A中就获取了父类B中声明的说有的属性、结构、方法,特别的,父类中声明为private的属性或方法,子类继承父类以后,仍然认为获取了父类私有的结构,只是因为封装性的影响,子类不能直接调用父类的结构而已。
- 子类继承父类以后还可以定义自己特有的属性和方法:实现功能的拓展。
子类和父类的关系,不同于自己和父级的关系
三、java中关于继承性的规定
- 一个类可以被多个子类继承
- 一个类只能有一个父类:java中类的单继承性
- 子、父类的相对的概念,类是可以多层继承的
- 子类直接继承的父类称为直接父类,间接继承的父类称为间接父类
- 子类继承父类以后,就获取了直接父类以及所有间接父类中声明的属性和方法
注意
- 如果没有显式的声明一个类的父类的话,则此类继承于java.lang.Object类
- 所有的java类(除java.lang.Object类以外)都直接或间接的继承java.lang.Objec类
- 意味着:所有的java类具有java.lang.Objec类声明的功能
package com.atguigu.java;
public class Creature {
public void breath() {
System.out.println("呼吸");
}
}
package com.atguigu.java;
public class Person extends Creature{
String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public void eat() {
System.out.println("吃饭");
}
public void sleep() {
System.out.println("睡觉");
}
public void show() {
System.out.println("name:" + name + ",age:" + age);
}
}
package com.atguigu.java;
public class Student extends Person{
String major;
public Student() {
}
public Student(String name,int age,String major) {
super(name, age);
this.major = major;
}
public void study() {
System.out.println("学习");
}
}
public class ExtendsTest {
public static void main(String[] args) {
Person p1 = new Person();
p1.name = "Tom";
p1.eat();
Student s1 = new Student();
s1.study();
s1.show();
s1.breath();
}
}
四、方法的重写override/overwrite
4.1定义
重写:子类继承父类以后,可以对父类中同名同参数的方法,进行覆盖
4.2应用
重写以后,当创建子类对象以后,通过子类调用父类中的同名同参数的方法时,实际执行的是子类重写父类的方法。
4.3重写的规定
- 方法的声明:权限修饰符 返回值的类型 方法名(形参列表) throws(异常的类型){}
- 子类重写的方法的方法名和形参列表与被重写的父类的方法的方法名和形参列表相同
- 子类重写的方法的权限修饰符不小于父类被重写的方法权限修饰符
- 特殊的,子类不能重写父类中声明为private权限的方法
- 返回值的类型
- 父类被重写的方法的返回值是void,则子类重写的方法的返回值类型只能是void
- 父类被重写的方法的返回值类型是A类型,则子类重写的方法的返回值类型可以是A类或A类的子类
- 父类被重写的方法的返回值类型是基本数据类型,则子类重写的方法的返回值类型必须是相同的基本数据类型
- 子类重写的方法抛出的异常类型不大于父类中被重写的方法抛出的异常类型
package com.atguigu.exer;
public class Circle {
private double radius;
public Circle() {
radius = 1.0;
}
public void setRadius(double radius) {
this.radius = radius;
}
public double getRadius() {
return radius;
}
public double findArea() {
double area = Math.PI * radius * radius;
return area;
}
}
package com.atguigu.exer;
public class Cylinder extends Circle{
private double length;
public Cylinder() {
length = 1.0;
}
public double getLength() {
return length;
}
public void setLength(double length) {
this.length = length;
}
public double findVolume() {
return super.findArea() * length;
// return findArea() * length;
}
@Override
public double findArea() {//返回圆柱的表面积
// TODO Auto-generated method stub
return Math.PI * getRadius() * getRadius() * 2 + Math.PI * 2 * getRadius() * length;
}
}
package com.atguigu.exer;
public class CylinderTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
Cylinder cy = new Cylinder();
cy.setRadius(2.1);
cy.setLength(3.4);
double volume = cy.findVolume();
System.out.println(volume);
double area = cy.findArea();
System.out.println("圆柱的表面积为:" + area);
}
}
public class Cylinder extends Circle{}
Cylinder 类中重写了findArea()方法
在findVolume()方法中使用了父类中的findArea(),使用super.findArea()表示调用父类中的findArea()方法
子类和父类中同名同参数的方法要么都声明为非static的(考虑重写),要么都声明为static的(不是重写)。