首页 > 试题广场 >

关于以下程序代码的说明正确的

[单选题]

关于以下程序代码的说明正确的

class HasStatic{
    private static int x = 100;
    public static void main(String args[ ]){
        HasStatic hs1 = new HasStatic();
        hs1.x++;
        HasStatic hs2 = new HasStatic();
        hs2.x++;
        hs1=new HasStatic();
        hs1.x++;
        HasStatic.x--;
        System.out.println( "x=" +x);
    }
}


  • 5行不能通过编译,因为引用了私有静态变量
  • 10行不能通过编译,因为x是私有静态变量
  • 程序通过编译,输出结果为:x=103
  • 程序通过编译,输出结果为:x=102
推荐
答案选D
因为x的 修饰符为 static 所以x为类变量,即对于所有的实例来说,他们访问的x为同一个x,类变量存储在方法区,不属于每个实例的私有,
刚开始x=100
调用hs1.x++   x为101;
调用hs2.x++   x为102;
调用hs1.x++   x为103 (此时hs1指向了一个新的HasStatic实例,但是依然访问的是同一个X)
调用HasStatic.x--  x为102
所以结果为D
编辑于 2017-03-18 08:52:44 回复(11)

我感觉主要原因应该是main方法和静态私有变量处在同一个类中,变量对main方法是可见的,所以可以访问,如果不在同一个类里面的话,是不可以访问私有变量的

发表于 2017-03-28 19:55:40 回复(14)
如果变量被static修饰,那么该变量属于类,该类的所有对象操作的都是同一个变量。
发表于 2017-02-27 00:01:37 回复(0)
static修饰的变量为静态变量。 静态变量是线程共享,无论谁调用,都指向同一个变量。存储在方法区。 方法区是各个线程共享的内存区域,存放已经被虚拟机加载的类、常量、静态变量、即时编译器编译后的代码。
发表于 2017-01-09 12:38:30 回复(3)
选D
这题考了两点:
1. private成员,只有在本类中才能被访问。
2. static成员属于类本身,不同实例共享。
编辑于 2018-07-09 09:52:19 回复(0)
经代码实验,此处是main函数在这个类内部,因而可以访问私有的静态成员,在其他类中的main方法是会显示语法有错:
The field HasStatic.x is not visible
发表于 2017-10-11 14:01:29 回复(2)
因为修饰符为static所以x为类变量  对所有的实例来说 他们访问的x为同一个x??? 静态变量存储在方法区,不属于每个实例的私有
发表于 2016-12-27 15:55:18 回复(0)
private 修饰的变量,访问权限仅在本类之中。public static void Main(String arg[]){}如果在该类中,也属于本类。
发表于 2017-05-13 15:11:25 回复(0)

结果

程序通过编译,输出结果为:x=102

解析

  • 一个类中的静态变量可以被它的对象所调用;也可以通过类名进行调用。

  • 虽然x是私有的静态变量,但是在同一个类中依然可以被该类的对象或类名直接调用。

  • 被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。所有的自增自减都是在对同一个x进行操作。

  • 由于x是一个静态变量,所有可以在main方法中可以被直接调用。

发表于 2021-01-22 15:08:06 回复(0)
静态变量是存储在方法区的,由于方法区线程共享的,所以静态变量是共享变量,所以不管是实例对象对该变量操作还是类对该变量操作,操作对象都是同一个变量
发表于 2017-05-04 09:41:31 回复(0)
小本本记一下:
因为x的 修饰符为 static 所以x为类变量,即对于所有的实例来说,他们访问的x为同一个x,类变量存储在方法区,不属于每个实例的私有,
刚开始x=100
调用hs1.x++   x为101;
调用hs2.x++   x为102;
调用hs1.x++   x为103 (此时hs1指向了一个新的HasStatic实例,但是依然访问的是同一个X)
调用HasStatic.x--  x为102

发表于 2020-03-16 13:06:18 回复(0)
我居然自信满满的选择了A,,,,,
发表于 2018-04-11 20:13:52 回复(0)
x的 修饰符为 static 所以x为类变量,类变量的调用是类名.变量的方式,但是通过实例.变量也能调,编译也能通过,只是不建议这样调。对于所有的实例来说,他们访问的x为同一个x,x自增了3次,自减了一次,所以最后能正常打印x且值为102。
发表于 2022-08-14 19:03:48 回复(0)
静态变量是线程共享的
发表于 2022-08-08 09:43:14 回复(0)
public class Test {
    private static int i = 100;
    public static void main(String[] args) {
        Test s1 = new Test();
        s1.i++;
        System.out.println("s1.i=" + s1.i + "|" + "i = " + i);

        Test s2 = new Test();
        s2.i++;
        System.out.println("s2.i=" + s2.i + "|" + "i = " + i);

        s1 = new Test();
        s1.i++;
        System.out.println("s1.i=" + s1.i + "|" + "i = " + i);

        Test.i--;
        System.out.println("Test.i = " + Test.i);
        System.out.println("i= " + i);
    }
}

发表于 2021-05-13 13:24:22 回复(0)
static相当于一个全局变量,属于类,本类和它的实例共享它,一旦某个对象改变该值,则所有对象都受到影响
编辑于 2018-12-21 19:56:30 回复(0)
static修饰的是类变量,它的所有的实例都是访问的同一块区域
发表于 2018-11-06 20:03:25 回复(0)
http://stackoverflow.com/questions/3293353/how-come-invoking-a-static-method-on-a-null-reference-doesnt-throw-nullpointe

一个原理,都是通过对象访问静态成员,只于类型相关,和实例无关。
编辑于 2017-02-27 23:45:05 回复(0)
因为static是静态方法,随着类的加载而加载,所以只加载一次是100,通过对象调用属性,因为是静态的也可以类调用
发表于 2022-03-29 20:35:12 回复(0)
srx头像 srx

x为static变量,所以所有的x均为同一个,操作均在同一个x上进行

发表于 2019-11-29 11:06:12 回复(0)
选D
X被static修饰,是静态变量,所有类的实例对象都能修改,故,经过三次加1操作和一次减1操作后,得到的结果为102。
发表于 2017-03-10 10:31:22 回复(0)