• java代码声明引用变量经验


    1.static只能修饰类的成员变量,不能修饰方法里的局部变量。

    因为static是在类加载时候将成员变量存储进方法区的。

    加载类的时候,是不去执行方法里的函数的。所以不会馆方法里的代码,自然就不会读取到static变量了。

    如,这个代码就是错误的

    class Student{
    private string name;
    public void setName(string str)
    {
        static int a = 1;//这里错误,static只能修饰类的成员变量
    }
    }

    2.new一个对象或者加载一个类的时候,是不是执行方法里的代码的。

    而且new的对象,在堆中的存储空间就是成员变量的存储空间。

    方法函数是不占代码的,方法里的代码全都存储在方法区里面。只有在执行方法时,才会找到方法区的代码,放到cpu里执行

    3.java对垃圾回收是通引用变量来管理内存的。引用变量分为静态引用变量,成员变量,局部变量。

    三种变量意味三种不同的生命周期对象。

    局部变量,意味着方法执行时创建,执行完成后销毁。其生命周期和方法一样。

    成员变量,意味着随着此类被new创建时而创建,此对象被销毁后跟随销毁,与对象的生命周期一样。

    static变量,意味着生命周期最长,随着类被加载而创建,只要不认为控制垃圾回收,静态变量是一直生存的。

    4.非静态方法可以调用静态方法,静态方法不能调用非静态方法。

    什么意思?答:因为静态方法是在类加载时被存储进方法区的,而非静态方法是在程序执行时才调用的。一前一后,程序总是先加载后执行的,所以俩生命周期不一致,

    只能后面的访问前面的,即非静态方法可以调用静态方法。但静态方法不能访问非静态方法,因为加载时,非静态方法还没被执行呢。

    5.方法区的数据是线程共享的,每个线程都可以访问修改方法区数据。所以要给设置static变量的static方法加锁,以保证static变量的线程安全。

    1.这里的synchronized锁住的是Student.class这个对象。因为方法是静态static的。

    public class Student {    
        public  static String name = "abc";
        public  static String age = "123";
        synchronized public static void set(String name1,String age1) {
            Student.name = name1;
            Student.age = age1;
        }    
    }

    2.如果不加static,方法变为synchronized public  void set(String name1,String age1) {}。锁住的是这个对象的锁。

    public class Student {    
        public  static String name = "abc";
        public  static String age = "123";
        synchronized public void set(String name1,String age1) {
            Student.name = name1;
            Student.age = age1;
        }    
    }

    6.static变量设置private或者public问题。为了保证static变量线程安全,一般设置static变量的访问属性为private,然后再static变量的set方法设置为public并加锁,以保证线程安全。

    如:

    public class Student {    
        private  static String name = "abc";//private 修饰
        private  static String age = "123";
        synchronized public static void set(String name1,String age1) {
            Student.name = name1;
            Student.age = age1;
        }    
    }

    7.局部变量的生命周期是在一个大括号内,即一个所处块结束。如循环体内定义的int j;

    java 是块作用域 
    一个 {} 就是一个独立的作用域空间 
    每次循环的时候,都会有一个新的作用域空间
    你在for循环体外是看不到my的,也是因为超出了作用域空间。

    循环第二次的时候,就有一个重名的my了呀?为什么还是能正常运行,不报错?

  • 相关阅读:
    什么时候加上android.intent.category.DEFAULT和LAUNCHER
    android中跨进程通讯的4种方式
    Unix Sockets in Go
    android Service 跨进程通信
    Android Activity和Intent机制学习笔记
    AIR 移动设备上的存储控制
    AIR Android开发APK结构详解
    android 内存管理
    Android权限大全
    运营商登录付费接入ANE打包心得
  • 原文地址:https://www.cnblogs.com/panxuejun/p/5896731.html
Copyright © 2020-2023  润新知