栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

写面试题中遇到的问题(9)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

写面试题中遇到的问题(9)

本文写给正在努力的自己,努力的补基础知识,五道题一篇(今天有点累,题目均比较简单)

ps:我把答案都放在解析下面了

    先来道简单的题目,以下代码输出为多少?
public class Demo3 {
    static int a = 1;

    public static void main(String[] args) {
        int a = 10;
        a++;
        Demo3.a++;
        System.out.println("a:" + a + "   Demo.a:" + Demo3.a);
    }
}

初识想法:各变各的

解析:第一个a和第二个a都开辟了新的地址值,所以在调用的时候各不相关,你变你的,我变我的

答案:a:11 Demo.a:2

    以下代码输出为多少?
 public static void main(String[] args) {
        StringBuffer a = new StringBuffer("A");
        StringBuffer b = new StringBuffer("B");
        operate(a, b);
        System.out.println(a + "." + b);
    }

    static void operate(StringBuffer x, StringBuffer y) {
//        x = y;
        x.append(y);
        y = x;
    }

初识想法:x和y的值变了,跟我a,b有什么关系?

解析:StringBuffer不是基本类型,所以传递是引用传递,上一篇我们讲过,如果是引用传值(又称地址传值),如果使用了=就代表新开辟了一个空间来存储新的值,也就是一个(引用传递)参数a通过=改变了数据空间(如new或者赋值为null),编译解析器会将该参数解析为一个与a同类型同名的局部变量,原来的引用则会在此方法中消失
我们通过他的哈希值来验证这个说法:

但是!要注意的是通过append方法是在该地址值的基础上更改其中的值,所以这个时候a和x指向同一个地址值我们也用打印哈希值的方法来验证这个说法

    以下关于final关键字说法错误的是()
    A. final是java中的修饰符,可以修饰类、接口、抽象类、方法和属性
    B. final修饰的类肯定不能被继承
    C. final修饰的方法不能被重载
    D. final修饰的变量不允许被再次赋值

解析:
1.final修饰变量,则等同于常量
2.final修饰方法中的参数,称为最终参数。
3.final修饰类,则类不能被继承
4.final修饰方法,则方法不能被重写。
5.final 不能修饰抽象类
6.final修饰的方法可以被重载 但不能被重写

答案: AC

    下面有关JVM内存,说法错误的是?
    A. 程序计数器是一个比较小的内存区域,用于指示当前线程所执行的字节码执行到了第几行,是线程隔离的
    B. 虚拟机栈描述的是Java方法执行的内存模型,用于存储局部变量,操作数栈,动态链接,方法出口等信息,是线程隔离的
    C. 方法区用于存储JVM加载的类信息、常量、静态变量、以及编译器编译后的代码等数据,是线程隔离的
    D. 原则上讲,所有的对象都在堆区上分配内存,是线程之间共享的

解析:大多数 JVM 将内存区域划分为 Method Area(Non-Heap)(方法区) ,Heap(堆) , Program Counter Register(程序计数器) , VM Stack(虚拟机栈,也有翻译成JAVA 方法栈的),Native Method Stack ( 本地方法栈 ),其中Method Area 和 Heap 是线程共享的 ,VM Stack,Native Method Stack 和Program Counter Register 是非线程共享的。为什么分为 线程共享和非线程共享的呢?请继续往下看。

首先我们熟悉一下一个一般性的 Java 程序的工作过程。一个 Java 源程序文件,会被编译为字节码文件(以 class 为扩展名),每个java程序都需要运行在自己的JVM上,然后告知 JVM 程序的运行入口,再被 JVM 通过字节码解释器加载运行。那么程序开始运行后,都是如何涉及到各内存区域的呢?

概括地说来,JVM初始运行的时候都会分配好 Method Area(方法区) 和Heap(堆) ,而JVM 每遇到一个线程,就为其分配一个 Program Counter Register(程序计数器) , VM Stack(虚拟机栈)和Native Method Stack (本地方法栈), 当线程终止时,三者(虚拟机栈,本地方法栈和程序计数器)所占用的内存空间也会被释放掉。这也是为什么我把内存区域分为线程共享和非线程共享的原因,非线程共享的那三个区域的生命周期与所属线程相同,而线程共享的区域与JAVA程序运行的生命周期相同,所以这也是系统垃圾回收的场所只发生在线程共享的区域(实际上对大部分虚拟机来说知发生在Heap上)的原因。

答案:C

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/720225.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号