📜  哎呀!泛化为使用Java的扩展和限制

📅  最后修改于: 2022-05-13 01:55:00.564000             🧑  作者: Mango

哎呀!泛化为使用Java的扩展和限制

泛化是从两个或多个类中取出共同属性和功能并将它们组合成另一个类的过程,该类充当这些类的父类,或者我们可以说是那些专门类的泛化类。所有的子类都是超类的一种。所以我们可以说子类“is-A”超类。因此泛化被称为“is-A 关系”
下面是一个泛化的例子:

泛化例子

在这个图中,我们看到有两种类型的航班,所以我们创建了一个包含公共属性的航班类,然后我们有一个国际和国内类,它们是航班类的扩展,将具有航班及其属性自己的。这里的航班是父类/超类,另外两个是子类/子类。国际航班“is-a”航班以及国内航班。

示例 1:作为扩展的泛化

// super or parent class
class Person 
{
    static int count = 1;
    String name;
    int age;
    String gender;
}
  
// subclass or child of Person
class Student extends Person 
{ 
    // name, age and gender 
    // get inherited from Person
    int rollNo;
    String course;
}
  
// subclass of Person
class Teacher extends Person 
{ 
    // name, age and gender 
    // get inherited from Person
    static int count = 20;
    String subject;
    int experience;
}
  
class Test {
    public static void main(String[] s)
    {
        Teacher t = new Teacher();
        t.name = "Shaan";
  
        // name gets inherited in teacher
        System.out.println(t.name); 
  
         // will give priority to its own count
        System.out.println(t.count);
    }
}
输出:
Shaan
20

解释:我们有两个类 Teacher 和 Student,它们具有共同的属性,如姓名、年龄和性别,所以我们创建了另一个类 Person,它具有这些属性,然后从它扩展这两个类。现在,当我们创建教师类的对象时,我们也拥有人员类的所有属性。在这里,我们看到教师类有自己的计数值,因此这将隐藏父类的值。我们没有在教师类中给出“名称”属性,但我们仍然在使用它。这是因为父类的所有属性和方法都继承到子类中。我们在教师类中给出了仅属于教师类的附加属性。这些附加属性显示了泛化为子类提供的扩展。

示例 2:作为限制的泛化

// abstract super class
abstract class User
{
    String name;
    int age;
    String occupation;
  
    // abstract method
    abstract void fillForm(String name, String occupation); 
}
  
// non abstract sub class of User
class Doctor extends User 
{
    String specialization;
  
    // extra attributes
    int experience; 
  
    // doesn't give implementation of fillForm() method
}
class Test {
    public static void main(String[] s)
    {
        User u = new User();
  
        // extra attribute of child class so will
        // not be accessible to parent class
        u.experience = 10; 
          
    }
}

输出: 3 个错误——

  1. Doctor 不是抽象的,并且不会覆盖 User 中的抽象方法 fillForm(String, String)
    class Doctor extends User
                   ^
  2. 用户是抽象的;无法实例化
    User u = new User();
                      ^
  3. 找不到标志
    u.experience = 10;
                         ^

    符号:可变经验
    位置:用户类型的变量 u

说明:用户是一个抽象类,它有一个抽象方法fillForm(),因为病人和医生的表格不同,所以填写表格也会不同。现在医生类要么必须提供它的主体,要么必须声明自己是抽象的。这是超类对其子类提出的限制,即子类必须继承其所有属性和功能,并且不能跳过任何内容。他们可以通过覆盖现有特征来提供另一种实现,但不能跳过它。在这种情况下,这将产生编译错误,因为医生既不是抽象的,也没有为 fillform() 方法提供主体。另一个原因是 User 类没有经验属性,它仅在 Doctor 类中,因此用户无法访问它。

在上面的示例中,我们看到子类必须继承其父类的所有特征,尽管它可以通过覆盖它来改变其实现,但它不能忽略父类的任何特征。这显示了泛化的限制形式。
我们还看到子类有自己的属性,父类对象不能使用这些属性,因为这些扩展属性只属于子类。这种额外属性的添加显示
一种可扩展的泛化形式。