请从原理性的方面解释如下问题:
         1.局部变量使用前必须初始化,成员变量可以不初始化?且不能带有任何修饰符,不用修饰符,不就成了default修饰的?
         2.静态方法不可以直接调用非静态方法?非静态方法可以直接调用静态方法?

解决方案 »

  1.   

    1、局部变量使用前必须初始化是很容易理解的,成员变量可以不用初始化的奥秘在于对象生成的过程。
    当你new一个对象时,在调用构造函数前,JVM会先给成员变量赋值:基本类型变量会赋它们默认的值,
    对象引用赋值为null,然后再调用构造方法。比如
    public class Test{
        private int i;
        private int i2 = 2;
        private int i3 = 3;
        private StringBuilder temp;
        public Test(){
            i3=4;
        }
    }
    在如上代码中,当我执行Test test = new Test();时有如下执行顺序;
    i=0;
    i2=2;
    i3=3;
    temp=null;
    调用构造方法
    i3=4;
    所以最后结果:
    i=0;
    i2=2;
    i3=4;
    temp=null;
    需要说明,成员变量可以有修饰符的。2、静态方法不可以直接调用非静态方法,
    原因:静态方法是属于类的方法,非静态方法是属于类对象的方法;现假如我没有创建对象,我
    直接使用类名调用静态方法,而静态方法要调用非静态方法。但是现在没有任何该类的对象,你
    又怎么能够使用对象的方法呢?
    当然在静态方法中还是可以调用构造方法的。关于这些问题,我建议你看看《Java编程思想》第四版,认真的看看,慢慢来,多看几遍,你
    会发现你对面向对象的理解不知不觉中提升了一大步。
      

  2.   

    1、局部变量使用前必须初始化是很容易理解的,成员变量可以不用初始化的奥秘在于对象生成的过程。
    当你new一个对象时,在调用构造函数前,JVM会先给成员变量赋值:基本类型变量会赋它们默认的值,
    对象引用赋值为null,然后再调用构造方法。比如
    public class Test{
        private int i;
        private int i2 = 2;
        private int i3 = 3;
        private StringBuilder temp;
        public Test(){
            i3=4;
        }
    }
    在如上代码中,当我执行Test test = new Test();时有如下执行顺序;
    i=0;
    i2=2;
    i3=3;
    temp=null;
    调用构造方法
    i3=4;
    所以最后结果:
    i=0;
    i2=2;
    i3=4;
    temp=null;
    需要说明,成员变量可以有修饰符的。2、静态方法不可以直接调用非静态方法,
    原因:静态方法是属于类的方法,非静态方法是属于类对象的方法;现假如我没有创建对象,我
    直接使用类名调用静态方法,而静态方法要调用非静态方法。但是现在没有任何该类的对象,你
    又怎么能够使用对象的方法呢?
    当然在静态方法中还是可以调用构造方法的。关于这些问题,我建议你看看《Java编程思想》第四版,认真的看看,慢慢来,多看几遍,你
    会发现你对面向对象的理解不知不觉中提升了一大步。
      

  3.   

    你的这个问题很基础,但是也很深入,楼上几位都一定程度上解释了,但是也都不够透彻。
    对于局部变量没有修饰符,很容易解释,因为局部变量的作用域是固定的。为什么一定要赋值,这牵扯到java虚拟机内部对局部变量的处理方式,因为局部变量在虚拟机内部是没有所谓的变量名的,它只是一个索引项。更深入了解你需要学习jvm,总之先记住这个规范吧。
    对于实例方法可以调用静态方法与静态方法却不能够调用实例方法这也很好理解,实例方法的调用必须要有个实例,静态方法调用它只要new个实例即可调用,直接调用不提供实例是不能调用的,但是对于底层就是实例方法比静态方法多了一个隐含参数,就是第0参数,这个参数是当前实例,而静态方法无法提供这个参数,它没有实例。总之这样的概念可以先记住,至于为什么,等更深入的学习后会慢慢理解的。
      

  4.   

    4楼牛人,是不是JVM中可以这样理解
    public class Test{
        public static void testStatic(String str){)
        public void test(int i){}
    }
    然后,
    Test test = new Test();
    test.test(1);
    Test.testStatic("Hello");
    上面三行代码是不是可以这样写(伪代码):
    Test test = new Test();
    Test.test(test,1);
    Test.testStatic("Hello");
    所以如果,你在testStatic()中调用test()方法,但是test()方法需要传出test对象,但你没有。
    是这样么?
    如果是,就好理解了。
      

  5.   

    1.局部变量使用前必须初始化,成员变量可以不初始化?且不能带有任何修饰符,不用修饰符,不就成了default修饰的? 
    在java里,成员变量会给一个缺省值的,像int是0,double是0.0,String是""。这是语言特性,局部变量java是不会给赋缺省值的,【且不能带有任何修饰符,不用修饰符】纯属瞎扯。        2.静态方法不可以直接调用非静态方法?非静态方法可以直接调用静态方法?
    类里的静态的东西他是不属于对象的,非静态的东西是在调用时动态生成的。静态的则不是。
      

  6.   

    成员变量在你new一个对象时,在调用构造函数前,JVM会先给成员变量赋值
    局部变量声明在方法内部,要使用的话,必须初始化
      

  7.   

    回答5楼的问题。
    你那样理解是可以的,但是却不算正确,因为在java的源代码和实际执行的机制其实出入很大的,java的源代码对于实际执行过程有着很大的误导性,也许你看java的源代码是这样理解或者这样想的,但是你如果会阅读class的字节码(字节码助记符也可以,用javap命令可以看到),你会发现根本不是你想的那么回事(大多数情况是如此,也许有某些天才能够想到)。
      

  8.   

    这个我可以解释下其实两个问题都可以归为一个问题就是一个类生命周期和对象生命周期的问题。
    简单的说静态方法和成员变量的声明在类装载的过程中就完成了。
    而且具体到局部变量要到对象生命周期中实现。
    如果你懂一点发射你就会发现只要有Class就能直接调用静态方法。如果要掉非晶态方法是需要实例化对象。如果你在静态方法中调用非静态方法就会有这样一个冲突,也许你这个类是还没有被实例化为对象的。所以是不可以的。