JAVA 面向对象程序设计(三)工具类的实现

在Java面向对象程序设计中,包(package)是一个非常重要的概念,它主要用于组织和管理类,避免命名冲突,以及控制访问权限。以下是对Java包的详细知识介绍:

一、包的定义与作用

  1. 定义:

包是Java中用于组织类的一种机制,它可以将功能相近或相关的类划分到同一个包中,便于管理和维护。

  2. 作用:

  • 避免类重名:通过包名+类名的形式,确保类的唯一性。

  • 分类组织:将功能相近的类划分到同一个包中,便于项目的层次划分和管理。

  • 控制访问权限:通过包访问修饰符(如public、默认包访问权限等)来控制类、方法和变量的访问范围。

二、包的声明与创建

  1. 声明包:

使用package关键字来声明一个包,该语句必须位于Java源文件的首行。例如:package com.example.myapp;。

  2. 创建包:

在文件系统中,包对应于目录结构。例如,声明为package com.example.myapp;的包,在文件系统中应创建一个com/example/myapp的目录路径。

  3. 注意事项:

  • 包名通常使用小写字母,并使用点(.)分隔不同的层级。

  • 习惯上使用公司的域名倒置作为包名的前缀,以确保包名的唯一性。

三、导入包中的类

  1. 导入方式:

使用import关键字来导入其他包中的类。例如:import java.util.ArrayList;。

  2. 静态导入:

使用import static关键字来导入静态方法或静态字段。例如:import static java.lang.Math.sqrt;。

  3. 通配符导入:

使用*通配符来导入包中的所有类或接口。例如:import java.util.*;(但通常不推荐这种做法,因为它可能导致命名冲突)。

  4. 注意事项:

  • 如果导入的类或接口位于java.lang包中,则可以省略import语句,直接使用简名称。

  • 如果在代码中使用了不同包中的同名类,则需要使用完整的类名来区分。

四、包的访问权限控制

  1. 包访问权限:

如果类、方法或变量没有使用任何访问修饰符(即默认包访问权限),则它们只能被同一个包中的其他类访问。

  2. public访问权限:

使用public修饰符的类、方法或变量可以被任何其他类访问,无论它们是否位于同一个包中。

  3. protected和private访问权限:

在包级别上,protected和private修饰符的作用与在类级别上略有不同。protected修饰的成员可以被同一个包中的其他类以及所有子类访问;而private修饰的成员则只能被其所在的类访问。

五、常见的系统包

Java标准库中包含了大量的系统包,这些包提供了丰富的功能和类库,如:

  • java.util:包含集合框架、日期时间API、随机数生成器等实用工具类。

  • java.io:包含用于输入输出的类,如文件读写、网络通信等。

  • java.net:提供网络编程的类,如套接字通信、URL访问等。

  • java.sql:提供JDBC API,用于数据库访问和操作。

  • java.awt和javax.swing:提供图形用户界面(GUI)组件和布局管理器,用于构建桌面应用程序。

这些系统包是Java开发的基础,掌握它们的使用对于提高开发效率和代码质量至关重要。

综上所述,Java中的包是组织和管理类的重要机制,它提供了避免命名冲突、分类组织代码以及控制访问权限的功能。通过合理使用包,可以使Java项目更加结构清晰、易于维护。

封装

在Java面向对象程序设计中,封装是一个核心概念。封装将对象的属性和方法(或服务)结合为一个独立的整体,并尽可能隐藏对象的内部实现细节。以下是Java封装详细知识的归纳:

一、封装的概念

封装是指将对象的属性和方法包装在一起,形成一个独立的单元,并隐藏对象的内部实现细节,仅对外提供接口进行交互。通过封装,可以提高代码的安全性、可维护性和可重用性。

二、封装的作用

  1. 数据隐藏:

封装将对象的属性隐藏在类的内部,外部只能通过类提供的接口(即方法)来访问和操作这些属性。这可以避免外部程序直接访问和修改对象的内部信息,从而保证数据的安全性。

  2. 控制访问权限:

通过访问控制修饰符(如public、protected、private等),可以控制外部对类内部属性和方法的访问权限。这有助于实现数据的封装和隐藏,同时提供必要的访问接口。

  3. 数据检查:

在封装的过程中,可以对数据进行检查,以确保数据的完整性和有效性。例如,在setter方法中,可以添加逻辑判断来验证输入数据的合法性。

  4. 便于修改和维护:

由于封装隐藏了对象的内部实现细节,因此当需要修改类的内部实现时,只需要修改类的内部代码,而不需要修改外部代码。这降低了代码之间的耦合度,提高了代码的可维护性。

  5. 增强代码的复用性:

封装好的类可以被多个地方重复使用。这有助于提高开发效率,减少重复代码。

三、封装的实现

在Java中,封装主要通过访问控制修饰符和getter/setter方法来实现。

  1. 访问控制修饰符:

  • public:表示公共的,可以被任何其他类访问。

  • protected:表示受保护的,可以被同一个包中的其他类以及所有子类访问。

  • private:表示私有的,只能被其所在的类访问。

  • default(包访问权限):没有指定访问修饰符时,默认为包访问权限,即只能在同一个包内被访问。

  2. getter/setter方法:

  • 对于私有属性,通常会提供public的getter和setter方法来访问和修改这些属性。

  • getter方法用于获取属性的值,setter方法用于设置属性的值。

  • 在setter方法中,可以添加一些逻辑判断,以保证设置的数据是合法的。

四、封装的示例

以下是一个简单的Java类封装示例:

 public class Person {
    // 私有属性
    private String name;
    private int age;

    // 公共方法(getter和setter方法)
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if (age < 0 || age > 150) {
            System.out.println("Age is invalid!");
            return;
        }
        this.age = age;
    }
}

在上面的示例中,Person类包含两个私有属性name和age,以及相应的getter和setter方法。通过使用私有属性,我们隐藏了Person类的内部实现细节;通过使用getter和setter方法,我们提供了对私有属性的访问和操作接口。在setAge方法中,我们还进行了数据检查,以确保输入的年龄值在有效范围内。

五、封装的注意事项

  1. 属性的访问权限尽量最小化:

为了提高安全性,应尽量将属性的访问权限设置为私有(private),并通过公共的getter和setter方法来访问和修改这些属性。

  2. 提供必要的访问方法:

虽然属性被设置为私有,但仍需要提供必要的公共方法来访问和修改这些属性。这些方法应该具有明确的命名和合理的参数验证逻辑。

  3. 避免直接暴露内部实现细节:

在封装过程中,应避免直接暴露类的内部实现细节。例如,不应将内部数据结构直接暴露给外部类,而应通过公共方法来提供必要的功能。

综上所述,封装是Java面向对象编程中的一个重要概念。通过合理使用访问控制修饰符和getter/setter方法,可以有效地实现Java封装,编写出更加健壮、可维护和可复用的代码。

多态性

Java面向对象程序设计中的多态性是一个核心概念,它极大地提高了代码的灵活性和可扩展性。以下是对Java多态性的详细解析:

一、多态性的定义

多态性(Polymorphism)是指允许不同类的对象对同一消息作出响应,即同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在Java中,多态性主要通过两种形式实现:编译时多态(也称为方法重载)和运行时多态(也称为方法重写)。但需要注意的是,通常所说的多态性指的是运行时多态,即通过父类或接口类型变量引用子类对象,并调用相同的方法,但实际执行的却是子类中被重写(覆盖)的方法。

二、多态性的实现条件

  1. 继承关系:

多态性通常通过一个父类用变量引用子类对象来实现,所以存在继承关系的类之间才能够使用多态性。

  2. 方法重写:

子类必须重写父类的方法。通过在子类中重新定义和实现父类的方法,可以根据子类的特点行为改变这个方法的行为。

三、多态性的实现方式

  1. 继承中的多态性

      • 子类会继承父类的所有属性和方法(除了构造方法和私有方法)。

      • 当子类需要修改父类方法的实现时,可以通过重写父类方法来实现。

      • 这样,在调用子类对象的方法时,就会执行子类重写后的方法,而不是父类的方法。

  2. 接口中的多态性

      • 接口定义了一组方法的规范,但不提供具体的实现。

      • 实现接口的类必须提供接口中所有方法的具体实现。

      • 当使用接口引用指向实现了该接口的类的对象时,就可以调用接口中定义的方法。

四、多态性的特点

  1. 提高代码的灵活性:

多态性允许在程序中增加新的子类,而无需修改现有代码,这减少了代码的耦合度,提高了系统的可扩展性。

  2. 实现接口重用:

多态性使得程序可以根据对象的实际类型来调用相应的方法,从而实现了更加灵活的行为。这允许在不改变程序结构的情况下,通过替换不同的子类对象来改变程序的行为。

  3. 代码可维护性高:

通过多态性,可以将公共的代码放在父类中,而子类只需要关注自己特有的行为。这样,当需要修改公共行为时,只需修改父类即可,无需在每个子类中逐一修改。

  4. 代码清晰易懂:

多态性允许使用父类类型的引用来引用子类对象,从而简化了代码结构,使得代码更加清晰易懂。

五、多态性的应用场景

  1. 接口和抽象类的使用:

通过定义接口或抽象类,在父类中声明一组方法,具体实现留给子类。通过面向接口编程,可以实现不同类型的对象对统一接口的调用,提高代码的灵活性和扩展性。

  2. 方法重写和回调机制:

通过在父类中定义一个回调方法,在子类中重写该方法,并由父类对象调用,实现根据不同子类的具体实现来执行相应的逻辑。

六、多态性的实现示例

以下是一个简单的示例,展示了继承中的多态性:
 

// 父类 Animal
class Animal {
    void sound() {
        System.out.println("The animal makes a sound");
    }
}

// 子类 Dog 继承自 Animal,并重写了 sound 方法
class Dog extends Animal {
    @Override
    void sound() {
        System.out.println("The dog barks");
    }
}

// 子类 Cat 继承自 Animal,并重写了 sound 方法
class Cat extends Animal {
    @Override
    void sound() {
        System.out.println("The cat meows");
    }
}

// 测试类
public class Test {
    public static void main(String[] args) {
        Animal animal1 = new Dog(); // Animal 引用指向 Dog 对象
        Animal animal2 = new Cat(); // Animal 引用指向 Cat 对象
        animal1.sound(); // 输出 "The dog barks"
        animal2.sound(); // 输出 "The cat meows"
    }
}

在这个示例中,创建了一个父类Animal和两个子类Dog和Cat。Dog和Cat都重写了Animal的sound方法。在Test类中,创建了两个Animal类型的引用animal1和animal2,但分别指向了Dog和Cat的对象。当调用animal1和animal2的sound方法时,实际上调用的是Dog和Cat的sound方法,而不是Animal的sound方法,这就是多态性的体现。

综上所述,Java中的多态性是面向对象编程中的一个重要概念,它允许不同类型的对象对同一方法进行不同的实现,从而提高了代码的灵活性和可扩展性。

系统类库API

JAVA面向对象程序设计系统类库API的详细知识涉及多个方面,以下是关于Java类库API的详细解析:

一、Java类库API概述

Java类库API是Java编程语言的一部分,它提供了一组文档,用于描述Java编程语言的标准类、接口、方法和属性。这些类库和API为开发者提供了丰富的功能,帮助开发者快速构建应用程序,而无需从头开始编写所有代码。

二、Java常用类库与API

  1. java.lang包

      • 描述:包含了Java语言的核心类,如String、Object、Math等。

      • 功能:提供基本的类和方法,用于处理字符串、基本数据类型、对象等。

  2. java.util包

      • 描述:提供了大量的实用工具类,如集合框架(ArrayList、HashMap等)、日期和时间处理(Date、Calendar等)、随机数生成器(Random)、输入输出操作(Scanner等)。

      • 功能:支持数据结构的存储和管理、日期和时间的处理、随机数的生成以及用户输入的读取等。

  3. java.io包

      • 描述:提供了各种用于进行输入输出操作的类和接口,如文件读写(File、FileReader、FileWriter等)、流(InputStream、OutputStream等)。

      • 功能:支持文件的读写操作、网络通信中的数据传输等。

  4. java.net包

      • 描述:提供了用于网络编程的类和接口,如Socket、ServerSocket等。

      • 功能:支持网络连接的创建、数据的发送和接收等。

  5. java.sql包

      • 描述:提供了与数据库交互的类和接口,用于执行SQL查询、连接数据库、处理事务等。JDBC(Java Database Connectivity)是Java与关系型数据库进行交互的标准API。

      • 功能:支持数据库的连接、查询、更新等操作。

  6. java.awt包和javax.swing包

      • 描述:提供了用于创建图形用户界面(GUI)的类和接口。awt包提供了原始的窗口、按钮、文本框等组件,而swing包则提供了更强大和可定制的GUI组件。

      • 功能:支持GUI应用程序的开发,提供丰富的界面组件和布局管理。

三、API的使用示例

  1. 使用java.util.Scanner类读取用户输入

 import java.util.Scanner;

   public class InputExample {
       public static void main(String[] args) {
           Scanner scanner = new Scanner(System.in);
           System.out.print("请输入你的名字:");
           String name = scanner.nextLine();
           System.out.println("你好," + name + "!");
           scanner.close();
       }
   }

  2. 使用java.io.FileWriter类写入文件

 import java.io.FileWriter;
   import java.io.IOException;

   public class FileWriteExample {
       public static void main(String[] args) {
           try {
               FileWriter writer = new FileWriter("example.txt");
               writer.write("Hello, World!");
               writer.close();
               System.out.println("文件写入成功!");
           } catch (IOException e) {
               System.out.println("文件写入失败:" + e.getMessage());
           }
       }
   }

  3. 使用java.util.ArrayList集合类

 import java.util.ArrayList;

   class Student {
       String name;
       int age;

       public Student(String name, int age) {
           this.name = name;
           this.age = age;
       }

       @Override
       public String toString() {
           return "Student{" + "name='" + name + '\'' + ", age=" + age + '}';
       }
   }

   public class ArrayListExample {
       public static void main(String[] args) {
           ArrayList<Student> students = new ArrayList<>();
           students.add(new Student("张三", 20));
           students.add(new Student("李四", 22));
           students.add(new Student("王五", 19));

           // 遍历并打印学生信息
           for (Student student : students) {
               System.out.println(student);
           }

           // 修改和删除学生信息(示例操作)
           // ...
       }
   }

四、Java API文档的使用技巧

  1. 查阅API文档:

当需要对某个类、接口或方法进行详细了解时,可以查阅Java API文档。这些文档通常包含在JDK中,并可以通过IDE(如Eclipse、IntelliJ IDEA等)或在线方式访问。

  2. 理解类和方法:

通过阅读API文档,可以了解类的继承关系、方法的参数类型、返回值类型以及方法的详细描述。这有助于开发者正确使用API并避免常见的错误。

  3. 实践与应用:

将API文档中的知识与实际编程相结合,通过实践加深理解和记忆。在编写代码时,可以参考API文档中的示例代码或自己编写示例代码进行验证。

综上所述,Java类库API是Java编程中的重要组成部分,它提供了丰富的功能和便捷的操作方式。通过深入了解和使用这些API,开发者可以更加高效地构建应用程序并提升编程技能。

集合

Java面向对象程序设计中的集合是一个重要的概念,它提供了一种组织和存储对象的方式。以下是对Java集合的详细知识归纳:

一、集合的基本概念

集合可以看作是一种容器,用来存储对象信息。在Java中,集合类主要位于java.util包下,用于保存数量不确定的数据,以及保存具有映射关系的数据。与数组相比,集合的长度是可变的,且集合只能存储对象,而数组既可以存储基本类型的值,也可以存储对象。

二、集合框架

Java集合框架是Java平台提供的表示和操作集合的统一架构。它主要包含以下三个部分:

  1. 集合接口:

接口是用于表示集合的抽象数据类型,允许集合操作独立于表示细节。Java集合框架中的核心集合接口封装了不同的集合类型,允许集合的操作独立于集合的具体表示。

  2. 集合实现:

实现是指实现了对应集合接口的一些具体类,本质上是可重用的数据结构。集合实现包括通用功能实现、特殊功能实现、并发实现、封装实现、快捷实现和抽象实现。

  3. 集合算法:

算法是实现了集合接口的对象中执行具体计算(如查找、排序等)的方法。同一个方法可以用于适当集合接口的不同实现。

三、核心集合接口

Java集合框架中的核心集合接口主要包括:

  1. Collection接口:

这是集合核心接口的根接口,是所有集合都需要实现的最大抽象定义。Collection接口可以用于表示一组对象,每个对象称为元素。

  2. Set接口:

Set是Collection接口的子接口,表示不包含重复元素的集合,用于表示数学中集的概念。

  3. List接口:

List也是Collection接口的子接口,表示有序的集合,有时也称为序列(Sequence)。可以对列表中每个元素的插入位置进行控制,可以根据元素的整数索引(在列表中的位置)来访问元素,并搜索列表中的元素。与Set不同,列表通常允许重复的元素。

  4. Map接口:

Map接口将键映射到值的对象。

  5. SortedSet接口和SortedMap接口:

这两个接口分别表示元素有序的Set和Map。

四、集合实现类

Java集合框架提供了多种集合实现类,以满足不同的需求。以下是一些常用的集合实现类:

  1. Set接口的实现类:

  • HashSet:基于HashMap实现,按照hash算法来存储元素,有很好的存取和查找性能。但不能保证元素的顺序,允许有null值。

  • LinkedHashSet:HashSet的一个子类,具有HashSet的特性,也是根据元素的hashCode值来决定元素的存储位置。但它使用链表维护元素的次序,元素的顺序与添加顺序一致。

  • TreeSet:SortedSet接口的实现类,TreeSet可以保证元素处于排序状态,它采用红黑树(https://baike.baidu.com/item/%E7%BA%A2%E9%BB%91%E6%A0%91/2413209)的数据结构来存储集合元素。

  2. List接口的实现类:

  • ArrayList:基于动态数组的实现,支持随机访问,但在插入、删除元素时可能涉及大量元素的移动,因此效率较低。

  • LinkedList:基于链表实现,支持快速的插入、删除操作,但在随机访问元素时效率较低。

  3. Map接口的实现类:

  • HashMap:基于哈希表的实现,提供了快速的键值对查找功能。

  • TreeMap:基于红黑树(https://baike.baidu.com/item/%E7%BA%A2%E9%BB%91%E6%A0%91/2413209)的实现,可以对键进行排序。

  • LinkedHashMap:是HashMap的一个子类,它维护了一个双向链表,用于记录插入顺序或访问顺序。

五、集合的遍历

在Java中,可以使用多种方式遍历集合。常用的遍历方式包括:

  1. for-each循环:

这是遍历集合最简单、最常用的方式。它适用于实现了Iterable接口的集合类。

  2. 迭代器(Iterator):

Iterator接口提供了遍历集合的统一接口。通过迭代器,可以在遍历过程中安全地移除元素。

  3. 增强for循环(for-each的语法糖):

本质上也是通过迭代器来实现的。

  4. ListIterator:

这是Iterator的子接口,专门用于遍历List集合。它提供了在遍历过程中添加、删除、替换元素的方法。

  5. Map的遍历:

对于Map集合,通常使用entrySet()方法获取键值对集合,然后使用for-each循环或迭代器进行遍历。

六、集合算法

Java集合框架还提供了一些常用的集合算法,如排序、置换、查找等。这些算法都是多态算法,提供可重用的功能,并且全部使用静态方法。大多数算法都是针对List对象操作的,但也有部分是操作Collection对象的。例如,在Collections类中提供了如下算法:

  1. sort(List<T> list):

根据元素的自然顺序对指定列表进行排序。

  2. shuffle(List<?> list):

使用默认随机源对指定列表进行置换。

  3. binarySearch(List<? extends Comparable<? super T>> list, T key):

使用二分搜索法搜索指定列表。

综上所述,Java面向对象程序设计中的集合是一个功能强大且灵活的概念。通过理解和使用集合框架,可以更有效地组织和操作对象集合。

Java 增强特性

Java面向对象程序设计中的集合是一个重要的概念,它提供了一种组织和存储对象的方式。以下是对Java集合的详细知识归纳:

一、集合的基本概念

集合可以看作是一种容器,用来存储对象信息。在Java中,集合类主要位于java.util包下,用于保存数量不确定的数据,以及保存具有映射关系的数据。与数组相比,集合的长度是可变的,且集合只能存储对象,而数组既可以存储基本类型的值,也可以存储对象。

二、集合框架

Java集合框架是Java平台提供的表示和操作集合的统一架构。它主要包含以下三个部分:

  1. 集合接口:

接口是用于表示集合的抽象数据类型,允许集合操作独立于表示细节。Java集合框架中的核心集合接口封装了不同的集合类型,允许集合的操作独立于集合的具体表示。

  2. 集合实现:

实现是指实现了对应集合接口的一些具体类,本质上是可重用的数据结构。集合实现包括通用功能实现、特殊功能实现、并发实现、封装实现、快捷实现和抽象实现。

  3. 集合算法:

算法是实现了集合接口的对象中执行具体计算(如查找、排序等)的方法。同一个方法可以用于适当集合接口的不同实现。

三、核心集合接口

Java集合框架中的核心集合接口主要包括:

  1. Collection接口:

这是集合核心接口的根接口,是所有集合都需要实现的最大抽象定义。Collection接口可以用于表示一组对象,每个对象称为元素。

  2. Set接口:

Set是Collection接口的子接口,表示不包含重复元素的集合,用于表示数学中集的概念。

  3. List接口:

List也是Collection接口的子接口,表示有序的集合,有时也称为序列(Sequence)。可以对列表中每个元素的插入位置进行控制,可以根据元素的整数索引(在列表中的位置)来访问元素,并搜索列表中的元素。与Set不同,列表通常允许重复的元素。

  4. Map接口:

Map接口将键映射到值的对象。

  5. SortedSet接口和SortedMap接口:

这两个接口分别表示元素有序的Set和Map。

四、集合实现类

Java集合框架提供了多种集合实现类,以满足不同的需求。以下是一些常用的集合实现类:

  1. Set接口的实现类:

  • HashSet:基于HashMap实现,按照hash算法来存储元素,有很好的存取和查找性能。但不能保证元素的顺序,允许有null值。

  • LinkedHashSet:HashSet的一个子类,具有HashSet的特性,也是根据元素的hashCode值来决定元素的存储位置。但它使用链表维护元素的次序,元素的顺序与添加顺序一致。

  • TreeSet:SortedSet接口的实现类,TreeSet可以保证元素处于排序状态,它采用红黑树(https://baike.baidu.com/item/%E7%BA%A2%E9%BB%91%E6%A0%91/2413209)的数据结构来存储集合元素。

  2. List接口的实现类:

  • ArrayList:基于动态数组的实现,支持随机访问,但在插入、删除元素时可能涉及大量元素的移动,因此效率较低。

  • LinkedList:基于链表实现,支持快速的插入、删除操作,但在随机访问元素时效率较低。

  3. Map接口的实现类:

  • HashMap:基于哈希表的实现,提供了快速的键值对查找功能。

  • TreeMap:基于红黑树(https://baike.baidu.com/item/%E7%BA%A2%E9%BB%91%E6%A0%91/2413209)的实现,可以对键进行排序。

  • LinkedHashMap:是HashMap的一个子类,它维护了一个双向链表,用于记录插入顺序或访问顺序。

五、集合的遍历

在Java中,可以使用多种方式遍历集合。常用的遍历方式包括:

  1. for-each循环:

这是遍历集合最简单、最常用的方式。它适用于实现了Iterable接口的集合类。

  2. 迭代器(Iterator):

Iterator接口提供了遍历集合的统一接口。通过迭代器,可以在遍历过程中安全地移除元素。

  3. 增强for循环(for-each的语法糖):

本质上也是通过迭代器来实现的。

  4. ListIterator:

这是Iterator的子接口,专门用于遍历List集合。它提供了在遍历过程中添加、删除、替换元素的方法。

  5. Map的遍历:

对于Map集合,通常使用entrySet()方法获取键值对集合,然后使用for-each循环或迭代器进行遍历。

六、集合算法

Java集合框架还提供了一些常用的集合算法,如排序、置换、查找等。这些算法都是多态算法,提供可重用的功能,并且全部使用静态方法。大多数算法都是针对List对象操作的,但也有部分是操作Collection对象的。例如,在Collections类中提供了如下算法:

  1. sort(List<T> list):

根据元素的自然顺序对指定列表进行排序。

  2. shuffle(List<?> list):

使用默认随机源对指定列表进行置换。

  3. binarySearch(List<? extends Comparable<? super T>> list, T key):

使用二分搜索法搜索指定列表。

综上所述,Java面向对象程序设计中的集合是一个功能强大且灵活的概念。通过理解和使用集合框架,可以更有效地组织和操作对象集合。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值