• 【计算机二级Java语言】卷001


    选择题

    公共知识

    【1】程序流程图中带有箭头的线段表示的是()。
    〖A〗图元关系
    〖B〗数据流
    〖C〗控制流
    〖D〗调用关系
    在数据流图中, 用标有名字的箭头表示数据流。
    在程序流程图中, 用标有名字的箭头表示控制流。
    所以选择C。
    【2】结构化程序设计的基本原则不包括()。
    〖A〗多态性
    〖B〗自顶向下
    〖C〗模块化
    〖D〗逐步求精
    结构化程序设计的思想包括:自顶向下、逐步求精、模块化、限制使用goto语句, 所以选择A。
    【3】软件设计中模块划分应遵循的准则是()。
    〖A〗低内聚低耦合
    〖B〗高内聚低耦合
    〖C〗低内聚高耦合
    〖D〗高内聚高耦合
    软件设计中模块划分应遵循的准则是高内聚低偶合、模块大小规模适当、模块的依赖关系适当等。
    模块的划分应遵循一定的要求, 以保证模块划分合理, 并进一步保证以此为依据开发出的软件系统可靠性强, 易于理解和维护。
    模块之间的耦合应尽可能的低, 模块的内聚度应尽可能的高。
    【4】在软件开发中, 需求分析阶段产生的主要文档是()。
    〖A〗可行性分析报告
    〖B〗软件需求规格说明书
    〖C〗概要设计说明书
    〖D〗集成测试计划
    A错误, 可行性分析阶段产生可行性分析报告。
    C错误, 概要设计说明书是总体设计阶段产生的文档。
    D错误, 集成测试计划是在概要设计阶段编写的文档。
    B正确, 需求规格说明书是后续工作如设计、编码等需要的重要参考文档。
    【5】算法的有穷性是指()。
    〖A〗算法程序的运行时间是有限的
    〖B〗算法程序所处理的数据量是有限的
    〖C〗算法程序的长度是有限的
    〖D〗算法只能被有限的用户使用
    算法原则上能够精确地运行, 而且人们用笔和纸做有限次运算后即可完成。
    有穷性是指算法程序的运行时间是有限的。
    【6】对长度为n的线性表排序, 在最坏情况下, 比较次数不是n(n - 1) / 2的排序方法是()。
    〖A〗快速排序
    〖B〗冒泡排序
    〖C〗直接插入排序
    〖D〗堆排序
    除了堆排序算法的比较次数是 , 其他的都是n(n - 1) / 2。
    【7】下列关于栈的叙述正确的是()。
    〖A〗栈按"先进先出"组织数据
    〖B〗栈按"先进后出"组织数据
    〖C〗只能在栈底插入数据
    〖D〗不能删除数据
    栈是按"先进后出"的原则组织数据的, 数据的插入和删除都在栈顶进行操作。
    【8】在数据库设计中, 将E - R图转换成关系数据模型的过程属于()。
    〖A〗需求分析阶段
    〖B〗概念设计阶段
    〖C〗逻辑设计阶段
    〖D〗物理设计阶段
    E - R图转换成关系模型数据则是把图形分析出来的联系反映到数据库中, 即设计出表, 所以属于逻辑设计阶段。
    【9】有三个关系R、S和T如下:

    由关系R和S通过运算得到关系T, 则所使用的运算为()。
    〖A〗
    〖B〗自然连接
    〖C〗笛卡尔积
    〖D〗
    自然连接是一种特殊的等值连接, 它要求两个关系中进行比较的分量必须是相同的属性组, 并且在结果中把重复的属性列去掉, 所以B错误。
    笛卡尔积是用R集合中元素为第一元素, S集合中元素为第二元素构成的有序对, 所以C错误。
    根据关系T可以很明显的看出是从关系R与关系S中取得相同的关系组, 所以取得是交运算, 选择D。
    【10】设有表示学生选课的三张表, 学生S(学号, 姓名, 性别, 年龄, 身份证号), 课程C(课号, 课名), 选课SC(学号, 课号, 成绩), 则表SC的关键字(键或码)为()。
    〖A〗课号, 成绩
    〖B〗学号, 成绩
    〖C〗学号, 课号
    〖D〗学号, 姓名, 成绩
    学号是学生表S的主键, 课号是课程表C的主键, 所以选课表SC的关键字就应该是与前两个表能够直接联系且能唯一定义的学号和课号, 所以选择C。

    专业知识

    【11】下列标识符命名原则中, 正确的是()。
    〖A〗类名的首字母小写
    〖B〗变量和方法名的首字母大写
    〖C〗常量名大写
    〖D〗接口名的首字母小写
    java语言标识符命名规则为:类名和接口名每个单词首字母大写, 选项A、D错误; 变量和方法名遵循第一个单词首字母小写, 后面每个单词首字母大写。
    选项B错误; 常量名所有字母全部大写, 选项C正确; 本题答案为C选项。
    【12】Java程序独立于平台。下列关于字节码与各个操作系统及硬件之间关系的描述中, 正确的是()。
    〖A〗结合
    〖B〗分开
    〖C〗联系
    〖D〗融合
    JAVA之所以能够独立于平台做到"一次编译,到处运行", 主要得益于java虚拟机机制, 只有字节码与各个操作系统和硬件分开才能做到独立于平台。
    选项A、C、D错误; 选项B正确; 本题答案为B选项。
    【13】下列关于boolean类型的叙述中, 正确的是()。
    〖A〗可以将boolean类型的数值转换为int类型的数值
    〖B〗可以将boolean类型的数值转换为字符串
    〖C〗可以将boolean类型的数值转换为char类型的数值
    〖D〗不能将boolean类型的数值转换为其他基本数据类型
    在java中, boolean类型的值只有true和false, 无法与其他基本数据类型或引用数据类型之间进行相互转换, 选项A、B、C错误; 选项D正确; 本题答案为D选项。
    【14】下列程序的运行结果是()
    public class Test {
        public static void main(String[] args) {
            System.out.println(3 > 2 ? 4 : 5);
        }
    }
    
    〖A〗2
    〖B〗3
    〖C〗4
    〖D〗5
    本题考查条件运算符的应用。
    条件运算符的语法为:布尔表达式?值1:值2; 当布尔表达式的值为true时, 条件表达式的值为值1的值; 当布尔表达式的值为false时, 条件表达式的值为值2的值。
    题目中布尔表达式"3>2"的返回值为true, 则条件表达式的值为4。
    选项A、B、D错误, 选项C正确; 本题答案为C选项。
    【15】下列不属于表达式语句的是()。
    〖A〗++i;
    〖B〗j--;
    〖C〗b#a;
    〖D〗b *= a;
    表达式是有运算符和运算对象构成的, "#"不是java中运算符。
    故本题答案是C选项。
    【16】下列程序的运行结果是()
    public class Test {
        public static void main(String[] args) {
            int x = 3, y = 4, z = 5;
            String s = "xyz";
            System.out.println(s + x + y + z);
        }
    }
    
    〖A〗xyz12
    〖B〗xyz345
    〖C〗xyzxyz
    〖D〗s12
    本题考查"+"号在字符串中的应用, "+"在java中除了做加法操作之外, 还有一个非常重要的作用就是字符串的拼接操作。
    当"+"两边为基本数据类型时做加法操作, 任意一边为字符串类型时做拼接操作, 做拼接操作时数据类型自动转为字符串类型。
    题目中变量s为字符串类型, 变量x, y, z为整数类型, 所以表达式"s+x+y+z"等于"xyz345"。
    故本题答案为B选项。
    【17】下列程序的运行结果是()
    public class Test {
        public static void main(String[] args) {
            char k = 'a', p = 'f';
            int data = p - k;
            System.out.println(data);
        }
    }
    
    〖A〗5
    〖B〗0
    〖C〗a
    〖D〗f
    本题考查数据类型之间的转换。
    char类型的数据, 每个字符都有一个十进制的ASCII码值与之对应, 字符'a'对应的十进制数是97, 字符'f'对应的十进制数是102; 字符类型数据在做算术运算时会将自动转为相应的数据。
    所以data = p - k = 102 - 97 = 5; 故本题答案为A选项。
    【18】若希望下列代码段打印出"季军", 则变量x的取值范围是()
    if (x == 0)
        System.out.println("冠军");
    else if (x > -3)
        System.out.println("亚军");
    else
        System.out.println("季军");
    
    〖A〗x = 0
    〖B〗x > 0
    〖C〗x > -3
    〖D〗x <= -3
    本题考查的是分支结构if elseif else 。
    布尔表达式满足哪个分支中条件, 就执行哪个分支中的程序。
    题目要求输出"季军", 当if和else if中的条件不满足时, 执行else中的程序。
    A选项满足了if条件, 故不正确; 选项B、C满足else if中的条件, 故不正确; 选项D满足else中的条件, 选项D正确; 故本题答案为D选项。
    【19】下列程序的运行结果是()
    public class Test {
        public static void main(String[] args) {
            int s = 0;
            for (int i = 1; i < 5; i++)
                for (int j = 1; j <= i; j++)
                    s = s + j;
            System.out.println(s);
        }
    }
    
    〖A〗4
    〖B〗6
    〖C〗10
    〖D〗20
    本题考查for循环的嵌套。
    本题总, 外层循环总共循环4次, 内循环累加j的值。
    第一次循环时, i = 1, j = 1, 内循环执行1次, s = 1; 第二次循环时, i = 2, 内循环j从1循环至2, 循环2次, s = 1 + 1 + 2 = 4; 第三次循环时, i = 3, j从1循环至3, 循环3次, s = 4 + 1 + 2 + 3 = 10; 第四次循环时, i = 4, j从1循环至4, 循环4次, s = 10 + 1 + 2 + 3 + 4 = 20; 本题答案为D选项。
    【20】下列Java语句中属于跳转语句的是()
    〖A〗break
    〖B〗try
    〖C〗catch
    〖D〗finally
    break在java中作用为跳出循环, 选项A正确, 关键字try、catch、finally用来处理程序的异常, 选项B、C、D错误。
    本题答案为A选项。
    【21】下列关于构造方法的叙述中, 错误的是()。
    〖A〗Java语言规定构造方法名与类名必须相同
    〖B〗Java语言规定构造方法没有返回值, 且不用void声明
    〖C〗Java语言规定构造方法不可以重载
    〖D〗Java语言规定构造方法可以通过new自动调用
    java中构造方法的定义要求为:方法名必须与类名一致, 没有返回值, 也不能用void修饰, 构造方法分为有参构造方法和无参构造方法。
    有参和无参的构造方法属于方法的重载。
    构造方法在创建对象的时候自动调用有参构造方法或者无参构造方法。
    故本题答案为C选项。
    【22】下列程序的运行结果是()
    class Animal {
        public Animal() {
            System.out.print(" animal ");
        }
        public Animal(int n) {
            this();
            System.out.print(" " + n);
        }
    }
    class Dog extends Animal {
        public Dog() {
            super(12);
            System.out.println(" dog ");
        }
    }
    public class Test {
        public static void main(String[] args) {
            Animal animal = new Dog();
        }
    }
    
    〖A〗animal 12 dog
    〖B〗animal dog
    〖C〗dog animal 12
    〖D〗dog animal
    本题考查面向对象中继承, 多态, this, super关键字等。
    Test类中, Animal animal = new Dog(); 父类的引用指向了子类的对象。
    newDog(); 创建了子类对象, 调用Dog类的无参构造方法, 在类Dog的无参构造方法中, 执行了super(12); 此时调用了父类Animal的有参构造方法, 而父类Animal的有参构造方法中, 执行this(); 语句, 又调用本类的无参构造方法。
    所以执行结果先输出animal, 再输出 12, 最后输出dog。
    故本题答案为A选项。
    【23】子类继承了父类的方法和状态, 在子类中可以进行的操作是()
    〖A〗更换父类方法
    〖B〗减少父类方法
    〖C〗减少父类变量
    〖D〗增添方法
    在java中, 子类继承父类时, 可以在父类的基础上增加自己的属性和方法, 也可以重写父类中的方法, 但无法更换和减少父类的方法和属性, 本题答案为D选项。
    【24】下列代码段中, 能通过编译的是()
    〖A〗public class Animal { public void speak(); }
    〖B〗public abstract class Animal { public void speak() { } }
    〖C〗public class Animal { public abstract void speak(); }
    〖D〗public abstract class Animal { public abstract void speak() { } }
    抽象方法的定义需要加"abstract"关键字, 选项A错误; 抽象方法不能有方法体, 选项D错误; 含有抽象方法的类一定要是抽象类, 选项C错误; 抽象类中可以不包含抽象方法, 选项B正确。
    本题答案为B
    【25】有如下程序
    public class Test {
        public static void main(String[] args) {
            int[] x = { 0, 1, 2, 3 };
            for (int i = 0; i < 3; i += 2) {
                try {
                    System.out.println(x[i + 2] / x[i] + x[i + 1]);
                } catch (ArithmeticException e) {
                    System.out.println("error1");
                } catch (Exception e) {
                    System.out.println("error2");
                }
            }
        }
    }
    
    〖A〗error1
    〖B〗error2
    〖C〗error1 error2
    〖D〗2 error2
    第1次循环时, i = 0, 执行x[2] / x[0] + x[1]时, 因为x[0] = 0, 程序报"ArithmeticException"除数不能为0的异常, catch对其处理, 输出"error1"。
    第2次循环时, i = 2, 执行x[4] / x[2] + x[3], 数组x的下标最大值为3, 则程序会报异常:"ArraysIndexOutOfBoundsException"下标越界的异常, 程序中没有捕获此异常, 但存在异常的父类"Exception", 则执行父类异常中对异常的处理, 输出error2。
    本题答案为C选项。
    【26】自定义异常类的父类可以是()。
    〖A〗Error
    〖B〗VirtualMachineError
    〖C〗Exception
    〖D〗Thread
    在java中, 所有异常的父类为Exception类, 自定义异常继承Exception类。
    故本题答案为C选项。
    【27】下列方法中, 不属于类String的方法是()
    〖A〗toLowerCase()
    〖B〗valueOf()
    〖C〗charAt()
    〖D〗append()
    选项A、B、C都属于String类中的方法。
    String类没有append()方法。
    故本题答案为D选项。
    【28】为使下列代码正常运行, 应该在下划线处填入的选项是
    public class Test {
        public static void main(String[] args) {
            int[] numbers = new int[100];
            for (int i = 0; i < numbers.______________; i++)
                numbers[i] = i + 1;
        }
    }
    
    〖A〗size
    〖B〗length
    〖C〗dimension
    〖D〗measurement
    在java中, 获取数组长度的属性为length, 本题答案为B选项。
    【29】下列程序的功能是将一个整数数组写入二进制文件。在程序的下划线处应填入的选项是()
    import java.io.*;
    public class XieShuzu {
        public static void main(String[] a) {
            int[] myArray = { 10, 20, 30, 40 };
            try {
                DataOutputStream dos = new DataOutputStream(new FileOutputStream("ints.dat"));
                for (int i = 0; i < myArray.length; i++)
                    dos._________(myArray[i]);
                dos.close();
                System.out.println("已经将整数数组写入二进制文件:ints.dat");
            } catch (IOException ioe) {
                System.out.println("IO Exception");
            }
        }
    }
    
    〖A〗writeArray
    〖B〗writeByte
    〖C〗writeInt
    〖D〗writeDouble
    在java中, 整数类型默认以int类型为基本类型, 本题要求将整数类型数组myArray写入二进制文件, 将数组中的每个int类型数据写入文件。
    DataOutputStream类提供writeInt()方法, 将一个int值写入基础输出流中。
    本题答案为C选项。
    【30】所有字节输入输出流类都继承自()。
    〖A〗InputStream类和OutputStream类
    〖B〗Reader类和Writer类
    〖C〗object类
    〖D〗Serializable接口
    在java中, 所有字节输入输出流都继承自InputStream类和OutputStream类。
    故本题答案为A选项。
    【31】要得到某目录下的所有文件名, 在下列代码的下划线处应填入的内容是(两个下划线的填写内容相同)()
    __________ pathName = new _____________(args[0]);
    String[] fileNames = pathName.list();
    
    〖A〗FileInputStream
    〖B〗FileOutputStream
    〖C〗File
    〖D〗RandomAccessFile
    Java文件类以抽象的方式代表文件名和目录路径名。
    该类主要用于文件和目录的创建、文件的查找和文件的删除等。
    FileInputStream类、FileOutputStream类、RandomAccessFile类是对其内容进行读写, 选项A、B、D错误。
    本题答案为C选项。
    【32】RandomAccessFile是java.io包中的一个兼有输入输出功能的类。由于它是随机访问, 所以文件读写一个记录的位置是()
    〖A〗固定
    〖B〗任意
    〖C〗终止
    〖D〗起始
    RandomAccessFile(随机访问文件)类, RandomAccessFile对象类有个位置指示器, 指向当前读写处的位置, 当前读写n个字节后, 文件指示器将指向这n个字节后面的下一个字节处。
    刚打开文件时, 文件指示器指向文件的开头处, 可以移动文件指示器到新的位置, 随后的读写操作将从新的位置开始。
    本题答案为B选项。
    【33】下列代码中WindowAdapter处理的事件类是()
    public class MyWindow extends WindowAdapter {
        public void windowClosing(WindowEvent e) {
        }
        public void windowClosed(WindowEvent e) {
        }
        public void windowOpened(WindowEvent e) {
        }
    }
    
    〖A〗WindowEvent
    〖B〗windowOpened
    〖C〗windowClosing
    〖D〗windowClosed
    MyWindow类继承了WindowAdapter类, 在重写方法中传入的参数为WindowEvent类, 则处理的事件为WindowEvent类。
    本题答案为A选项。
    【34】下列可以获得构件前景色的方法是()。
    〖A〗getSize()
    〖B〗getForeground()
    〖C〗getBackground()
    〖D〗paint()
    getSize()方法是获取窗口的大小, 选项A错误; getForeground()获取构件前景色, 选项B正确; getBackground()获取构件后景色, 选项C错误; paint()绘画, 选项D错误。
    本题答案为B选项。
    【35】下列不属于Swing构件的是()
    〖A〗JMenu
    〖B〗JApplet
    〖C〗JOptionPane
    〖D〗Panel
    Swing构件是AWT的扩展, 它提供了许多新的图形界面构件。
    Swing构件以"J"开头。
    本题答案为D选项。
    【36】下列关于Java语言线程的叙述中, 正确的是()
    〖A〗线程是由代码、数据、内核状态和一组寄存器组成
    〖B〗线程间的数据是不共享的
    〖C〗因多线程并发执行而引起的执行顺序的不确定性可能造成执行结果的不确定
    〖D〗用户只能通过创建Thread类的实例或定义、创建Thread子类的实例建立和控制自己的线程
    一个标准的线程由线程ID, 当前指令指针(PC), 寄存器集合和堆栈组成, 选项A错误; 线程间的数据可以共享, 选项B错误; 多线程具有并发性, 多线程同时运行, 结果可能会出现紊乱, 选项C正确; 线程创建除了继承Thread类之外还可以实现Runnable接口, 选项D错误。
    本题答案为C选项。
    【37】阅读下列代码
    public class Test implements Runnable {
        public void run(Thread t) {
            System.out.println("Running.");
        }
        public static void main(String[] args) {
            Thread tt = new Thread(new Test());
            tt.start();
        }
    }
    
    编译运行代码的结果是()
    〖A〗抛出一个异常
    〖B〗没有输出并正常结束
    〖C〗输出"Running"并正常结束
    〖D〗出现一个编译错误
    Runnable接口中的run()方法没有参数列表, 重写时不能添加参数列表, 编译出错。
    选项D正确, 本题答案为D选项。
    【38】下列方法被调用后, 一定使调用线程改变当前状态的是()。
    〖A〗notify()
    〖B〗sleep()
    〖C〗yield()
    〖D〗isAlive()
    调用某个对象的notify()方法能够唤醒一个正在等待这个对象的对象锁的线程, 如果有多个线程都在等待这个对象的对象锁, 则只能唤醒其中一个线程, 选项A错误。
    sleep()使当前线程进入停滞状态, 所以执行sleep()的线程在指定的时间内肯定不会执行; yield()应该做的是让当前运行线程回到可运行状态, 以允许具有相同优先级的其他线程获得运行机会, 但有可能没有效果。
    选项B正确, 选项C错误。
    isAlive()功能是判断当前线程是否处于活动状态, 选项D错误。
    本题答案为B选项。
    【39】下列是一个支持多线程并发操作的堆栈类代码段, 在下划线处应填入的是()。
    public class MyStack {
        private int idx = 0;
        private int[] data = new int[8];
        public _______ void push(int i) {
            data[idx] = i;
            idx++;
        }
        … …
    }
    
    〖A〗synchronized
    〖B〗wait
    〖C〗blocked
    〖D〗interrupt
    本题考查的是同步锁的知识点。
    多个线程调用一个对象的多个方法, 这些方法都被synchronized修饰, 那么这些线程共同竞争一把锁, 最后表现的就是同步顺序执行各个被synchronized修饰的方法。
    本题答案为A选项。
    【40】向Applet传递参数的正确描述是()
    〖A〗<param name=age, value=20>
    〖B〗<applet code=Try.class width=100, height=100, age=33>
    〖C〗<name=age, value=20>
    〖D〗<applet code=Try.class name=age,value=20>
    Applet获取参数是通过HTML文件中采用<PARAM>标记定义参数。
    Java中还定义了相应的方法, 用来从HTML中获取参数。
    格式为:< param name = appletParameter1 value = value>。
    本题答案为A选项。

    编程题

    【41】在考生文件夹中存有文件名为Java_1.java的文件, 该程序是不完整的, 请在注释行"//**********Found**********"下一行语句的下划线地方填入正确内容, 然后删除下划线, 请勿删除注释行或改动其他已有语句内容。存盘时文件必须存放在考生文件夹下, 不得改变原有文件的文件名。
    本题的要求是:
    程序的功能是打印一个序列的前10项, 该序列的第1项和第2项都是1, 以后的每一项都是前面两项之和。
    完成程序, 使程序输出结果如下:
    1 1 2 3 5 8 13 21 34 55
    (1) new int
    (2) int i = 2
    (3) length
    (4) f[i]
    
    本题考查:数组的定义、赋值和遍历。
    (1) 数组的定义方式为:数据类型[]数组名=new 数据类型[数组长度];
    (2) 定义变量i并初始化, 因为数组的下标从0开始, f[i - 2]表示第一个数, 所以变量i的初始值2。
    (3) 数组中获取数组的长度用length属性。
    (4) 遍历数组元素。
    【42】在考生文件夹中存有文件名为Java_2.java的文件, 该程序是不完整的, 请在注释行"//**********Found**********"下一行语句的下划线地方填入正确内容, 然后删除下划线, 请勿删除注释行或改动其他已有语句内容。存盘时文件必须存放在考生文件夹下, 不得改变原有文件的文件名。
    本题的要求是:
    创建一个二维整型数组, 并将其以4行4列左对齐的格式输出, 程序输出结果如下:
    1 1 1 1
    2 2 2
    3 3
    4
    (1) [][]
    (2) k - i
    (3) aMatrix[i]
    (4) println()
    
    本题考查:二维数组的定义, 以及二维数组的元素赋值。
    (1) 二维数组定义方式为:数据类型[][]数组名=new 数据类型[行数][];
    (2) 给每一行的数组分配空间, 根据打印输出的结果可知, 每一行的元素递减。
    (3) 内循环是对二维数组每一行的数据进行操作。
    (4) 每一行输出以后, 通过println()输出换行符。
    【43】在考生文件夹中存有文件名为Java_3.java的文件, 该程序是不完整的, 请在注释行"//**********Found**********"下一行语句的下划线地方填入正确内容, 然后删除下划线, 请勿删除注释行或改动其他已有语句内容。存盘时文件必须存放在考生文件夹下, 不得改变原有文件的文件名。
    程序的功能是:输入一个十进制整数, 将其二进制形式显示出来。程序运行后, 输入如下整数:

    再按回车键后所得结果为:

    (1)actionPerformed(2)output(3)output(4)WindowEvent
    
    本题考查:swing窗口和监听器的使用。
    (1) 创建ActionListener对象必须重写其中的actionPerformed(ActionEvent e)抽象方法
    (2) 程序要求把输入的数用二进制文本输出。
    JTextField类提供的setText()方法设置文本域中的文本值, 通过JTextField类output调用该方法。
    (3) 通过Container类中add()方法将组件对象"output"添加到容器中去。
    (4) WindowEvent处理此窗口上发生的窗口焦点事件, 点击窗口会触发该事件。
    System.exit(0)方法为退出系统。
  • 相关阅读:
    XMPP协议的原理介绍
    ExtJs自学教程(1):一切从API開始
    开源阅读器
    查询记录时rs.previous()的使用
    C/C++产生随机数
    探索WebKit内核(一)------ 菜鸟起步
    Qt编写串口通信程序全程图文解说
    超过响应缓冲区限制
    数据库原理 知识点总结
    http 双向通信之port映射
  • 原文地址:https://www.cnblogs.com/mjios/p/12454737.html
Copyright © 2020-2023  润新知