-
为描述和处理个人信息,定义类Person:
class Person{
public String name;
public int age;
public Date birthDate;
public String getIofo() {
......
}
}
-
为描述和处理学生信息,定义类Student:
class Student{
public String name;
public int age;
public Date birthDate;
public String school;
public String getIofo() {
//......
}
}
-
通过继承,简化Student类的定义:
class Student extends Person{
public String school;
}
Student类继承了父类Person的所有属性和方法,并增加了一
个属性school。Person中的属性和方法,Student都可以使用。
为什么要有继承?
多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。即子类不是父类的子集,而是对父类的“扩展”。
子类对象的创建
在类的声明中,可以通过使用关键字 extends 来显式地指明其父类。
语法格式如下:
[修饰符] class 子类名 extends 父类名
● 修饰符:可选参数,用于指定类的访问权限,可选值为 public、abstract 和 final。
● 子类名:必选参数,用于指定子类的名称。类名必须是合法的 Java 标识符,在一般情况下,要求首字母大写。
●extends 父类名:必选参数,用于指定要定义的子类继承于哪个父类。
继承的使用原则
子类可以继承父类中所有可被子类访问的成员变量和成员方法,但必须遵循以下原则。
(1)子类能够继承父类中被声明为 public 和 protected 的成员变量和成员方法,但不能继承被声明为 private 的成员变量和成员方法。
(2)子类能够继承在同一个包中的由默认修饰符修饰的成员变量和成员方法。
(3)如果子类声明了一个与父类的成员变量名称相同的成员变量,则子类不能继承父类的成员变量。此时子类的成员变量隐藏了父类的成员变量。
(4)如果子类声明了一个与父类的成员方法名称相同的成员方法,则子类不能继承父类的成员方法。此时子类的成员方法覆盖了父类的成员方法。
【例 】 定义一个动物类 Animal 及它的子类 Bird。(1)创建一个名称为 Animal 的类,并在该类中声明两个成员变量 live 和两个成员方法,分别为eat() 和 move(),具体代码如下:
public class Animal{
public boolean live = true;
public String skin = "";
public void eat(){
Systeam.out.println("动物需要吃食物");
}
public void move(){
Systeam.out.println("动物会运动");
}
}
(2)创建一个 Animal 类的子类 Bird,在该类中隐藏父类的成员变量 skin,并且覆盖成员方法 move(),具体代码如下:
public class Bird extends Animal{
public String skin = "羽毛";
public void move(){
Systeam.out.println("鸟会飞翔");
}
}
(3)创建一个名称为 Zoo 的类,在该类的 main() 方法中创建子类Bird 的对象并为该对象分配内存,然后使该对象调用该类的成员方法及成员变量,具体代码如下:
public class Zoo{
public static void mian(String[] args){
Bird bird = new Bird();
bird.eat();
bird.move();
Systeam.out.println("鸟有:"+bird.skin);
}
}
eat() 方法是从父类 Animal 继承的方法,move() 方法是子类 Bird 声明的覆盖父类成员方法的成员方法,skin 变量是子类的成员变量。
Java只支持单继承和多层继承,不允许多重继承
- 一个子类只能有一个父类
- 一个父类可以派生出多个子类
- class SubDemo extends Demo{ } //ok
-
class SubDemo extends Demo1,Demo2...//error
子类的继承
子类中的一部分成员是子类自己声明和创建的,另一部分是通过它的父类继承的。在 Java 中,Object 类是所有类的祖先类,也就是说,任何类都继承于 Object 类。除 Object 类以外的每个类,有且仅有一个父类,而一个类可以有零个或多个子类。
1.同一包中的子类与父类
如果子类与父类在同一包中,则子类会继承父类中非 private 修饰的成员变量和方法。
2.非同一包中的子类与父类
当子类与父类不在同一包中时,父类中使用 private 修饰的成员变量和友好的成员变量不会被继承,也就是说,子类只能继承父类中使用 public 和 protected 修饰的成员变量作为子类的成员变量,同样地,子类也只能继承父类中使用 public 和 protected 修饰的成员方法作为子类的成员方法。
3.继承关系的 UML 图
当一个类是另一个类的子类时,可以通过 UML 图使用实线连接两个类来表示二者之间的继承关系。实线的起始端是子类的 UML 图,实线的终止端是父类的 UML 图。在实线的终止端使用一个空心三角形表示实线的结束。
4.继承中的 protected
在一个 A 类中,它所定义的成员变量和方法都被 protected 所修饰。如果 A 类被 B 类、C 类继承,则在 B 类与 C 类中都继承了 A 类的成员变量和方法。这时,如果在 C 类中创建一个自身的对象,则该对象可以访问父类的和自身定义的 protected 修饰的成员变量和方法。但是在其他类中,如 Student 类,对于子类 C 自己声明的 protected 修饰的成员变量和方法,只要 Student 类与 C 类在同一包中,创建的对象就可以访问这些被 protected 修饰的成员变量和方法。对于子类 C 从父类中继承的 protected 修饰的成员变量和方法,只要 Student 类与 C 类的父类在同一包中,创建的对象就能够访问继承的 protected 修饰的成员变量和方法。