美文网首页
java细节

java细节

作者: 曦夫 | 来源:发表于2019-01-31 14:40 被阅读0次
    • 本篇主要记录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细节

          本文链接:https://www.haomeiwen.com/subject/omlksqtx.html