Java八股文:final、finally、finalize之间有什么区别

final用于修饰变量、方法和类,确保常量不变及方法不被重写;finally是异常处理机制,确保代码块始终执行;finalize是对象回收前进行资源清理的方法,与垃圾收集有关。这三个关键字在Java中各有特定用途,无直接关联。
摘要由CSDN通过智能技术生成

final、finally、finalize他们三者的区别,是一道再经典不过的面试题,我们在各个公司的面试题中几乎都能看到它的身影。final、finally和finalize虽然长得像孪生兄弟一样,但是它们的含义和用法却是大相径庭。final是Java中的一个关键字,修饰符;finally是Java的一种异常处理机制;finalize是Java中的一个方法名。接下来,我们具体说一下他们三者之间的区别。

一、final

1.1 修饰变量,包含静态和非静态

如果final修饰的是一个基本类型,就表示这个变量被赋予的值是不可变的,即它是个常量。

如图所示final修饰的a,之后再对a修改是无法修改的,会报编译错误。

如果final修饰的是一个对象,就表示这个变量被赋予的引用是不可变的。这里需要提醒大家注意的是,不可改变的只是这个变量所保存的引用,并不是这个引用所指向的对象。

下面我们测试一下,先定义一个Pet实体类

public class Pet {

private String name;

public Pet() {

}

public Pet(String name) {

this.name = name;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

}

由上图测试可见:不可改变的只是这个变量所保存的引用,该对象内容还是可以修改的。

当然关注final还有一些细节大家需要注意,如果一个变量或方法参数被final修饰,就表示它只能被赋值一次,但是JAVA虚拟机为变量设定的默认值不记作一次赋值。被final修饰的变量必须被初始化。

那接下来我们简单说一下初始化的几种情况:

  • 在定义的时候初始化

public class User1 {

private final String name = "Lucy";

}

  • 非静态final修饰变量可以在初始化块中初始化,不可以在静态初始化块中初始化;而静态final修饰的变量可以在静态初始化块中初始化,不可以在初始化块中初始化。

public class User2 {

private final String name;

private static final int a1;

{

name="Lucy";

}

static {

a1=1;

}

//经过代码测试a2在静态代码块无法进行初始化

/* private final int a2;

static {

a2=1;

}*/

//经过测试,静态的变量name2不能在初始化代码块中初始化

/* private static final String name2;

{

name2="Lucy";

}*/

}

  • final变量还可以在类的构造器中初始化,但是静态final变量不可以。

public class User4 {

private final String name;

//经过测试验证静态修饰的a1无法在构造器中进行初始化

private static final int a1;

public User4() {

name="11";

a1=1;

}

}

以上就是初始化的3种情况,大家简单的认知一下。

那有人会问了:JVM对于声明为final的局部变量做了那些性能优化呢?在能够通过编译的前提下,无论局部变量声明时带不带final关键字修饰,对其访问的效率都一样,我们来进行测试一下:

如下所示不带final的情况:

static int demo1() {

int a = ValueA();

int b = ValueB();

return a + b;

}

带final的情况:

static int demo2() {

final int a = ValueA();

final int b = ValueB();

return a + b;

}

他们两者之间通过Javac编译后的得到的结果是一样的:

Code:

0:invokestatic #2 //Method ValueA:()

3:istore_0 // 设置a的值

4:invokestatic #3 //Method ValueB:()

7:istore_1 // 设置b的值

8:iload_0 // 读取a的值

9:iload_1 // 读取b的值

10:iadd

11:ireturn

根据字节码可见文件里除字节码外的辅助数据结构也没有记录任何体现final的信息。既然带不带final的局部变量在编译到Class文件后都一样了,其访问效率必然一样高,JVM不可能有办法知道什么局部变量原本是用final修饰来声明的。

当然还是有特殊情况的出现:那就是我们声明的局部变量并不是一个变量,如下所示的两种情况:

public class Test01 {

static int foo(){

final int a = 11;

final int b = 12;

return a + b;

}

static int foo1(){

int a = 11;

int b = 12;

return a + b;

}

}

他们两者之间通过Javac编译后得到的字节码如下所示:

foo()方法中,这样的话实际上a和b都不是变量,而是编译时常量,其访问会按照Java语言对常量表达式的规定而做常量折叠。foo1()方法中a和b都是去掉final修饰,那么a和b就会被看作普通的局部变量而不是常量表达式,因此在字节码层面上的效果会不一样。

其实这种层面上的差异只对比较简易的 JVM 影响较大,因为这样的 JVM 对解释器的依赖较大,原本 Class 文件里的字节码是怎样的它就怎么执行;对高性能的 JVM则没啥影响。所以,大部分 final 对性能优化的影响,可以直接忽略,我们使用 final 更多的考量在于其不可变性。

1.2 修饰方法

当定义一个方法被final修饰时,表示此方法不可以被子类重写,但是依旧可以被子类继承使用,接下来我们做验证:

先在父类定义一个final修饰的方法:

public class Fu {

public final void add(){

System.out.println("这是父类final修饰的一个方法");

}

}

子类重写父类final修饰的方法,并且子类对象调用此方法:

public class ZI extends Fu{

/* public void add(){

System.out.println("子类重写父类final修饰的方法");

}*/

public static void main(String[] args) {

ZI zi = new ZI();

zi.add();

}

}

经过如上代码可知,子类重写父类final修饰的方法会报编译异常,无法进行重写此方法,但是子类依旧可以调用此方法。

1.3 修饰类

其实用于final修饰的类我们很熟悉,因为我们最常用的String类就是final修饰的,由于final类不允许被继承,就意味着它不能再派生出新的子类,不能作为父类被继承,因此,一个类不能同时被声明为abstract抽象类和final类。编译器在处理时把它的所方法都当作final的,因此final类比普通类拥更高的效率。

final的类的所方法都不能被重写,但这并不表示final的类的属性(变量值)也是不可改变的,要想做到final类的属性值不可改变,必须给它增加final修饰。我们进行验证:

public final class User {

int a1=1;

final int a2 = 2;

public static void main(String[] args) {

User user = new User();

user.a1=3;

// user.a2=3;

System.out.println(user.a1);

}

}

经过如上代码测试所得,第7行a2被final修饰,不可以二次赋值,它是不可变的,而最后的输出结果也是3,证明a1的值发生了变化。所以final修饰的类并不表示其属性(变量值)也是不可改变的。

二、finally

finally是什么呢?是Java的一种异常处理机制。finally只能用在try/catch语句中,并且是附带着的一个语句块,表示这段语句最终总是被执行。请看下面代码:

public class FinallyTest {

public static void main(String[] args) {

try {

throw new NoSuchFieldException();

} catch (NoSuchFieldException e) {

System.out.println("该程序抛出异常");

} finally {

System.out.println("这里执行了finally中的代码");

}

}

}

运行结果如下:

该程序抛出异常

这里执行了finally中的代码

由结果可见finally内的代码被执行了。

那有同学会问,finally的代码一定会执行吗?return、continue、break这个可以打乱finally的顺序吗,那接下来我们做一下验证:

  • return是否能影响finally语句块的执行,看代码:

public class FinallyTest {

public static void main(String[] args) {

int i = returnTest();

System.out.println("i = " + i);

}

public static int returnTest() {

try {

return 1/0;

} catch (Exception e) {

System.out.println("该程序抛出异常");

} finally {

System.out.println("这里执行了finally中的代码");

}

return 1;

}

}

运行结果如下:

该程序抛出异常

这里执行了finally中的代码

i = 1

由结果可见,finally内的代码被执行了,因此return不会影响finally内的代码。

  • continue是否能影响finally语句块的执行,看代码:

public class FinallyTest {

public static void main(String[] args) {

continueTest();

}

public static void continueTest() {

for (int i = 0; i < 3; i++) {

try {

if (i==1){

continue;

}

System.out.println("i = " + i);

} catch (Exception e) {

System.out.println("该程序抛出异常");

} finally {

System.out.println("这里执行了finally中的代码");

}

}

}

}

运行结果如下:

i = 0

这里执行了finally中的代码

这里执行了finally中的代码

i = 2

这里执行了finally中的代码

由结果所示,当i==1时,条件成立,执行continue,所以i=1的输出打印被跳出,但是finally内的代码依旧被执行了,因此continue不会影响finally内的代码。

  • break是否能影响finally语句块的执行,看代码:

public class FinallyTest {

public static void main(String[] args) {

continueTest();

}

public static void continueTest() {

for (int i = 0; i < 3; i++) {

try {

if (i==1){

break;

}

System.out.println("i = " + i);

} catch (Exception e) {

System.out.println("该程序抛出异常");

} finally {

System.out.println("这里执行了finally中的代码");

}

}

}

}

运行结果如下:

i = 0

这里执行了finally中的代码

这里执行了finally中的代码

由结果所示,当i==1时,条件成立,执行break,所以后续代码被终止了,但是i==1时的finally内的代码依旧被执行了,因此break不会影响finally内的代码。

显而易见return、continue、break不会对finally内的代码造成影响,finally内的代码一定会被执行。

finally的本质是什么呢?那我们来看一下,我们就以如下代码为例:

public class Test01 {

public static void main(String[] args) {

int a1 = 0;

try {

a1 = 1;

}catch (Exception e){

a1 = 2;

}finally {

a1 = 3;

}

System.out.println(a1);

}

}

我们来看一下此段代码的字节码如图所示:

我们先解释一下 Exception table,他是一个异常表,其中的每一条都表示一个异常发生器,异常发生器由 From 指针,To 指针,Target 指针和应该捕获的异常类型构成。

根据如上图所示的字节码我们会发现finally会把“a1=3”的字节码 iconst_3 和 istore_1 放在了try块和catch块的后面。相当于在try代码块和catch的代码块的后面都含有一条a1 = 3,所以我们最终的结果一定会执行finally中的代码。

上面我们讨论的都是 finally 一定会执行的情况,当然值得一提的是finally也不是一定会被执行的。那就是当我们期间调用System.exit()方法,他就会不执行finally的内容,具体如下:

public static void main(String[] args) {

try {

System.out.println(" 执行try中的代码 " );

System.exit(0);

} catch (Exception e) {

System.out.println("该程序抛出异常");

} finally {

System.out.println("这里执行了finally中的代码");

}

}

运行结果如下:

执行try中的代码

Process finished with exit code 0

由结果显示,finally内的代码未执行,System.exit()这个方法是用来结束当前正在运行中的Java虚拟机。对于此方法大家有个印象就可以了,知道该方法会影响到finally的执行。

三、finalize

最后,我们来看一下finalize,他是一个方法,隶属于java.lang.Object类,方法定义如下:

protected void finalize() throws Throwable { }

此方法是GC运行机制的一部分,它的设计目的是保证对象在被垃圾收集前完成特定资源的回收。

在 Java 中,由于 GC 的自动回收机制,因而并不能保证 finalize 方法会被及时地执行(垃圾对象的回收时机具有不确定性),也不能保证它们会被执行。也就是说,finalize 的执行时期不确定,我们并不能依赖于 finalize 方法帮我们进行垃圾回收,可能出现的情况是在我们耗尽资源之前,gc 却仍未触发,所以推荐使用资源用完即显示释放的方式,比如 close 方法。

finalize 的工作方式是这样的:一旦垃圾回收器准备好释放对象占用的存储空间,将会首先调用 finalize 方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。

总结

final、finally 和 finalize三者之间看着像孪生兄弟,但是他们三个之间没有任何的关系。final 是用来修饰类、变量、方法和参数的关键字,finally是异常处理语句结构的一部分,表示总是执行。finalize 是 Object 类中的一个基础方法,它的设计目的是保证对象在被垃圾收集前完成特定资源的回收的。因此他们之间的区别还是显而易见的,希望此篇文章帮助读者更加深刻的区分。

尚硅谷铁粉
关注 关注
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
(完整版)2022大厂Java八股文面试题库|附答案
uuqaz的博客
05-05 1万+
Java基础 说下面向对象四大特性 Java语言有些特点 什么是Java程序的主类?应用程序和小程序的主类有何不同? 访问修饰符public,private,protected,以及不写(默认)时的区别? float f=3.4;是否正确? Java有没有goto? &和&&的区别? Math.round(11.5) 等于多少?Math.round(-11.5)等于多少? 用最有效率的方法计算2乘以8? 什么是Java注释 Java有哪些数据类型 final
我把Github上热度最高的Java面试八股文,整理好了【PDF+答案】
javaAnPou的博客
08-26 3530
春招,秋招,社招,我们Java程序员的面试之路,是挺难的,过了HR,还得被技术面,小编在去各个厂面试的时候,经常是通宵睡不着觉,头发都脱了一大把,还好最终侥幸能够入职一个独角兽公司,安稳从事喜欢的工作至今.......
final,finally,finalize区别
你只管努力,
08-16 1013
面试问到过的都会记下来 1.简单区别final:用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。(内部类要访问局部变量,局部变量必须定义为final类型) finally:异常处理语句结构的一部分,表示总是执行。 finalize:是Object类的一个方法,在GC(垃圾回收器)执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关
finalfinallyfinalize区别
qq_56462577的博客
12-23 276
finallyfinal,finalize区别
阐述finalfinallyfinalize区别
weixin_68105699的博客
09-01 97
final:修饰符(关键字)有三种用法:如果一个类被声明为final,意味着它不能再派生出新的子类,即不能被继承,因此它和abstract是反义词。将变量声明为final,可以保证它们在使用中不被改变,被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取不可修改。被声明为final的方法也同样只能使用,不能在子类中被重写。的后面构造总是执行代码块,这就意味着程序无论正常执行还是发生异常,这里的代码只要JVM不关闭都能执行,可以将释放外部资源的代码写在finally块中。
java面试-finalfinallyfinalize区别
andyesme的专栏
07-18 184
finalfinallyfinalize区别 1)finaljava关键字,可用于修饰类、变量、方法。 被它修饰的类不能被继承;被它修饰的变量不能被修改、且声明变量时就得初始化;被它修饰的方法不能被重载。 2)finallyjava异常处理关键字,使用组合一般为try-catch-finally或者try-finally,被finally修饰的代码块无论都会执行,因此常用于释放资源。...
关于java中的关键字final_深入理解java中的final关键字
weixin_39913472的博客
02-24 222
深入理解java中的final关键字原文链接:Javarevisited翻译:ImportNew.com-唐小娟译文链接:http://www.importnew.com/7553.htmljava中的final关键字非常重要,它可以应用于类、方法以及变量。这篇文章我将带你看看什么是final关键字?将变量,方法和类声明为final代表了什么?使用final的好处是什么?最后也有一些使用fi...
java面试八股文
热门推荐
weixin_45927841的博客
03-21 6万+
目录一、java(1)集合1.list:LinkedList、ArrayList和Vector2.set:HashSet和TreeSet3.map:HashMap、TreeMap和HashTable4.list和set的区别(2)其他1.面向对象三大特性2.Object类的常用方法3.Java中线程安全的基本数据结构4.string、stringBuffer和stringBuilder5.抽象类与接口的区别6.java的基本数据类型7.java代码块执行顺序8.static关键字9.覆盖(重写)和重载的区别
Java 八股文-基础篇
段占彪的博客
06-08 8428
面向对象:是软件开发方法,一种编程范式,面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。例如:现实中的事物都抽象为“对象”。每个对象是唯一的,且都可以拥有它的属性与行为。面向过程:程序被视为一系列顺序执行的函数或方法,强调程序的流程控制和算法实现。面向对象:被视为一组对象之间的交互。Java 程序在执⾏⼦类的构造⽅法之前,如果没有⽤ super() 来调⽤⽗类特定的构造⽅法,则会调⽤⽗类中“没有参数的构造⽅法”,
Java八股文
earn_est的博客
03-07 1万+
我是2022届双非软件工程应届生,目前在准备秋招,总结了一篇不错的八股文,如果你正好需要可以关注一下,共同学习;超链接如下: Java后端八股文(CSDN不再同步) 语雀地址 Hello, interviewer. My name is . I graduated from Zhengzhou University of Light Industry, majoring in software engineering and I will graduate next year. I have exper
Java面试八股文(2023最新)--Java基础面试题
不知名菜鸡
05-25 1738
持续更新ing
Java八股文面试题
y190115的博客
07-28 5468
Java基础八股文(背诵版)
Javafinally关键字的面试题
一名小白的进阶之路
01-26 850
1.finalfinallyfinalize区别 final:修饰类时,不能被继承。 修饰方法时,不能被重写。 修饰变量时,只能赋值一次。 finally:是try语句中的一个语句体,不能单独使用,用来释放资源。 finalize:是一个方法,当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。 2.如果catch里面...
Java中的finally关键字
UUUUTaossienUUUU的专栏
05-16 622
在try语句块中申请了资源,在离开try语句块之前要释放掉资源,但是如果在这中间出现异常,就会跳转到catch语句块中执行异常处理程序,try语句块中的资源无法释放,造成内存泄漏。在java中,finally关键字有效的解决了这个问题。Unix C编程中的注册回调函数和C++中的RAII也有类似的功能。 (1)Unix C编程中,通过在main函数中注册回调函数,使用exit函数返回,在返回之前...
【C++刷题】力扣-#121-买卖股票的最佳时机
会写代码的饭桶
10-16 593
给定一个数组 prices,其中 prices[i] 表示第 i 天的股票价格。假设你可以在第 i 天买入并在第 j 天卖出股票(i ≤ j),设计一个算法来计算你所能获取的最大利润。注意你只能持有一股股票,并且你不能同时参与多笔交易(即在再次买入前必须卖出股票)。
java 异常包装
最新发布
fdvvg的博客
10-17 368
通过异常包装,可以在Java中有效地处理和传递异常。这样做不仅能保持原始异常的信息,还能为上层调用者提供更多的上下文信息。
基于SSM班级事务管理系统的设计
2401_87849773的博客
10-15 459
管理员账户功能包括:系统首页,个人中心,学生管理,班委管理,班会组织管理,健康档案管理,党员发展管理,党员培训管理,学生成绩管理。主要技术:Java,Spring,mybatis,mysql,jquery,html。班委账号功能包括:系统首页,学生管理,学生成绩管理,活动信息管理,班费通知管理。服务器:SpringBoot自带 apache tomcat。JDK版本:Java JDK1.8。数据库可视化工具: navicat。数据库版本: mysql5.7。开发系统:Windows。
确保Spring Boot定时任务只执行一次方案
2301_76419561的博客
10-14 726
确保Spring Boot定时任务只执行一次有多种方法,你可以根据实际需求选择最适合的方法。如果你需要更复杂的任务调度或周期性执行,@Scheduled注解和接口是更合适的选择。而对于一次性的初始化任务或应用程序启动任务,注解和实现接口则更为简洁明了。
JavaWeb合集05-SpringBoot基础知识
qq_57340195的博客
10-17 889
Autowrite :自动装配,通过声明的数据类型来装配对应的bean对象。缺点,只能获取到一个相同类型的bean对象,如果有IOC容器里面有2个Bean对象,使用@Autowrite依赖注入就好报错。由于三层架构中,每一层都需要下次成来提供对应的方法,所有要new 下一次的对象,如果上一层的类名发送改变,那么上一层就需要修改对应的类名,如下。3、@Resource注解:通过它来代替@Autowrite注解,直接指定要注入的Bean对象,参数name的值就是要注入的Bean对象。
Java面试题:final, finally, finalize区别及使用
本文是关于Java面试题的锦集,...总之,本文内容丰富,涵盖了丰富的Java面试题,特别详细介绍了关于 final, finally, finalize 这三个关键词的区别。对于希望提升自己Java面试技能的人来说,都是非常有价值的参考资料。
写文章

热门文章

  • node.js安装及环境配置 42570
  • java 泛型全解 - 绝对最详细 17018
  • Hive往表写入数据的八种方法 16190
  • ETL工具之Talend简介与安装 15804
  • 关于数据清洗的步骤及方法的理解 14938

分类专栏

  • 面试题 付费 10篇
  • java 108篇
  • 大数据 104篇
  • 前端 96篇
  • UI 2篇

最新评论

  • 2024版Java入门教程

    m0_62331616: 请问有笔记么

  • 经典再升级 | 尚硅谷SpringBoot3视频教程发布

    炽天使328: 2看了一部分,各种版本对不上之后出现各种问题,遂看3……

  • 数仓分层剖析,一文了解企业数仓分层

    大大坏将军: 直接用oceanbase数据库分层,做数仓可实现吗?

  • 北京嵌入式开发培训,这样选择更靠谱

    m0_60610959: 单片机有?

  • 嵌入式培训课程路线

    m0_60610959: 单片机有?

最新文章

  • SpringSecurity+OAuth2.0实战精讲教程
  • 零基础怎样学习大数据开发技术
  • Web前端入门学习:从零到精通的捷径
2024
01月 62篇
2023年674篇
2022年716篇
2021年196篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

玻璃钢生产厂家沈阳商场玻璃钢雕塑延寿商场美陈福建玻璃钢马雕塑浙江玻璃钢花盆销售企业佛山玻璃钢气球雕塑天津大型商场创意商业美陈玻璃钢雕塑 腊肉云浮玻璃钢浮雕雕塑公司梅州美陈玻璃钢卡通雕塑榆林卡通玻璃钢雕塑定做玻璃钢卡通小飞象企鹅雕塑北京中庭商场美陈市场报价铜陵景区玻璃钢雕塑厂家通渭玻璃钢雕塑安装浙江通道商场美陈现价抽象玻璃钢雕塑设计厂家济源校园玻璃钢景观雕塑定制乐山玻璃钢游乐场门头雕塑孝感人物玻璃钢雕塑生产厂家室内商场美陈价钱贵州孔子名人玻璃钢雕塑连云港玻璃钢仿真水果雕塑厂家商场美陈作用定制小型玻璃钢花盆玻璃钢公仔雕塑厂家价格通辽广场玻璃钢雕塑安装沈阳玻璃钢骆驼雕塑实景c4d商场美陈玻璃钢花盆手绘简笔画玻璃钢雕塑观音像香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化