JavaSE面试题——成员变量(类变量 & 实例变量) & 局部变量

简介: JavaSE面试题——成员变量(类变量 & 实例变量) & 局部变量

1.Go!!!


以下代码的运行结果是:👇👇👇

/**
 *
 */
public class Exam2 {
    static int s; //成员变量,类变量
    int i; //成员变量,实例变量
    int j; //成员变量,实例变量
    {
        int i = 1; //非静态代码块中的局部变量 i
        i++;
        j++;
        s++;
    }
    public void test(int j) { //形参,局部变量,j
        j++;
        i++;
        s++;
    }
    public static void main(String[] args) { //形参,局部变量,args
        Exam2 obj1 = new Exam2(); //局部变量,obj1
        Exam2 obj2 = new Exam2(); //局部变量,obj2
        obj1.test(10);
        obj1.test(20);
        obj2.test(30);
        System.out.println(obj1.i + ", " + obj1.j + ", " + obj1.s);
        System.out.println(obj2.i + ", " + obj2.j + ", " + obj2.s);
    }
}



这道题的考点主要有:就近原则、变量的分类及作用域、非静态代码块的执行、方法的调用规则。


  • 就近原则:就是某个变量在进行操作时,如果有重名的对象,它会去寻找离自己最近的那个。(上述代码非静态代码块中的 i++ ,这个i表示的就是上面离它最近的局部变量 int i=1;  在test方法中的 j++ ,这个j表示的是离它最近的也就是test方法中的形参j)
  • 变量的分类:总体可以分为两大类(局部变量、成员变量(类变量、实例变量))。局部变量就是声明在方法体中的、形参、代码块{}中。成员变量声明在类中方法体外,static修饰的成员变量称为 类变量或者静态变量;非static修饰的成员变量称为 实例变量或非静态变量。
  • 三大变量的存储位置:局部变量---栈;实例变量---堆;类变量---方法区。
  • 三大变量的修饰符:局部变量(final);成员变量(public、protected、private、final、static、volatile、transient)。
  • 三大变量的作用域:局部变量(从声明处开始,到所属的方法体、代码块的大括号 } 结束);实例变量(在当前类中 this. ,可以省略;在其他类中 对象名. );成员变量(在当前类中 类名. ,可以省略;在其他类中 类名. 或 对象名. )。
  • 三大变量的生命周期:局部变量(每一个线程每一次调用执行都是新的生命周期);实例变量(随着对象的创建而初始化,随着对象的被回收而消亡,每一个对象的实例变量都存储在栈区中,是相互独立的);类变量(随着类的初始化而初始化,随着类的消亡而消亡,每一个类变量对于该类的所有对象都是共享的)。
  • 非静态代码块的执行:每次创建实例对象的时候都会执行(静态代码块只会执行一次)
  • 方法的调用规则:调用一次就会执行一次。

对于代码中的每一行的执行流程,我都画了相应的内存图。(如果有理解不到位的地方,还望大佬指出!!!)




相关文章
|
4月前
|
安全 Java 容器
【Java集合类面试二十七】、谈谈CopyOnWriteArrayList的原理
CopyOnWriteArrayList是一种线程安全的ArrayList,通过在写操作时复制新数组来保证线程安全,适用于读多写少的场景,但可能因内存占用和无法保证实时性而有性能问题。
|
4月前
|
存储 安全 Java
【Java集合类面试二十五】、有哪些线程安全的List?
线程安全的List包括Vector、Collections.SynchronizedList和CopyOnWriteArrayList,其中CopyOnWriteArrayList通过复制底层数组实现写操作,提供了最优的线程安全性能。
|
4月前
|
Java
【Java集合类面试二十八】、说一说TreeSet和HashSet的区别
HashSet基于哈希表实现,无序且可以有一个null元素;TreeSet基于红黑树实现,支持排序,不允许null元素。
|
4月前
|
Java
【Java集合类面试二十六】、介绍一下ArrayList的数据结构?
ArrayList是基于可动态扩展的数组实现的,支持快速随机访问,但在插入和删除操作时可能需要数组复制而性能较差。
|
1月前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
135 4
|
3月前
|
安全 Java 应用服务中间件
JVM常见面试题(三):类加载器,双亲委派模型,类装载的执行过程
什么是类加载器,类加载器有哪些;什么是双亲委派模型,JVM为什么采用双亲委派机制,打破双亲委派机制;类装载的执行过程
109 35
JVM常见面试题(三):类加载器,双亲委派模型,类装载的执行过程
|
2月前
|
JSON 调度 数据库
Android面试之5个Kotlin深度面试题:协程、密封类和高阶函数
本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点。文章详细解析了Kotlin中的协程、扩展函数、高阶函数、密封类及`inline`和`reified`关键字在Android开发中的应用,帮助读者更好地理解和使用这些特性。
40 1
|
4月前
|
存储 Java
【Java集合类面试二十九】、说一说HashSet的底层结构
HashSet的底层结构是基于HashMap实现的,使用一个初始容量为16和负载因子为0.75的HashMap,其中HashSet元素作为HashMap的key,而value是一个静态的PRESENT对象。
|
4月前
|
Java
【Java集合类面试三十】、BlockingQueue中有哪些方法,为什么这样设计?
BlockingQueue设计了四组不同行为方式的方法用于插入、移除和检查元素,以适应不同的业务场景,包括抛异常、返回特定值、阻塞等待和超时等待,以实现高效的线程间通信。
【多线程面试题 二】、 说说Thread类的常用方法
Thread类的常用方法包括构造方法(如Thread()、Thread(Runnable target)等)、静态方法(如currentThread()、sleep(long millis)、yield()等)和实例方法(如getId()、getName()、interrupt()、join()等),用于线程的创建、控制和管理。

热门文章

最新文章