多态与封装

JavaJavaBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

介绍

封装(Encapsulation)就像一个袋子,将对象的操作和相关数据封装在一起。多态(Polymorphism)是指一个对象能够呈现多种形态的能力。在这个实验中,你将了解它们的具体表现。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/ObjectOrientedandAdvancedConceptsGroup(["Object-Oriented and Advanced Concepts"]) java/ObjectOrientedandAdvancedConceptsGroup -.-> java/class_attributes("Class Attributes") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/class_methods("Class Methods") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/inheritance("Inheritance") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/polymorphism("Polymorphism") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/encapsulation("Encapsulation") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/interface("Interface") subgraph Lab Skills java/class_attributes -.-> lab-178551{{"多态与封装"}} java/class_methods -.-> lab-178551{{"多态与封装"}} java/inheritance -.-> lab-178551{{"多态与封装"}} java/polymorphism -.-> lab-178551{{"多态与封装"}} java/encapsulation -.-> lab-178551{{"多态与封装"}} java/interface -.-> lab-178551{{"多态与封装"}} end

多态(Polymorphism)

多态是面向对象编程(OOP)的特性之一,它允许我们以不同的方式执行单一操作。在编译时解析的多态称为静态多态编译时多态(重载属于这种类型)。在运行时解析的多态称为运行时多态(重写属于这种类型)。多态还提供了对象呈现多种形态的能力。在 OOP 中,多态的一个常见用法是使用父类引用指向子类对象。任何能够通过多个 IS-A 测试的 Java 对象都被认为是多态的。引用变量可以指向其声明类型的任何对象或其声明类型的任何子类型。引用变量可以声明为类类型接口类型。继承是多态的一种形式,因为动物的行为和特征有多种不同的表现。但在这里,我们介绍另一种形式的多态:

多态类图

示例:

/home/labex/project/polymorphismTest.java 文件中编写以下代码:

// 我们声明一个接口 life,它有一些方法,这里我们省略了它们。
interface life{}
// 声明一个类来实现多态,内部内容在此案例中忽略。
class Animal{}
// 声明一个 Human 类,使用 Animal 类和 life 接口。
class Human extends Animal implements life{}

public class polymorphismTest{
    public static void main(String[] args){
        Human human = new Human();  // 实例化一个 Human 对象
        // Human 与 Animal、Object 有直接或间接的继承关系
        // Human 实现了 life 接口,因此 instanceof 表达式返回 true
        System.out.println("human is instance of Human? " + (human instanceof Human));
        System.out.println("human is instance of Animal? " + (human instanceof Animal));
        System.out.println("human is instance of life? " + (human instanceof life));
        System.out.println("human is instance of Object? " + (human instanceof Object));
    }
}

输出:

使用以下命令运行 polymorphismTest.java 文件:

javac /home/labex/project/polymorphismTest.java
java polymorphismTest

查看输出:

human is instance of Human? true
human is instance of Animal? true
human is instance of life? true
human is instance of Object? true

封装(Encapsulation)

封装是一种让我们隐藏程序细节的概念。其他调用者只需要知道程序能提供什么,而不需要知道它是如何工作的。封装简化了开发过程。它是一种将数据(变量)和算法(方法代码)包装在一起的机制。在封装中,类的变量将对其他类隐藏,只能通过类的方法访问。因此,它也被称为数据隐藏。通常,类的字段被声明为私有(private),我们使用 getter/setter 方法来访问和控制数据。我们定义公共(public)方法只是为了向其他类或外部使用提供功能。有时我们定义私有(private)方法,这些方法仅在类内部用于某些特定用途。这就是我们隐藏细节的方式。

示例:

/home/labex/project/encapsulationTest.java 文件中编写以下代码:

class Person{
    /*
     * Person 类中有两个成员变量
     * 它们是私有的,因此不能直接从类外部访问。
    */
    private String name;
    private int age;
    // 空构造函数
    public Person(){

    }
    // 带两个参数的构造函数
    public Person(String name,int age){
        this.name = name;
        this.age = age;
    }
    // 使用此方法获取 name 值
    public String getName(){
        return this.name;
    }
    // 使用此方法设置 name 值
    public void setName(String name){
        this.name = name;
    }
    // 使用此方法获取 age 值
    public int getAge(){
        return this.age;
    }
    // 使用此方法设置 age 值
    public void setAge(int age){
        this.age = age;
    }
}
public class encapsulationTest{
    public static void main(String[] args){
        Person p = new Person();
        // 使用 setXXX() 方法设置一个人的姓名和年龄
        p.setName("Mike");
        p.setAge(20);
        // 使用 getXXX() 方法获取一个人的姓名和年龄
        System.out.println("Name: " + p.getName() + ", Age: " + p.getAge());
    }
}

输出:

使用以下命令运行 encapsulationTest.java 文件:

javac /home/labex/project/encapsulationTest.java
java encapsulationTest

查看输出:

Name: Mike, Age: 20

总结

通过封装,我们不需要直接使用 object.XXX 来访问对象的数据或属性,而是使用 getXXX()setXXX() 等形式的标准方法来完成操作。在泛型编程中,多态的优势将会显现,但目前你只需要记住,多态允许一个对象呈现多种形态。