java细节

  • 本篇主要记录java零散又容易错,但是又常常被忽略的问题。更捉急是经常有人喜欢问的(比如一些抽风的面试官,对不起口误,细心的面试管)。所以对这些问题做一些总结。考虑这些问题的时候我都开始怀疑我到底学没学过java。
    ①.因为笔者对jvm虚拟机不是很了解,所以没办法做出深层次的讲解
    ②.所有结论都是查网络,查资料和亲自跳坑得出来的,如果不对的和片面的请看到的不吝赐教

1.java变量声明后直接输出会不会报错?

1.1.举例

public class JavaTest {
     
    //1.类静态变量只声明
    static int a;
    static char c;
    static long l;
    static String s;
    static boolean aBoolean;

    //2.类成员变量只声明
    int anInt;
    char cChar;
    long ll;
    String ss;
    boolean aBoolean2;

    public void test(){
        //3.方法中的局部变量只声明
        int aint;
        System.out.println(aint);   
  
        System.out.println("----类变量-----");
        System.out.println("static int:"+a);
        System.out.println("static char:"+c);
        System.out.println("static long:"+l);
        System.out.println("static String:"+s);
        System.out.println("static boolean:"+aBoolean);

        System.out.println("----类成员变量-----");
        System.out.println("int:"+anInt);
        System.out.println("char:"+cChar);
        System.out.println("long:"+ll);
        System.out.println("String:"+ss);
        System.out.println("boolean:"+aBoolean2);
    }

    public static void main(String[] args) {
       JavaTest t   = new JavaTest();
       t.test();   
    }
}

1.2.输出

  • 其中 ①.类静态变量只声明;②.类成员变量只声明;并不为其赋值,直接使用
----类变量-----
static int:0
static char: 
static long:0
static String:null
static boolean:false
----类成员变量-----
int:0
char: 
long:0
String:null
boolean:false
  • 其中 ③.方法中的局部变量只声明;不为其赋值,直接使用
编译报错:Error:(90, 28) java: 可能尚未初始化变量aint

1.3.结论

  1. 类的成员变量只声明,不赋值直接使用,会输出默认值
    对于类的成员变量(静态变量),不管程序有没有显示的初始化,Java虚拟机都会先自动给它初始化为默认值。
  2. 局部变量只声明直接输出会报错
    ①.局部变量声明后,Java虚拟机不会自动给它初始化为默认值。因此对于局部变量 必须经过显示的初始化,才能使用它。
    ②.如果使用一个没有被初始化的局部变量,编译器会报错。局部变量存储于虚拟机栈的局部变量表中
    ③.局部变量只声明,不初始化,并不会报错,只有在其被使用时,又未初始化,才会报错。(也就说,我只声明一个变量放在那看,没关系的,不过应该没人会这么干)

2.为什么不能在java类中方法外给已定义的成员变量赋值?

2.1.举例

public class JavaTest {

    /**
     * 对成员变量进行声明(定义)
     */
    int test1;
    int test2;

    //1.直接为其赋值
    test1 = 1;
    //2.使用代码块为其赋值
    {
        test2 = 2;
    }

    public void test(){
        System.out.println("test1"+test1);
        System.out.println("test2"+test2);
    }

    public static void main(String[] args) {
      //3.在mian()方法中为已定义变量赋值
       int test3;
       test3 = 3;
       System.out.println("test2"+test2);

       JavaTest t   = new JavaTest();
       t.test();
    }
}

2.2.输出

  • 1.直接在类中为其赋值
编译报错:Error:(64, 8) java: 需要<标识符>
  • 2.使用代码块为其赋值
test2:2

2.3.结论:

  1. 不能直接为已声明的成员变量赋值(初始化)(网上比较好的解释)
    ①.成员变量在类的范围内,存在于堆内存中,会有默认的初始值,在声明的同时已经给变量赋值了。再次”赋值“实际是使用了语句,而类体里面只能出现变量和方法,不能出现语句。
    ②.上面过程是2个操作,第一个,声明一个类的成员变量,第二个,对成员变量赋值,而成员变量属于对象,对它的赋值只能由对象来操作,在类中单独对其赋值,当然要报错了。成员变量可以不用赋初值,在new对象的时候,系统会默认分配一个初值,基本数据类型赋为0,引用类型的成员变量赋值为null
  2. 为什么可以在代码块中执行赋值语句
    ①.代码块的执行是在对象的初始化操作的时候执行,代码块中可以包含任何可执行操作,在代码块中对声明的变量进行初始化,即相当于在类中执行 int test2 = 2; 这个操作。
    ②.在main()方法中,既然是在方法中,那么就是局部变量,也就是一个方法的属性,局部变量声明后,必须赋值才能使用,要不然只能看着。

你可能感兴趣的:(java细节)