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(),提高复用性;

    • 当每个应用中都有共性的功能的时候,可以将这些功能抽取独立封装方便后续的复用;
  • 相关阅读:
    解决Maven项目pom.xml文件报xxx argetclassesMETA-INFMANIFEST.MF (系统找不到指定的路径。)问题
    MYSQL安装时解决要输入current root password的解决方法
    [多图]Windows 10 Build 10565今推送:优化界面菜单 Cortana改进
    Windows Server 2016 预览版下载
    编程书籍推荐——按角色划分
    编程书籍推荐——按内容划分
    无线路由器一、二、三根天线有什么区别?
    thinkphp5 下 的Nginx 伪静态
    linux 下执行python.py 无效解决方案
    Python Qt5 Creator 使用创建项目教程
  • 原文地址:https://www.cnblogs.com/surewing/p/11980605.html
Copyright © 2011-2022 走看看