当前位置:   article > 正文

Java八股文面试题

java八股文面试题

目录

1、java 中有哪些基本类型?

2、java 为什么能够跨平台运行?

3、比较一下 Java 和 JavaSciprt。

4、String 是基本数据类型吗?我可不可以写个类继承于 String?

5、谈谈&和&&的区别?

6、Switch 语句里面的条件可不可以是 byte、long、String?使用时候还应注意什么?

7、short s1=1;s1=s1+1;有什么错?short s1 = 1;s1+=1 有什么错?

8、Java 中 ++ 操作符是线程安全的吗?

9、3*0.1 == 0.3 将会返回什么?true 还是 false?

10、char 为什么能存贮一个汉字?

11、final 关键字的用法?

12、静态变量和实例变量的区别?

13、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?

14、面向对象的基本特征是什么?

15、作用域 public,private,protected,以及不写时的区别?

16、Overload 和 Override 的区别。

17、为什么方法不能根据返回类型来区分重载?

18、构造器可不可以被重载或重写?

19、在 Java 中定义⼀个不做事且没有参数的构造⽅法的作⽤

20、成员变量与局部变量的区别有哪些?

21、⾃动装箱与拆箱

22、hashCode 的作用是什么

23、为什么要有 hashCode

24、hashCode()与 equals()的相关规定

25、为什么 Java 中只有值传递?

26、Java 中有没有多继承?

27、抽象类和接口的区别?

28、java 中实现多态的机制是什么?

29 、 String 和 StringBuffer 的区别? StringBuffer 和

StringBuilder 区别?

30、数组中有没有 length()方法,String 中有没有 length()方法?

31、final, finally, finalize 的区别。

32、‘==’和 equals 的区别?

34、有没有可能两个不相等的对象有有相同的 hashcode?

35、两个相同的对象会有不同的的 hash code 吗?

36、我们可以在 hashcode() 中使用随机数字吗?

37、Java 中 java.util.Date 与 java.sql.Date 有什么区别?

38、接口是什么?为什么要使用接口而不是直接使用具体类?

39、heap 和 stack 有什么区别。

40、GC 是什么? 为什么要有 GC?

41、什么是内部类?分为哪几种?

42、为什么需要内部类?

43、数字转字符有多少种方式,分别是什么

44、Java 创建对象有几种方式

45、说出十种常见的异常

46、什么是检查性异常和非检查性异常?

47、Java 的异常处理机制是什么?

48、throw 和 throws 的区别

49、一个静态方法,里面可不可以用 this 和 super 关键字

50、java8 新特性


1、java 中有哪些基本类型?

整形:byte 8 short 16 int 32 long 64 位

浮点类型:float、double

字符类型:char 表示字符 utf-16

布尔类型:boolean true/false

2、java 为什么能够跨平台运行?

因为 Java 程序编译之后生成.class 文件,不是能被硬件系统直接运行的代码,而是一种 “中间码”——字节码。然后不同的硬件平台上安装有不同的 Java 虚拟机(JVM),由 JVM 来把字节码再“翻译”成所对应的硬件平台能够执行的代码。因此对于 Java 编程者来说,不需要考虑硬件平台是什么。所以 Java 可以跨平台。

3、比较一下 Java 和 JavaSciprt。

基于对象和面向对象:Java是一种真正的面向对象的语言,即使是开发简单的程序,也必须设计对象;JavaScript 是种脚本语言,它是一种基于对象(Object-Based)和事件驱动(Event-Driven)的编程语言,本身提供了非常丰富的内部对象供设计人员使用。

解释和编译:Java 的源代码在执行之前,必须经过编译。JavaScript 其源代码不需经过编译,由浏览器解释执行。

强类型变量和弱类型变量:Java 采用强类型变量检查,所有变量在编译之前必须作声明;JavaScript中变量是弱类型的,甚至在使用变量前可以不作声明,其解释器在运行时检查推断其数据类型。代码格式不一样。

4、String 是基本数据类型吗?我可不可以写个类继承于 String?

不是,String 是引用类型;String 是 final 的类,是不可以被继承的。

5、谈谈&和&&的区别?

&和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为 true 时,整个运算结果才为 true,否则,只要有一方为 false,则结果为 false。

&&还具有短路的功能,即如果第一个表达式为 false,则不再计算第二个表达式。

&还可以用作位运算符,当&操作符两边的表达式不是 boolean 类型时,&表示按位与操作.。

6、Switch 语句里面的条件可不可以是 byte、long、String?使用时候还应注意什么?

switch 里面的条件必须是能隐式的转化成为 Int 的故 long 不行,byte 可以;jdk1.7 之后

String 类型的也可以。使用 Switch 时候还应注意它的穿透,即每个 case 后要跟 break;

7、short s1=1;s1=s1+1;有什么错?short s1 = 1;s1+=1 有什么错?

对于 short s1 = 1; s1 = s1 + 1; 由于 s1+1 运算时会自动提升表达式的类型,所以结果是 int 型,再赋值给 short 类型 s1 时,编译器将报告需要强制转换类型的错误。

对于 short s1 = 1; s1 += 1;由于 += 是 java 语言规定的运算符,java 编译器会对它进行特殊处理,因此可以正确编译。

8、Java 中 ++ 操作符是线程安全的吗?

不是线程安全的操作。它涉及到多个指令,如读取变量值,增加,然后存储回内存,并不是原子性的操作,这个过程可能会出现多个线程交差。解决方案:对i++操作的方法加同步锁或者使用支持原子操作的类比如 java.util.concurrent.atomic.AtomicInteger

9、3*0.1 == 0.3 将会返回什么?true 还是 false?

false,因为有些浮点数不能完全精确的表示出来。

对于0.1来说,其本质是1/10,用二进制表示是1/1010是一个除不尽的无穷循环

==>0.000110011001100...其中0011循环,但是恰恰double类的精度可以表现出0.1*3的结果为0.30000000000000004,所以造成double中运算不精准,返回结果false。

10、char 为什么能存贮一个汉字?

char 型变量是用来存储 Unicode 编码的字符的,unicode 编码字符集中包含了全世界所有的字体。

11、final 关键字的用法?

final 用于修饰类、属性、方法

final 修饰的类,不能被继承

final 修饰的属性,是常量,值不可以改变 final 修饰的方法,不可以被重写

12、静态变量和实例变量的区别?

静态变量也称为类变量,归全类共有,它不依赖于某个对象,可通过类名直接访问;而实例变量必须依存于某一实例,只能通过对象才能访问到它。

静态变量存在方法区内存 实例变量存在堆内存

13、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?

是值传递。Java语言的方法调用只支持参数的值传递。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。

14、面向对象的基本特征是什么?

1)抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。

2)继承:子类拥有父类一切非私有的属性和方法。

3)封装:封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面 向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装 的对象,这些对象通过一个受保护的接口访问其他对象。

4)多态性:同一种事物的不同种表现形式。

15、作用域 public,private,protected,以及不写时的区别?

         作用域        当前类        同包       子孙类

其他

         public                   √           √          √

         protected              √           √           √

×

         default                  √           √          ×

×

         private                  √           ×          ×

×

16、Overload 和 Override 的区别。

(Overload)重载:发生在同一个类之中,方法名相同、参数列表不同(个数,类型),与返回值无关、与 final 无关、与修饰符无关、与异常无关。

(Override)重写:发生在子类和父类之间,方法名相同、参数列表相同、返回值相同、不能是 final 的方法、重写的方法不能有比父类方法更为严格的修饰符权限、重写的方法所抛出的异常不能比父类的更大。

如果父类私有的方法,子类拥有方法签名相同的方法,子类不属于重写父类的方法,该方法属于子类的新方法。

17、为什么方法不能根据返回类型来区分重载?

因为java方法被调用时返回值可以舍弃,也可以使用父类/接口类型接收返回值,所以如果有相同的参数列表的方法,编译器无法确定具体要调用的方法。

重载只和参数列表相关并且方法名称相同,和方法签名的其他关键字无关。

18、构造器可不可以被重载或重写?

构造器不能被继承,故不能被重写、但可以被重载。

19、在 Java 中定义⼀个不做事且没有参数的构造⽅法的作⽤

Java 程序在执⾏类的构造⽅法之前,如果没有⽤ super() 来调⽤⽗类特定的构造⽅法,则会默认调⽤⽗类的无参构造。因此,如果⽗类中只定义了带参构造,⽽在⼦类的构造⽅法中

⼜没有⽤ super() 来调⽤⽗类中特定的构造⽅法,则编译时将发⽣错误,因为 Java 程序在⽗类中找不到该构造方法供执行。

20、成员变量与局部变量的区别有哪些?

  1. 从语法形式上看:成员变量是属于类的,⽽局部变量是在⽅法中定义的变量或是⽅法的参数;成员变量可以被 public,private,static 等修饰符所修饰,⽽局部变量不能被访问控制修饰符及static 所修饰;但是,成员变量和局部变量都能被 final 所修饰。
  2. 从变量在内存中的存储⽅式来看:如果成员变量是使⽤ static 修饰的,那么这个成员变量是属于类的,如果没有使⽤ static 修饰,这个成员变量是属于实例的。对象存于堆内存,如果局部变量类型为基本数据类型,那么存储在栈内存,如果为引⽤数据类型,那存放的是指向堆内存对象的引⽤或者是指向常量池中的地址。
  3. 从变量在内存中的⽣存时间上看:成员变量是对象的⼀部分,它随着对象的创建⽽存在,⽽局部变量随着⽅法的调⽤⽽⾃动消失。
  4. 成员变量如果没有被赋初值会⾃动以类型的默认值⽽赋值(⼀种情况例外:被 final 修饰的成员变量也必须显示地赋值),而局部变量则不会自动赋值。

21、⾃动装箱与拆箱

装箱:将基本类型⽤它们对应的引⽤类型包装起来;自动装箱发生场景:

1.将基本数据类型放入集合类

2.方法传入参数为基本类型,返回值类型为包装类型拆箱:将包装类型转换为基本数据类型;自动拆箱发生场景:1.包装类型和基本类型的大小比较 2.包装类型的运算 3.三目运算符的使用

22、hashCode 的作用是什么

hashCode() 的作⽤是获取哈希码,也称为散列码;它实际上是返回⼀个 int 整数。这个哈希码的作⽤是确定该对象在哈希表中的索引位置。散列表存储的是键值对(key-value),它的特点是:能根据“键”快速的检索出对应的“值”。这其中就利⽤到了散列码!(可以快速找到所需要的对象)

23、为什么要有 hashCode

当你把对象加⼊ HashSet时,HashSet 会先计算对象的 hashcode 值来判断对象加⼊的位置,同时也会与该位置其他已经加⼊的对象的 hashcode 值作⽐,如果没有相符hashcode,

HashSet 会假设对象没有重复出现。但是如果发现有相同 hashcode 值的对象,这时会调⽤ equals() ⽅法来检查 hashcode 相等的对象是否真的相同。如果两者相同,HashSet 就不会让其加⼊操作成功。如果不同的话,就会重新散列到其他位置。这样我们就⼤⼤减少了 equals 的次数,相应就⼤⼤提⾼了执⾏速度。

hashCode() 在散列表中才有⽤,在其它情况下没⽤。在散列表中 hashCode() 的作⽤是获取对象的散列码,进⽽确定该对象在散列表中的位置。

24、hashCode()与 equals()的相关规定

  1. 如果两个对象相等,则 hashcode ⼀定也是相同的
  2. 两个对象相等,对两个对象分别调⽤ equals ⽅法都返回 true
  3. 两个对象有相同的 hashcode 值,它们也不⼀定是相等的
  4. 因此,equals ⽅法被覆盖过,则 hashCode ⽅法也必须被覆盖
  5. hashCode() 的默认⾏为是对堆上的对象产⽣独特值。如果没有重写 hashCode(),则该 class的两个对象无论如何都不会相等(即使这两个对象指向相同的数据)

25、为什么 Java 中只有值传递?

值传递:是指在调用函数时,将实际参数复制一份传递给函数,这样在函数中修改参数时,不会影响到实际参数。其实,就是在说值传递时,只会改变形参,不会改变实参。

引用传递:是指在调用函数时,将实际参数的地址传递给函数,这样在函数中对参数的修改,将影响到实际参数。

引用传递实际上是一个伪概念,值传递不是简单的把实参传递给形参,而是实参建立了一个副本,将副本传递给形参。当传递的参数为引用类型的对象时,对象存放在堆里,其引用存放在栈中,也是创建一个副本,传递给形参,所以其本质上还是值传递。

26、Java 中有没有多继承?

java 中没有多继承,但是可以多实现,即一个类实现多个接口。

虽然没有多继承,但是 java 中接口可以近似的实现多继承,那就是接口;接口和接口之间可以进行多继承。

27、抽象类和接口的区别?

  1. 抽象类继承自 Object,接口不是.
  2. 抽象类有构造器,接口中没有构造器。
  3. 抽象类中可以有普通成员变量和常量,接口中只能有常量,而且只能是 public static final 不写默认。
  4. 抽象类中可以有抽象方法,也可以有普通的方法,接口中 jdk1.8 之前只能有抽象的方法,而且修饰符只能是 public abstract 不写默认。jdk1.8 之后新增默认方法和静态方法
  5. 抽象类中可以有 final 的方法(非抽象方法),接口中不能有 final 的方法。
  6. 抽象类只能是单继承,多实现,接口是可以多继承其他接口,但是不能实现接口,和不能继承其他类(普通类,抽象类)。

28、java 中实现多态的机制是什么?

重写、重载、父类的声明指向子类的对象。可变参数。

29 、 String 和 StringBuffer 的区别? StringBuffer 和StringBuilder 区别?

String 是不可变的,对 String 类的任何改变都会返回一个新的 String 对象。

StringBuffer 是可变的,对 StringBuffer 中的内容修改都是当前这个对象。

String 重写了 equals 方法和 hashCode 方法,StringBuffer 没有重写 equals 方法。String 是 final 的类。StringBuffer 不是。

String 创建的字符串是在常量池中,创建的变量初始化一次,如果再对该字符串改变会产生新的字符串地址值,StringBuffer 是在堆中创建对象,当对字符串改变时不会产生新的

字符串地址值,如果对字符串进行频繁修改的话建议使用 StringBuffer,以节省内存。

StringBuffer 和 StringBuilder,StringBuffer 是线程安全的,StringBulider 是线程不安全的。当不考虑并发问题时候,请使用 StringBulider。

30、数组中有没有 length()方法,String 中有没有 length()方法?

数组中没有 length()方法,但是有 length 属性,String 中有length()方法

31、final, finally, finalize 的区别。

final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。

内部类要访问局部变量,局部变量必须定义成 final 类型。

finally 是异常处理语句结构的一部分,表示总是执行。

finalize 是 Object 类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。JVM 不保证此方法总被调用

32、‘==’和 equals 的区别?

‘==’比较的是两个变量的内容和在内存中的地址值是否全部相等,如果要比较两个基本数据类型那必须用’==’ equals 如果没有重写,则和’==’的意义一样,如果重写了,则会会按照重写的内容进行比较, javaBean 规定当重写 equals 时候必须重写 hashCode,如果不重写会出现对象相同但是 hashCode 不同,这样会出现问题,eg:HashSet 存储元素时候是按照 hashCode,如果重写 equals 不重写 hashCode 会导致同一个对象,存储了两次。

33、JAVA 中 Object 类中有哪些常用方法?

  1. getClass():获取类的 class 对象。
  2. hashCode:获取对象的 hashCode 值
  3. equals():比较对象是否相等,比较的是值和地址,子类可重写以自定义。
  4. clone():克隆方法。
  5. toString():如果没有重写,应用对象将打印的是地址值。
  6. notify():随机选择一个在该对象上调用 wait 方法的线程,解除其阻塞状态。该方法只能在同步方法或同步块内部调用。如果当前线程不是锁的持有者,该方法抛出一个IllegalMonitorStateException 异常。
  7. notifyall():解除所有那些在该对象上调用 wait 方法的线程的阻塞状态。该方法只能在同步方法或同步块内部调用。如果当前线程不是锁的持有者,该方法抛出一个IllegalMonitorStateException 异常。
  8. wait():导致线程进入等待状态,直到它被其他线程通过 notify()或者 notifyAll 唤醒。该方法只能在同步方法中调用。如果当前线程不是锁的持有者,该方法抛出一个IllegalMonitorStateException 异常。
  9. finalize():对象回收时调用

34、有没有可能两个不相等的对象有有相同的 hashcode?

会有相同 hashCode是所有java对象的固有方法,如果不重载的话,返回的实际上是该对象在jvm的堆上的内存地址,而不同对象的内存地址肯定不同,所以这个hashCode也就肯定不同了。如果重载了的话,由于采用的算法的问题,有可能导致两个不同对象的hashCode相同。这就算为什么hashmap,hashset等集合会产生hash冲突的原因了。

35、两个相同的对象会有不同的的 hash code 吗?

可以这么写,但是不推荐,除非你刻意胡乱重写。因为根据java底层规范和标准,不允许发生这样的情况,会导致使用hash的对象发生错误。

36、我们可以在 hashcode() 中使用随机数字吗?

可以这么写,但是不推荐,因为对象相等我们应保证他们的hashcode相等. 而不相等的对象应通过hashcode方法的算法尽量避免hash冲突。

37、Java 中 java.util.Date 与 java.sql.Date 有什么区别?

日期格式和精度不同,java.sql.Date只包含年月日信息。

另外java.sql.Date是java.util.Date的子类。java.util.Date转java.sql.Date以毫秒的形式转换,java.sql.Date s = new java.sql.Date(utilTime.getTime());反过来为向上转型可以自动转换。

38、接口是什么?为什么要使用接口而不是直接使用具体类?

接口是一种规范,本质上为抽象方法的集合,与代表is a的继承关系相比,因为实现类中不仅仅只有接口中的方法,所以不能说完全相同而使用like a来表示。

接口可以用来控制实现其的类必须要实现其中的抽象方法,并且一个类可以实现多个接口,一个接口可以继承另一个接口,相对于类之间的单继承更具有可扩展性。接口可以方便敏捷开发,使得在开发过程中可以快速分离工作内容,定义好接口之后可以直接调用接口的方法而不需要等待其他开发人员实现了具体方法之后才能调用,大大提高了开发效率。并且使用接口开发能够降低程序的耦合性,从而提高程序的可维护性。

39、heap 和 stack 有什么区别。

java 的内存分为两类,一类是栈内存,一类是堆内存。栈内存是指程序进入一个方法时,

会为这个方法单独分配一块私属存储空间,用于存储这个方法内部的局部变量,当这个方法结束时,分配给这个方法的栈会释放,这个栈中的变量也将随之释放。

堆与栈不同,一般用于存放 new 创建的对象,所以,它不会随方法的结束而消失。方

法中的局部变量使用 final 修饰后,放在堆中,而不是栈中。

40、GC 是什么? 为什么要有 GC?

GC 是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,

忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java 提供的 GC 功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java 语言没有提供释放已分配内存的显示操作方法。

41、什么是内部类?分为哪几种?

内部类是指在一个外部类的内部再定义一个类。内部类作为外部类的一个成员,并且依附于外部类而存在的。内部类可为静态,可用 protected 和 private 修饰(而外部类只能使用 public 和缺省的包访问权限)。

内部类主要有以下几类:成员内部类、局部内部类、静态内部类、匿名内部类。

42、为什么需要内部类?

典型的情况是,内部类继承自某个类或实现某个接口,内部类的代码操作创建其的外围类的对象。所以你可以认为内部类提供了某种进入其外围类的窗口。使用内部类最吸引人的原因是:每个内部类都能独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。如果没有内部类提供的可以继承多个具体的或抽象的类的能力,一些设计与编程问题就很难解决。从这个角度看,内部类使得多重继承的解决方案变得完整。接口解决了部分问题,而内部类有效地实现了“多重继承”。

43、数字转字符有多少种方式,分别是什么

  1. String.valueOf()
  2. ""    + 数字
  3. Integer.toString()

44、Java 创建对象有几种方式

  1. new 关键字
  2. 反射
  3. 克隆
  4. 反序列化

45、说出十种常见的异常

java.lang.NullPointerException

空指针异常

java.lang.ClassNotFoundException

类找不到异常

java.lang.ArithmeticException

数学运算异常

java.lang.ArrayIndexOutOfBoundsException

数组下标越界

java.lang.ClassCastException

类型转换异常

java.lang.NumberFormatException

数字转换异常

java.sql.SQLException

操作数据库异常

java.io.IOException

输入输出流异常

java.io.FileNotFoundException

文件找不到异常

java.lang.InstantiationError

实例化异常

46、什么是检查性异常和非检查性异常?

1、检查性异常和非检查性异常最主要的区别在于其处理异常的方式:检查性异常必须使用 try catch 或者 throws 等关键字进行处理,否则编译器会报错;非检查性异常一般是程序代码写的不够严谨而导致的问题,可以通过修改代码来规避。

2 、所有的检查性异常都继承自 java.lang.Exception ;所有的非检查性异常都继承自 java.lang.RuntimeEx ception。

3、常见的运行时异常:空指针异常(NullPointerException)、除零异常(ArithmeticException)、数组越界异常(ArrayIndexOutOfBoundsException)等;

常见的检查性异常:输入输出异常(IOException)、文件不存在异常(FileNotFoundException)、

SQL 语句异常(SQLException)等

47、Java 的异常处理机制是什么?

  1. java 异常包括 Exception(异常)和 error(错误)。她们都继承自 throwable。

Error 一般指 JVM 出现的问题,程序无法做处理。Exception 是程序本身可以处理的异常,分为运行时异常和非运行时异常。

  1. 非运行时异常程序必须进行处理,要么 try catch 块进行捕获,要么通过 throws 声明抛出,否则编译不通过,也称作可检查异常。运行时异常 runtimeException,一般为不可检查异常,运行时才会报的错误。程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。
  2. 用户自己亦可以自定义异常信息。编写自己的异常类时需要记住下面的几点。
    1. 所有异常都必须是 Throwable 的子类。
    2. 如果希望写一个检查性异常类,则需要继承 Exception 类。
    3. 如果你想写一个运行时异常类,那么需要继承 RuntimeException 类自己编写的异常可以更好的进行全局异常处理。
  3. 异常通常配合日志 log4j 来记录异常信息。

48、throw 和 throws 的区别

throw:

  1. throw 语句用在方法体内,表示抛出异常,由方法体内的语句处理。
  2. throw 是具体向外抛出异常的动作,所以它抛出的是一个异常实例,执行 throw 一定是抛出了某种异常的对象。

throws:

  1. throws 语句是用在方法声明后面,表示如果抛出异常,由该方法的调用者来进行异常的处理。
  2. throws 主要是声明这个方法会抛出某种类型的异常,让它的使用者要知道需要捕获的异常的类型。
  3. throws 表示出现异常的一种可能性,并不一定会发生这种异常。

49、一个静态方法,里面可不可以用 this 和 super 关键字

不能,因为 this 代表的是调用这个方法的对象的引用,super 代表当前父类对象的引用,

而静态方法是属于类的,不属于对象,静态优先于对象,静态方法成功加载后,对象还不一定存在。

50、java8 新特性

接口中可以添加默认方法和默认方法、Lambda表达式、函数式接口、Stream数据流、

Optional类以及全新的时间包等。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/392070
推荐阅读
相关标签
  

闽ICP备14008679号