zoukankan      html  css  js  c++  java
  • java之static关键字

    标签(空格分隔): static


    • static 关键字:
      用于修饰成员(成员变量和成员函数)
    • 被修饰的成员具有以下的特点:
      1.随着类的加载而加载
      2.优先于对象存在
      3.被所有对象所共享
      4.可以直接被类名调用
    • 使用注意:
      静态方法只能访问静态成员
      静态方法中不可以写this,super关键字
      主函数是静态的
    class Person {
        String name;
        String country ="CN";
        public void sho(){
            System.out.println(name+"::"+country);
        }
    }
    
    class StaticDemo{
    
        public static void main(String[] args){
    
            Person p=new Person();
            p.name="zhangsan";
            p.sho();
    
        }
    }
    
    • 对于上述的案例解释说明一下:存在堆内存中
      例如:Person p=new Person()
      new Person()
      name=null
      country="cn"

    第二个对象:存在堆内存中

    new Person()
    name=null
    country="cn"

    • 问题对象越多,内存的存储的共同数据就会越多,如果我们这么这么也可以,对象越多,内存中的country越多,因为country每个人都一样,问题来了,我们能不能country拿出来,作为一个共同 的,谁用谁来调用即可了,没有必要每个人都要具备一个,比较浪费内存空间;
    static String country ="CN";
    
    • 静态static
      用法:是一个修饰符,用于修饰成员(成员变量和成员函数),不能修饰局部,被静态修饰后,不在堆内存中,这样static修饰内容被静态所共享,不是每个对象,在堆内存中产生一个,这样就节约了内存;
    class Person {
        String name;
        static String country ="CN";
        public void sho(){
            System.out.println(name+"::"+country);
        }
    }
    
    class StaticDemo{
    
        public static void main(String[] args){
    
    //        Person p=new Person();
    //        p.name="zhangsan";
    //        p.sho();
                System.out.println(Person.country);
    
        }
    }
    
    • 当成员被静态修饰后,就多了一种调用方式,除了可以被对象调用外,还可以直接被类名调用,写法格式类名.静态成员
    class Person {
        String name;
        static String country ="CN";
        public void sho(){
            System.out.println(name+"::"+country);
        }
    }
    
    class StaticDemo{
    
        public static void main(String[] args){
    
               Person p=new Person();
    //        p.name="zhangsan";
    //        p.sho();
                System.out.println(p.country);
    
        }
    }
    

    问题:那我们能补能所有的都是用静态呢?

    答案不能:姓名不可能定义为static

    static的利弊:

    • 利处:对于共享的数据进行单独空间的存储,节省空间,没有必要每个对象都存储一份,可以直接使用类名调用;
    • 弊端:声命周期过长,访问出现局限性(静态虽好,只能访问静态,访问不了非静态)
    • 主函数是静态的;

    为什么强调主函数是静态?

    • 主函数是特殊函数,可以被JVM调用,作为程序入口,主函数定义,
      public 代表着访问权限比较,被虚拟机访问;
      static:代表着主函数随着类的加载就已经存在了;
      void:对主函数没有具体的返回值,虚拟机也不知道具体的返回值,就是能调用能运行就可以,无返回值,也不知道返回什么;
      main:不是关键字,是一个特殊的词,可以被JVM识别,写错就挂,大写不行
      朱函数的参数:(String[]args):参数为一个字符串数据组;
      主函数是固定函数,被jvm识别;
    class MainDemo{
        public static void main(String args[]){
    
            System.out.println("hellowor");
        }
        public static void main(int x){
    
        }
    
    
    }
    

    执行结果:
    hellowor

    • 这里有符合主函数的格式要求,可以被JVM识别;

    问题虚拟机调用main的时候,传入了什么?

    int[] arr =null;后边要么就两个值要么是null,要么是数组;

    class MainDemo{
        public static void main(String args[]){
    
            System.out.println(args);
        }
        }
        ```
    执行结果发现,虚拟机真的传入了数组实体,
    ``` python
    class MainDemo{
        public static void main(String args[]){
    
            System.out.println(args.length);
        }
        }
        ```
    JVM是调用主函数时,传入的是new Strig[0],
    
    >* 执行如下的代码报错了,越界了
    ``` python
    class MainDemo{
        public static void main(String args[]){
    
            System.out.println(args[0]);
        }
        }
        ```
    >* 执行的时候传入字符串:
    java MainDemo haha hehe lele 
    执行结果为:haha
    
    ### 什么时候使用静态:
    >* 要从两个方面下手,因为静态修饰的内容有成员变量和函数,什么时候定义类变量,什么时候定义静态变量(类变量呢)
    1.答:
    当对象中出现共享数据时候,是共享数据的值,不是变量名称,例如:姓名和年龄是对象的属性,例如都是中国国籍,国籍就可以定义为静态,这是一个共享的数据,那么什么时候定义静态变量就出来了;
    
    ### 什么时候定义静态:
    档功能内部没有访问到非静态数据,或者成为对象的特有数据,那么该功能可以定义为静态
    
    
    ### 静态应用:
    ```python
    class Demo{
        public static void main(String args[]){
    
            int[] arr ={3,4,1,8};
            int max =getMax(arr);
            System.out.println("max="+max);
        }
        public static int  getMax(int[] arr){
            int max =0;
            for (int x=1;x<arr.length;x++){
    
                if(arr[x]>arr[max])
                    max=x;
            }
            return arr[max];
        }
    }
    

    如上述的代码如果在定义一个类也要用到求最大值,这样的话我们又要重写一下这个方法,我们可以把这个方法单独的拿出来,单独放在一个类文件雷冕例如:Tools类里面,newTool().getMax(),提高复用性;

    • 当每个应用中都有共性的功能的时候,可以将这些功能抽取独立封装方便后续的复用;
  • 相关阅读:
    查看mysql版本的四种方法及常用命令
    newInstance和new的区别(good)
    Citrix 服务器虚拟化之六 Xenserver虚拟机创建与快照
    Java实现 蓝桥杯 算法训练 排序
    Java实现 蓝桥杯 算法训练 排序
    Java实现 蓝桥杯 算法训练 排序
    Java实现 蓝桥杯 算法训练 2的次幂表示
    Java实现 蓝桥杯 算法训练 2的次幂表示
    Java实现 蓝桥杯 算法训练 前缀表达式
    Java实现 蓝桥杯 算法训练 前缀表达式
  • 原文地址:https://www.cnblogs.com/surewing/p/11980605.html
Copyright © 2011-2022 走看看