为什么java局部变量没有初始化就会报错,而成员变量没有初始化就不会报错?

  代码如下

  1.局部变量,报错!!!

public void test(){
        int i;
        System.out.println(i);
    }

  2.成员变量,输出0

    int i;
    @Test
    public void test(){
        System.out.println(i);
    }

  之前一直有疑问,但是也不知道具体是什么原因,今天看了thinking in java大致就了解了:
  其实说到底还是java规范,因为java规定要这样就必须这样==。

  原理就是,java规定,所有变量在使用之前要保证是经过初始化的,那么,局部变量报错的原因就很明显了!

  但是,为什么成员变量就不会呢,成员变量在使用之前如果没有初始化,jvm就会帮我们初始化,

  默认值如下:
             Boolean      false
             Char           ‘\u0000‘(null)
             byte            (byte)0
             short           (short)0
             int               0
             long            0L
             float            0.0f
             double        0.0d

  原因就是,jvm认为我们完全有可能在某一个方法中对该成员变量进行初始化,所以就不会报错,而且没有初始化的话就会自动帮我们初始化,赋给默认值!

  但是要记住一点,无论如何,每个变量都会进行自动初始化,这是无法阻止的,也就是我们自己初始化之前,java都会先执行自动初始化。

时间: 2024-09-30 04:10:49

为什么java局部变量没有初始化就会报错,而成员变量没有初始化就不会报错?的相关文章

Java中的null对象也可以访问static成员变量和方法

声明:本博客为原创博客,未经允许,不得转载!小伙伴们如果是在别的地方看到的话,建议还是来csdn上看吧(链接为 http://blog.csdn.net/bettarwang/article/details/26515271),看代码和提问.讨论都更方便. 一般来说,一个类的对象要在实例化之后才可以访问类中的成员变量和方法.如果它还是null,通常意义上我们就认为它不能访问类中的成员.实际上确实不提倡这样,而且null对象确实不能访问实例成员(变量和方法),否则会引发NULLPointerExc

成员变量与初始化块

public class A { public int number = 5; { number = 10; } public static void main(String[] args) { A a = new A(); System.out.println(a.number); }} 这段代码的执行结果是a的值是10;下面将初始化块和成员变量交换一下顺序让成员变量在后面 public class A { { number = 10; } public int number = 5; pub

C++成员变量的初始化顺序问题

转载自:http://www.cnblogs.com/lidabo/p/3790606.html ,感谢作者! 问题来源: 由于面试题中,考官出了一道简单的程序输出结果值的题:如下, class A { private: int n1; int n2; public: A():n2(0),n1(n2+2){} void Print(){ cout << "n1:" << n1 << ", n2: " << n2 <

C++ 成员变量的初始化与构造函数

<pre name="code" class="cpp"># include<iostream> using namespace std; class demo { public: demo(){x=0;cout<<"demo的默认构造函数!"<<x<<endl;} demo(int i){x=i;cout<<"demo的带一个参数的构造函数!"<&

C++自学笔记_特殊的成员变量的初始化方法_《C++ Primer》

有些成员变量的数据类型比较特别,它们的初始化方式也和普通数据类型的成员变量有所不同.这些特殊的类型的成员变量包括: a.引用 b.常量 c.静态 d.静态常量(整型) e.静态常量(非整型) 常量和引用,必须通过参数列表进行初始化. 静态成员变量的初始化也有点特别,是在类外初始化且不能再带有static关键字. #include <iostream> using namespace std; class BClass{ public: BClass():i(1),ci(2),ri(i){} /

C++基础知识---static const成员变量的初始化

为了将常量的作用域限制于class内,你必须让让成为class的一个成员:而为确保此常量之多只有一份实体,你必须让让成为一个static成员: Class Gameplayer { Private: Staticconst int Number = 5;  //常量声明式 Intscores[Number];  //使用该常量 }: 然而你所看到的是Number的声明式而非定义式.通常C++要求你对你所使用的任何东西提供一个定义式,但如果他是个class专属常量又是static且为整数类型,则需

Android(java)学习笔记:109:通过反射获取成员变量并且使用

1 package cn.itcast_03; 2 3 import java.lang.reflect.Constructor; 4 import java.lang.reflect.Field; 5 6 /* 7 * 通过发生获取成员变量并使用 8 */ 9 public class ReflectDemo { 10 public static void main(String[] args) throws Exception { 11 // 获取字节码文件对象 12 Class c = C

【转】Java类成员变量默认初始化规则

一个变量作为类成员使用的时候,如果没有被初始化,java会为其分配默认值: ----------------------------------------------------------------------------------------- Boolean false Char '\u0000'(null) byte (byte)0 short (short)0 int 0 long 0L float 0.0f double 0.0d -----------------------

C++类中成员变量的初始化总结

1. 普通的变量:      一般不考虑啥效率的情况下 可以在构造函数中进行赋值.考虑一下效率的可以再构造函数的初始化列表中进行. 1 class CA  2 {  3 public:  4      int data;  5 public:  6      CA();  7 };  8     9 CA::CA():data(0) //……#1……初始化列表方式 10 { 11     //data = 0;//……#1……赋值方式 12 }; 2.static 静态变量:       sta