}

}

执行结果是:

2

分析:try中的return语句调用的函数先于finally中调用的函数执行,

也就是说return语句先执行,finally语句后执行,所以,返回的结果是2。

Return并不是让函数马上返回,而是return语句执行后,

将把返回结果放置进函数栈中,此时函数并不是马上返回,

它要执行finally语句后才真正开始返回。

下面用一个程序来帮助分析:

public class Test {

public static void main(String[] args) {

System.out.println(new Test().test());;

}

int test()

{

try {

return func1();

}

finally {

return func2();

}

}

int func1()

{

System.out.println(“func1”);

return 1;

}

int func2()

{

System.out.println(“func2”);

return 2;

}

}

执行结果:

func1

func2

2

结论:finally中的代码比return 和break语句后执行


3. final, finally, finalize的区别

  • final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。内部类要访问局部变量,局部变量必须定义成final类型

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

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


4. Java中的异常处理机制的简单原理和应用

Java对异常进行了分类,不同类型的异常分别用不同的Java类表示,所有异常的根类为java.lang.Throwable,Throwable下面又派生了两个子类:ErrorException

  • Error 表示应用程序本身无法克服和恢复的一种严重问题,程序只有死的份了,例如,说内存溢出和线程死锁等系统问题。

  • Exception表示程序还能够克服和恢复的问题,其中又分为系统异常和普通异常,系统异常是软件本身缺陷所导致的问题,也就是软件开发人员考虑不周所导致的问题,软件使用者无法克服和恢复这种问题,但在这种问题下还可以让软件系统继续运行或者让软件死掉,例如:

数组越界(ArrayIndexOutOfBoundsException)

空指针异常(NullPointerException)

类转换异常(ClassCastException)

找不到类(ClassNotFoundException)

普通异常是运行环境的变化或异常所导致的问题,是用户能够克服的问题,例如:网络断线硬盘空间不够,发生这样的异常后,程序不应该死掉。

java为系统异常和普通异常提供了不同的解决方案,编译器强制

  • 系统异常可以处理也可以不处理,所以,编译器不强制用try…catch处理或用throws声明,所以系统异常也称为unchecked异常。

  • 普通异常必须try…catch处理或用throws声明继续抛给上层调用方法处理,所以普通异常也称为checked异常。

提示答题者,就按照三个级别去思考:

虚拟机必须宕机的错误

程序可以死掉也可以不死掉的错误

程序不应该死掉的错误


5. sleep() 和 wait() 有什么区别?

  • sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。

  • wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。)

下面用一个例子来说明:

public class Test {

public static void main(String[] args) {

new Thread(new Thread1()).start();

try {

Thread.sleep(10);

} catch (InterruptedException e) {

e.printStackTrace();

}

new Thread(new Thread2()).start();

}

private static class Thread1 implements Runnable {

@Override

public void run() {

// 由于这里的Thread1和下面的Thread2内部run方法要用同一对象作为监视器,

// 我们这里不能用this,因为在Thread2里面的this和这个Thread1的this不是同一个对象。

// 我们用Test.class这个字节码对象,当前虚拟机里引用这个变量时,指向的都是同一个对象。

synchronized (Test.class) {

System.out.println(“enter thread1…”);

System.out.println(“thread1 is waiting”);

try {

// 释放锁有两种方式:

// 第一种方式是程序自然离开监视器的范围,也就是离开了synchronized关键字管辖的代码范围,

// 另一种方式就是在synchronized关键字管辖的代码内部调用监视器对象的wait方法。

// 这里,使用wait方法释放锁。

Test.class.wait();

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println(“thread1 is going on…”);

System.out.println(“thread1 is being over!”);

}

}

}

private static class Thread2 implements Runnable {

@Override

public void run() {

synchronized (Test.class) {

System.out.println(“enter thread2…”);

System.out.println(“thread2 notify other thread can release wait status…”);

// 由于notify方法并不释放锁,

// 即使thread2调用下面的sleep方法休息了10毫秒,

// 但thread1仍然不会执行,因为thread2没有释放锁,所以Thread1无法得不到锁。

Test.class.notify();

System.out.println(“thread2 is sleeping ten millisecond…”);

try {

Thread.sleep(10);

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println(“thread2 is going on…”);

System.out.println(“thread2 is being over!”);

}

}

}

}

执行结果:

enter thread1…

thread1 is waiting

enter thread2…

thread2 notify other thread can release wait status…

thread2 is sleeping ten millisecond…

thread2 is going on…

thread2 is being over!

thread1 is going on…

thread1 is being over!

  • sleep就是正在执行的线程主动让出cpu,cpu去执行其他线程,在sleep指定的时间过后,cpu才会回到这个线程上继续往下执行,如果当前线程进入了同步锁,sleep方法并不会释放锁,即使当前线程使用sleep方法让出了cpu,但其他被同步锁挡住了的线程也无法得到执行

  • wait是指在一个已经进入了同步锁的线程内,让自己暂时让出同步锁,以便其他正在等待此锁的线程可以得到同步锁并运行,只有其他线程调用了notify()方法(notify并不释放锁,只是告诉调用过wait方法的线程可以去参与获得锁的竞争了,但不是马上得到锁,因为锁还在别人手里,别人还没释放。如果notify方法后面的代码还有很多,需要这些代码执行完后才会释放锁,可以在notfiy方法后增加一个等待和一些代码,看看效果),调用w

《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享

ait方法的线程就会解除wait状态和程序可以再次得到锁后继续向下运行。wait()必须在synchronized内部调用


6. 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?

分几种情况:

  1. 其他方法前是否加了synchronized关键字,如果没加,则能。

  2. 如果这个方法内部调用了wait,则可以进入其他synchronized方法。

  3. 如果其他个方法都加了synchronized关键字,并且内部没有调用wait,则不能。

  4. 如果其他方法是static,它用的同步锁是当前类的字节码,与非静态的方法不能同步,因为非静态的方法用的是this。


7. 简述synchronized和java.util.concurrent.locks.Lock的异同?

  • 主要相同点:Lock能完成synchronized所实现的所有功能

  • 主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放。Lock还有更强大的功能,例如,它的tryLock方法可以非阻塞方式去拿锁。

例子:

import java.util.concurrent.locks.Lock;

import java.util.concurrent.locks.ReentrantLock;

public class Test {

private int j;

// ReentrantLock 可重入锁,

// 一个线程可以对已被加锁的ReentrantLock锁再次加锁

private Lock lock = new ReentrantLock();

public static void main(String[] args) {

Test tt = new Test();

new Thread(tt.new Adder()).start();

new Thread(tt.new SubTractor()).start();

}

private class SubTractor implements Runnable {

@Override

public void run() {

while (true) {

// synchronized (Test.this) {

// System.out.println(“j–=” + j–);

// //这里抛异常了,锁能释放吗?

// }

lock.lock();

try {

System.out.println("j-- = " + j–);

} finally {

lock.unlock();

}

}

}

}

private class Adder implements Runnable {

@Override

public void run() {

while (true) {

// synchronized (Test.this) {

// System.out.println(“j++=” + j++);

// }

lock.lock();

try {

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

} finally {

lock.unlock();

}

}

}

}

}

执行结果:

···

j++ = 42218

j++ = 42219

j++ = 42220

j-- = 42221

j-- = 42220

j-- = 42219

···


8. 设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序

public class Test {

private int j;

public static void main(String args[]) {

Test tt = new Test();

Inc inc = tt.new Inc();

Dec dec = tt.new Dec();

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

Thread t = new Thread(inc);

t.start();

t = new Thread(dec);

t.start();

}

}

private synchronized void inc() {

j++;

System.out.println(Thread.currentThread().getName() + “-inc:” + j);

}

private synchronized void dec() {

j–;

System.out.println(Thread.currentThread().getName() + “-dec:” + j);

}

class Inc implements Runnable {

public void run() {

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

inc();

}

}

}

class Dec implements Runnable {

public void run() {

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

dec();

}

}

}

}

执行结果:

···

Thread-0-inc:5

Thread-0-inc:6

Thread-2-inc:7

Thread-2-inc:8

···

Thread-2-inc:105

Thread-2-inc:106

Thread-3-dec:105

Thread-3-dec:104

···

Thread-3-dec:7

Thread-3-dec:6

Thread-1-dec:5

Thread-1-dec:4

···

Thread-1-dec:-20

Thread-1-dec:-21

Thread-0-inc:-20

Thread-0-inc:-19

···


9. 子线程循环10次,接着主线程循环5次,接着又回到子线程循环10次,接着再回到主线程又循环5次数。如此循环50次,请写出程序

public class Test {

public static void main(String[] args) {

new Test().init();

}

public void init() {

final Business business = new Business();

new Thread(new Runnable() {

public void run() {

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

business.SubThread(i); // 子线程

}

}

}).start();

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

business.MainThread(i); // 主线程

}

}

private class Business {

//这里相当于定义了控制该谁执行的一个信号灯

boolean isShouldSub = true;

public synchronized void MainThread(int i) {

if (isShouldSub)

try {

this.wait();

} catch (InterruptedException e) {

e.printStackTrace();

}

for (int j = 0; j < 5; j++) {

System.out.println(Thread.currentThread().getName() + “:i=” + i + “,j=” + j);

}

isShouldSub = true;

this.notify();

}

public synchronized void SubThread(int i) {

if (!isShouldSub) {

try {

this.wait();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

for (int j = 0; j < 10; j++) {

System.out.println(Thread.currentThread().getName() + “:i=” + i + “,j=” + j);

}

isShouldSub = false;

this.notify();

}

}

}

执行结果:

···

Thread-0:i=48,j=7

Thread-0:i=48,j=8

Thread-0:i=48,j=9

main:i=48,j=0

main:i=48,j=1

main:i=48,j=2

main:i=48,j=3

main:i=48,j=4

Thread-0:i=49,j=0

Thread-0:i=49,j=1

Thread-0:i=49,j=2

Thread-0:i=49,j=3

Thread-0:i=49,j=4

Thread-0:i=49,j=5

Thread-0:i=49,j=6

Thread-0:i=49,j=7

Thread-0:i=49,j=8

Thread-0:i=49,j=9

main:i=49,j=0

Java 笔试:常见题目总结,android混合开发lua相关推荐

  1. Android最傻瓜式的AOP框架,android混合开发lua

    super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getFragmentManager().beg ...

  2. 编程笔试(解析及代码实现):国内各大银行(招商银行/浦发银行等)在线笔试常见题目(猴子吃桃/字符串逆序输出/一段话输出字的个数/单词大小转换等)及其代码实现(Java/Python/C#等)之详细攻略

    编程笔试(解析及代码实现):国内各大银行(招商银行/浦发银行等)在线笔试常见题目(猴子吃桃/字符串逆序输出/一段话输出字的个数/单词大小转换等)及其代码实现(Java/Python/C#等)之详细攻略 ...

  3. H5+Android混合开发电视APP

     最近公司搞"黑马"项目,想到H5在手机app上的应用很多,但是目前在我们公司电视端的应用几乎为零,所以就拟定题目为<基于H5技术的新型电视应用>,经过43小时的奋 ...

  4. Unity和Android混合开发

    Unity和Android混合开发 通用的流程 https://blog.csdn.net/zhangdi2017/article/details/65629589 应用场景 Unity游戏中一些功能 ...

  5. unity android 版本,Unity2019与Android混合开发

    0. 开始前的版本对齐 Unity版本:Unity2019.3.4f1 AndroidStudio版本:3.5.3 1. Unity -- 准备项目 新建项目 打开File -> Build S ...

  6. Android 混合开发之仿微信朋友圈

    开发之前 大约从去年开始吧, 也可能是前年 Html5好像火得不得了, 不得了-总能从网上听说到 XXX混合开发, 为了紧跟潮流(虽然有点儿晚了), 咱们也看看Android+Html5混合开发是怎样 ...

  7. Android混合开发-(Android与Web的交互)

    在Android开发中,越来越多的商业项目使用了Android原生控件与WebView进行混合开发,当然不仅仅就是显示一个WebView那么简单,有时候还需要本地Java代码与HTML中的JavaSc ...

  8. Android混合开发(二)——JSBridge传值注意点

    本文出自:https://stilljin.blog.csdn.net/article/details/89164231 一丶概述 半年前做手机投屏功能,要求将同一局域网的设备列表传给前端进行交互,国 ...

  9. flutter开发android部分页面,Flutter(Android 混合开发)

    前言 Flutter 支持作为 android Moudle 出现在项目中.这样就可以在 已有的项目中 使用. 虽然现在Flutter 比较受关注,但是和weex 一样 ,大部分都只是在观望 不是真正 ...

最新文章

  1. Java动态excel模板
  2. android自定义相机预览尺寸,相机在Android中,如何获得最佳尺寸,预览尺寸,图片尺寸,视图尺寸,图像扭曲...
  3. 深度学习~卷积神经网络(CNN)概述
  4. Android官方文章翻译之管理设备苏醒状态(Managing Device Awake State)(二)
  5. 什么是真正的高清,你知道吗?
  6. 数据结构实验之栈七:出栈序列判定
  7. linux 查tls模块,TLSSLed · Kali Linux Tools Documents · 看云
  8. 两种方法求解 正数数组中 两个数相减 的最大值
  9. iText 生成复杂表格
  10. react classname多个_React全家桶简介
  11. php md5校验工具下载,md5校验工具下载_md5校验工具下载「最新|免费」-太平洋下载中心...
  12. 威纶触摸屏键盘不显示数字_详解 | 威纶触摸屏数值输入元件应用
  13. (Windows) CodeBlocks 下载
  14. Method类及其用法
  15. 【LeetCode】一年中的第几天
  16. 《数据结构与面向对象程序设计》第1周学习总结
  17. 中级软考-软件设计师(四)
  18. Java实验报告(四)
  19. Satpy基础系列教程(1)-FY4A AGRI L1数据处理
  20. 成神之路 第015期。

热门文章

  1. Pythonnet 安装日记
  2. DB2 开启归档模式
  3. 津津的零花钱一直都是自己管理。每个月的月初妈妈给津津300元钱,津津会预算这个月的花销,并且总能做到实际花销和预算的相同。 为了让津津学习如何储蓄,妈妈提出,津津可以随时把整百的钱存在她那里,到了年
  4. 建筑八大员培训湖北质量员培训古建筑施工中的质量控制要点
  5. 常规调幅系统matlab结果,基于MATLAB的单边带调幅系统的建模仿真.doc
  6. php抓取网页内容实例,详解php中抓取网页内容的实例
  7. 国家采购网:有 DCMM 数据管理认证,加分!
  8. 计算机毕业设计ssm活动报名系统qp88u系统+程序+源码+lw+远程部署
  9. 计算机导论论文英语,计算机导论论文计算机导论论文.doc
  10. 无法远程计算机怎么办,无法连接到远程计算机怎么办