变量方法以及静态和非静态

Posted Dev_Nick

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了变量方法以及静态和非静态相关的知识,希望对你有一定的参考价值。

变量
变量的种类:
    1、成员变量
    2、局部变量
成员变量与局部变量的区别:
    定义位置的区别
        1、成员变量定义在方法之外,类之内。
        2.局部变量定义在方法之内。
    作用的区别:
        1、成员变量用于描述事物的公共属性。
        2、局部变量提供一个一个变量给方法内部使用。
    生命周期的区别:
        1、成员变量随着对象的创建而存在,对着对象的消失而消失。
        2、局部变量在调用了对应的方法时执行到了创建该变量的语句时存在,一旦出了自己的作用域会马上从内存中消失。
    初始值得区别:
        1、成员变量有默认初始值:
            数据类型            默认初始值
            int             0
            float            0.0f
            double            0.0
            boolean            false
            char            ‘‘(空字符)
            String            null
        2、局部变量没有默认值,必须先初始化在使用。
方法:函数也被称为方法。

静态- static修饰符
static 修饰成员变量(静态成员变量)
    使用场景:如果有数据需要被共享给所有对象使用时,那么就可以使用static修饰。例如统计一个类被使用了几次。
    静态成员变量的访问方式:
        1、可以通过对象进行访问
            格式:对象.变量名
        2、可以使用类名进行访问
            格式:类名.变量名
    注意事项:
        1、非静态成员变量只能使用对象访问,不能使用类名访问。
        2、千万不要为了方便访问数据而使用static修饰成员变量。只有成员变量数据真正需要被共享的时候才使用static修饰。
static 修饰方法(静态成员方法)
    使用场景:如果一个函数没有直接访问到非静态的成员时,那么就可以使用static修饰了,一般用于工具类型的方法。----静态函数只要存在对象,也可以访问非静态数据,只要不能直接访问而已。
    静态成员函数的访问方式:
        1、可以通过对象进行访问
            格式:对象.静态函数名(形参列表);
        2、可以使用类名进行访问
            格式:类名.静态函数名(形参列表);
    注意事项:
        1、 静态函数是可以调用类名或者对象进行调用的,而非静态函数只能使用对象进行调用。
        2、静态的函数可以直接访问静态的成员,但是不能直接访问非静态的成员。    
            原因:静态函数是可以使用类名直接调用的,这时候可能还没有存在对象,
            而非静态的成员数据是随着对象的存在而存在的。
        3、非静态的函数是可以直接访问静态与非静态的成员。
            原因:非静态函数只能由对象调用,当对象存在的时候,静态数据老早就已经存在了,而非静态
            数据也随着对象的创建而存在了。
        4、静态函数不能出现this或者super关键字。
            原因:因为静态的函数是可以使用类名调用的,一旦使用类名调用这时候不存在对象,而this
            关键字是代表了一个函数的调用者对象,这时候产生了冲突。

静态的数据的生命周期:静态的成员变量数据是优先于对象存在的。
***推荐使用类名访问静态的成员

静态的成员变量与非静态的成员变量的区别
    1. 作用上的区别:
        1. 静态的成员变量的作用共享一个数据给所有的对象使用。
        2. 非静态的成员变量的作用是描述一类事物的公共属性。
    2. 数量与存储位置上的区别:
        1. 静态成员变量是存储方法区内存中,而且只会存在一份数据。
        2. 非静态的成员变量是存储在堆内存中,有n个对象就有n份数据。
    3. 生命周期的区别:
        1. 静态的成员变量数据是随着类的加载而存在,随着类文件的消失而消失。
        2.非静态的成员数据是随着对象的创建而存在,随着对象被垃圾回收器回收而消失。

 

代码示例如下:
//数组工具类
class ArrayTool{
    static int count = 0; //统计使用的次数
    {
        count++;
    }
    public static void showCount(){
        System.out.println("创建了"+count+"个对象");
    }

    //转化为字符串并以","分割
    public static String toString(int[] arr){
        String result  = "";
        for(int i = 0;  i < arr.length ; i++){
            if (i==0){
                result+="["+arr[i]+",";
            }else if(i==(arr.length-1)){
                result+= arr[i]+"]";
            }else{
                result+=arr[i]+",";
            }
        }
        return result;
    }

    //从小到大排序
    public static void sort(int[] arr){
        for(int i = 0; i < arr.length-1 ; i++){
            for(int j = i+1 ; j<arr.length ; j++){
                if(arr[i]>arr[j]){
                    int temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;
                }
            }
        }    
    }
}

class Demo{
    public static void main(String[] args){
        ArrayTool at1 = new ArrayTool();
        ArrayTool at2 = new ArrayTool();
        ArrayTool at3 = new ArrayTool();
        ArrayTool at4 = new ArrayTool();
        ArrayTool.showCount();

        int[] arr = {12,1,456,165};
        ArrayTool.sort(arr);
        String info = ArrayTool.toString(arr);
        System.out.println("数组的元素:"+ info);
    }
}

以上是关于变量方法以及静态和非静态的主要内容,如果未能解决你的问题,请参考以下文章

关于静态变量和非静态变量的区别

静态方法和非静态变量

静态成员和非静态成员的区别?

Java中的覆盖和隐藏以及final关键字

关于静态方法和非静态方法

Day013 Static关键字详解