前言

上一篇文章总结了 老外常见的 Java 面试题上,如果有感兴趣的同学可以点击查看,接下来补上下半部。

正文

finalize 方法调用了多少次

关于 finalize 总结了以下几点:
  • finalize() 方法由垃圾收集器调用。对于每个对象,垃圾收集器只调用 finalize() 方法一次
  • finalize() 是 Object 的 protected 方法,子类可以覆盖该方法以实现资源清理工作,GC 在回收对象之前调用该方法。
  • finalize() 与 C++ 中的析构函数不是对应的。C++ 中的析构函数调用的时机是确定的(对象离开作用域或delete 掉),但 Java 中的 finalize 的调用时机是不确定的
如何理解 finalize() 的调用时机?

当垃圾回收器要宣告一个对象死亡时,至少要经过两次标记过程:

  • 如果对象在进行可达性分析后发现没有和 GC Roots 相连接的引用链,就会被第一次标记,并且判断是否执行 finalize() 方法。
  • 如果对象覆盖 finalize( ) 方法且未被虚拟机调用过,那么这个对象会被放置在 F-Queue 队列中,并在稍后由一个虚拟机自动建立的低优先级的 Finalize 线程区执行触发 finalize() 方法,但不承诺等待其运行结束。

finalization 的目的:对象逃脱死亡的最后一次机会。(只要重新与引用链上的任何一个对象建立关联即可。)但是不建议使用,运行代价高昂,不确定性大,且无法保证各个对象的调用顺序。

可用try-finally或其他替代。

this 和 super 关键字可以同时调用吗

  • super 从子类中调用父类的构造方法,this() 在同一类内调用其它方法。
  • 尽管可以用 this 调用一个构造器,但却不能调用两个
  • this 和 super 不能同时出现在一个构造函数里面,因为 this 必然会调用其它的构造函数其它的构造函数必然也会有 super 语句的存在,所以在同一个构造函数里面有相同的语句,就失去了语句的意义
  • 从本质上讲,this 是一个指向本对象的指针, 然而 super 是一个Java关键字

你能在执行 main() 方法之前运行一个代码吗

在 Java 中,如果想在 main() 方法之前运行一段代码,只需要定义一个 static {} 静态代码块,就可以让 static 里的代码执行在 main() 方法之前。

public class staticFactory {
static {
System.out.println("static");
} public static void main(String[] args) {
System.out.println("main");
}
}
// 输出
// static main

为什么 Java 本质上是动态的

Java 本质为静态语言,而不是动态语言。动态语言显著的特点是在程序运行时,可以改变程序结构或变量类型,典型的动态语言有 Python、ruby、javascript 等。Java 不是动态语言,但 Java 具有一定的动态性,表现在以下几个方面:

  • 反射机制
  • 动态字节码操作
  • 动态编译
  • 执行其他脚本代码

解释下守护进程线程

在Java中有两类线程:User Thread(用户线程)Daemon Thread(守护线程)

  • 守护线程 是高优先级线程。JVM 会在终止之前等待任何用户线程完成其任务
  • 用户线程 是低优先级线程。其唯一作用是为用户线程提供服务。

用个比较通俗的比如,任何一个守护线程都是整个 JVM 中所有非守护线程的保姆:

只要当前 JVM 实例中尚存在任何一个非守护线程没有结束,守护线程就全部工作;只有当最后一个非守护线程结束时,守护线程随着JVM一同结束工作。

User 和 Daemon 两者几乎没有区别,唯一的不同之处就在于虚拟机的离开:如果 User Thread 已经全部退出运行了,只剩下 Daemon Thread 存在了,虚拟机也就退出了。 因为没有了被守护者,Daemon 也就没有工作可做了,也就没有继续运行程序的必要了。

如何实现一个守护线程?
NewThread daemonThread = new NewThread();
daemonThread.setDaemon(true);
daemonThread.start();

使用守护线程有几点需要注意:

  • thread.setDaemon(true) 必须在 thread.start() 之前设置,否则会跑出一个 IllegalThreadStateException异常。你不能把正在运行的常规线程设置为守护线程。
  • 在 Daemon 线程中产生的新线程也是 Daemon 的。
  • 不要认为所有的应用都可以分配给 Daemon 来进行服务,比如读写操作或者计算逻辑。

解释 >> 和 >>> 运算符之间的区别

虽然它们看上去比较像,但两者之间区别还是很大的。

>> 按位右移运算符。左操作数按位右移右操作数指定的位数。 即:A >> 2得到15即 1111
>>> 按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。即:A>>>2得到15即0000 1111

我们能重载一个静态方法吗

java 的静态方法不能被重写。 静态成员(方法或属性)是类的成员存放在栈中,类可以直接调用(是属于类的静态成员,当然对象也可以调用,只是说你可以使用而已);实例成员是对象的成员,存放在堆中,只能被对象调用。 重写的目的在于根据创造对象的所属类型不同而表现出多态

总结:

以上就是总结的剩余的面试题,其实和我们平时的面试题还是有一些差距。不过在整理面试题的时候,有一个题的答案非常有争议,网上也是怎么讨论的都有,所以准备单独拿出有争议的去分析。

你见过老外的 Java 面试题吗(下)?的更多相关文章

  1. 你见过老外的 Java 面试题吗 (上)?

    前言 最近无聊的在逛某 tube 网站,本来想看看大家是怎么吐槽川普的,结果无意间点进了一个老外面试 Java 的视频,对于常年面试被吊打的我瑟瑟发抖,于是决定进去一探究竟. 毕竟不是专业的后台开发, ...

  2. java面试题全集(下)

      这部分主要是开源Java EE框架方面的内容,包括Hibernate.MyBatis.Spring.Spring MVC等,由于Struts 2已经是明日黄花,在这里就不讨论Struts 2的面试 ...

  3. Java笔试题解答和部分面试题

    面试类  银行类的问题 问题一:在多线程环境中使用HashMap会有什么问题?在什么情况下使用get()方法会产生无限循环? HashMap本身没有什么问题,有没有问题取决于你是如何使用它的.比如,你 ...

  4. 尚学堂Java面试题整理

    博客分类: 经典分享   1. super()与this()的差别? - 6 -  2. 作用域public,protected,private,以及不写时的差别? - 6 -  3. 编程输出例如以 ...

  5. 金三银四季来了!Java 面试题大放送,能答对70%就去BATJTMD试试~

    摘要: 2019,相对往年我们会发现今年猎头电话少了,大部分企业年终奖缩水,加薪幅度也不如往年,选择好offer就要趁早,现在开始准备吧,刷一波Java面试题,能回答70%就去BATJTMD大胆试试~ ...

  6. 20 几个知名公司的 Java 面试题汇总

    查看不同公司新鲜真实的Java面试题,摘自Glassdoor.com 巴克莱投资: 假设有一个 getNextparson() 方法返回 Person 对象,Person 类实现了 comparabl ...

  7. 《OD面试》Java面试题整理

    一.面试考察点 1 主语言本身 2 数据库 3 算法 4 Spring/SpringMVC/MyBatis 5 项目经验 1)项目涉及到的技术点深挖: (1)考察候选人技术深度  (2)看候选人遇到问 ...

  8. Java面试题汇总---升级版(附答案)

    前几天写了Java面试题汇总---基础版,总结了面试中常见的问题及答案,那我今天基于昨天的话题做一次升级,也就是说,求职者除了要学习了解哪些常见的基础面试题之外,还得准备些什么呢? 对有工作经验的求职 ...

  9. 挑战10个最难的Java面试题(附答案)【上】【华为云技术分享】

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/devcloud/article/deta ...

随机推荐

  1. NodeRED - 全局变量的使用笔记

    NodeRED - 全局变量的使用笔记 global global.get(..) :获取全局范围的上下文属性 global.set(..) :设置全局范围的上下文属性 global.keys(..) ...

  2. Sqoop export参数updatemode两种模式updateonly和allowinsert区别

    1.更新导出(updateonly模式)1.1参数说明-- update-key,更新标识,即根据某个字段进行更新,例如id,可以指定多个更新标识的字段,多个字段之间用逗号分隔. -- updatem ...

  3. [AHOI2009] [BZOJ1799] 月之迷 (数位DP)

    给出两个数a,ba,b,求出\([a,b]\)中各位数字之和能整除原数的数的个数. 我们按照模板的做法来想,枚举到第pos位时,要确定这一位的数字,可以更新现在所填数字的和,但对于最终的和无从得知,是 ...

  4. Codeforces Round #667 (Div. 3) D. Decrease the Sum of Digits (贪心)

    题意:给你一个正整数\(n\),每次可以对\(n\)加一,问最少操作多少次是的\(n\)的所有位数之和不大于\(s\). 题解:\(n\)的某个位置上的数进位,意味这后面的位置都可以被更新为\(0\) ...

  5. Windows环境下Robot Framework 下载及安装流程

    1.安装包下载 注意安装包统一64位或32位 1)python-2.7.16.amd64.msi 2)robotframework-3.0.2.tar.gz 3)robotframework-ride ...

  6. Vue的七种传值方式

    目录 1,父传子 2,子传父 3,兄弟组件传值 4,父组件使用子组件的数据和方法 5,子组件使用父组件的数据和方法 6,Vuex传值 6.1,定义store 6.2,挂载 6.3,使用 7,路由传值 ...

  7. Python3.5 配置MySql数据库连接

    #!coding:utf-8 import pymysql ''' Python3之后不再支持MySQLdb的方式进行访问mysql数据库: 可以采用pymysql的方式 连接方式: 1.导包 imp ...

  8. Dapr微服务应用开发系列1:环境配置

    题记:上篇Dapr系列文章简要介绍了Dapr,这篇来谈一下开发和运行环境配置 本机开发环境配置 安装Docker 为了方便进行Dapr开发,最好(其实不一定必须)首先在本机(开发机器)上安装Docke ...

  9. 容器技术学习系列(一)-Docker基础知识学习

    一.概述 1.Docker是什么? 1)Docker是世界领先的软件容器化平台 2)Docker公司开发,开源,托管在github 3)跨平台,支持Windows.MacOS.Linux 2.Dock ...

  10. 23 种设计模式 APP & 23 Design Patterns App

    23 种设计模式 APP & 23 Design Patterns App https://github.com/xgqfrms/23-design-patterns-app https:// ...