首页 > 编程语言 > 详细

java之static关键字

时间:2019-12-04 09:21:07      阅读:74      评论:0      收藏:0      [点我收藏+]

标签(空格分隔): 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,要么是数组;
``` python
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

java之static关键字

原文:https://www.cnblogs.com/surewing/p/11980605.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!