JavaSE面试题:成员变量与局部变量

public class Variable {

    static int s;//成员变量,类变量
    int i;//成员变量,实例变量
    int j;//成员变量,实例变量

    {
        int i = 1;//非静态代码块中的局部变量  i
        i++; //此时的 i 指的是上一行的 i 而非代码块外声明的 i (就近原则)
        j++;
        s++;
    }

    public void test(int j) {//形参,局部变量  j
        j++;
        i++; //此时的 i 不仅仅要就近原则,而且要考虑作用域,所以此时的 i 应是最开始声明的 i,因为最近的 i 在非静态代码块结束以后就失效了
        s++;
    }

    public static void main(String[] args) {//形参,局部变量  args
        Variable v1 = new Variable();//局部变量  v1
        Variable v2 = new Variable();//局部变量  v2
        v1.test(10);
        v1.test(20);
        v2.test(30);
        System.out.println(v1.i + "," + v1.j + "," + v1.s);
        System.out.println(v2.i + "," + v2.j + "," + v2.s);
    }
}

/**
 * 答案
 * 2,1,5
 * 1,1,5
 */
/**
 * 考点:
 *
 * 1、就近原则
 *
 * 2、变量的分类
 *      成员变量:类变量、实例变量
 *      局部变量
 *
 * 3、非静态代码块的执行:每次创建实例对象都会执行
 *
 * 4、方法的调用规则:调用一次执行一次
 */
/**
 * 成员变量与局部变量的区别
 *
 * 1、声明的位置
 *      局部变量:方法体 {} 中,形参,代码块 {} 中
 *      成员变量:类中方法外
 *              类变量:有static修饰
 *              实例变量:没有static修饰
 *              
 * 2、修饰符
 *      局部变量:final
 *      成员变量:public protected private final static volatile transient
 *      
 * 3、值存储的位置
 *      局部变量:栈
 *      实例变量:堆
 *      类变量:方法区
 *      
 * 4、作用域
 *      局部变量:从声明处开始,到所属的}结束
 *      实例变量:在当前类中 "this."(有时this.可以缺省),在其他类中 "对象名."访问
 *      类变量:在当前类中 "类名."(类名.可以缺省),在其他类中 "类名."或"对象名."访问
 *      
 * 5、生命周期
 *      局部变量:每一个线程,每一次调用执行都是新的生命周期
 *      实例变量:随着对象的创建而初始化,随着对象的被回收而消亡,每一个对象的实例变量是独立的
 *      类变量:随着类的创建而初始化,随着类的卸载而消亡,该类的所有对象的类变量是共享的
 */
其他注意:
	当局部变量与实例变量重名,在实例变量前面加"this."
	当局部变量与类变量重名,在实例变量前面加"类名."

你可能感兴趣的:(面试题,java,jvm,面试)