目录
在类的声明中,通过使用关键词extends来定义一个类的子类:
/*class 子类 extends 父类名字{
...
}
例如:
class Student extends People{
...
}
*/
则Student类定义为People类的子类,而People类是Student类的父类或者称为超类
二.继承
1.继承的意义(即为什么要使用继承)
代码存在重复了,导致后果就是代码量大且臃肿,而且维护性不高(维护性主要是后期需要修改的时候,就需要修改很多的代码,容易出错),要从根本上解决这两段代码的问题,就需要使用继承。
2.什么是继承性
如果子类中定义的任何实例方法都能调用父类的某一成员变量,那么我们就说子类继承了父类的这个成员变量;同理,如果子类中定义的任何实例变量能够调用父类中定义的方法,即它们就像是是在子类中直接定义的一样,我们就称子类继承了父类的这一方法。
3.子类和父类在同一个包或不在同一个包中的继承
3.1子类和父类在同一个包中的继承性
如果子类和父类在同一个包中,那么子类自然的继承父类除了private以外的成员变量作为自己的成员变量,并且也继承了除了private以外的方法作为自己的方法,继承的成员变量的访问权限保持不变。
3.2子类和父类不在同一个包中的继承性
如果子类和父类不在同一个包中,父类中的private和友好访问权限的成员变量不会被子类继承也就是说子类只会继承父类中的protected和public访问权限的成员变量和方法
继承关系UML图
三.成员变量的隐藏和方法的重写
1.成员变量的隐藏
子类声明的成员变量与从父类继承的成员变量的名字相同(声明的类型可以不同),在这种情况下子类就会隐藏继承的成员变量。
子类隐藏继承成员变量的结果如下:
- 子类对象以及子类自己定义的方法操作与父类同名的成员变量指子类重新声明的这个成员变量
- 子类对象仍然可以调用从父类继承的方法操作被子类隐藏的成员变量
本关任务:定义一个 NewWeight 的公开类,并继承 OldWeight 类(该类已定义),在该类中实现计算身高的标准体重。
* 任务:定义一个 NewWeight 的公开类,并继承 OldWeight 类,在该类中实现计算身高的标准体重。
*/
class OldWeight {
double height = 175;
public double getWeight(){
return height - 105;
}
}
// 请在下面的Begin-End之间按照注释中给出的提示编写正确的代码
/********** Begin **********/
// 定义一个NewWeight的公开类,并继承OldWeight类
public class NewWeight extends OldWeight{
// 定义一个变量height,类型为double
private double height;//不一定是private类型
// 定义一个有参构造方法,携带身高参数
NewWeight(double height){
this.height=height;
}
// 定义一个方法名为weight的方法,返回类型为double,计算现在的标准体重并返回
public double weight(){
return height-105;
}
}
/********** End **********/
class Father {
// 定义名称属性
String name = "Jack";
}
class Son extends Father {
// 定义名称属性
String name = "Jack's son";
}
public class ClazzTest {
public static void main(String[] args) {
// 实例化子类对象
Son s1 = new Son();
System.out.println(" s1.name : " + ((Father)s1).name);//将其强转为父类对象,就可以得到被子类隐藏的成员变量
}
}
后续会介绍super关键字的用法
2.方法重写
- 如果子类有权继承父类的某个方法,那么子类就有权力重写父类的这个方法(final方法除外),重写即子类定义的一个方法与父类方法的类型一致或者是父类方法类型的子类型,并且这个方法的名称、参数类型和参数个数都与和父类方法完全相同(后续会专门出一个章节关于重写、重载、重构)
- 重写的方法既可以操作继承的成员变量、调用继承的方法、也可以操作子类新声明的成员变量、调用新定义的方法,但无法操作被子类隐藏的成员变量和方法
- 重写不允许降低方法的访问权限,但可以提高方法的访问权限(public->protected->友好的->private由高到低的排列顺序)
计算球的表面积
/**
* 重写 Shape 中的 area 方法,计算球的表面积。
*/
class Shape {
private double r; //球的半径
// 球的体积
public double area(){
double s = (double)3/4*Math.PI*Math.pow(r,3);
return s;
}
}
public class Sphere extends Shape{
private double r; //球的半径
public Sphere(double r) {
this.r = r;
}
// 请在下面的Begin-End之间按照注释中给出的提示编写正确的代码
/********* Begin *********/
// 重写 Shape 中的 area 方法,计算球的表面积,将计算结果返回
public double area(){
return (4*Math.PI*r*r);
}
/********** End **********/
}
重写 Cat 类中的 toString 方法,返回 Cat 类的基本信息
/**
* 任务:重写 Cat 类中的 toString 方法,返回 Cat 类的基本信息。
*/
class Animal{
private String name; // 动物名称
private int age; // 动物年龄
// 返回动物类的基本信息
public String toString() {
return "Anaimal{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class Cat extends Animal{
private String name; // 小猫的名称
private int age; // 小猫年龄
public Cat(String name, int age) {
this.name = name;
this.age = age;
}
// 请在下面的Begin-End之间按照注释中给出的提示编写正确的代码
/********* Begin *********/
// 重写 Anaimal 中的 toString 方法,返回类型为 String,格式:我是一只名为xx的小猫,今年xx岁了
public String toString(){
return ("我是一只名为"+name+"的小猫,今年"+age+"岁了");
}
/********** End **********/
}
谢谢观看!