Java——static关键字总结(含义、定义属性或方法、使用时机)

时间:2022-07-25
本文章向大家介绍Java——static关键字总结(含义、定义属性或方法、使用时机),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

1、声明static属性

static关键字,主要描述全局的概念,利用该属性可以定义属性和方法,但是90%情况下很少直接编写static。

现在假设定义一个只描述中国人的类,类中包含:姓名、年龄、国家,按之前的概念设计如下:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Person perA = new Person("张三",10);
        Person perB = new Person("李四",20);
        Person perC = new Person("王五",10);
        System.out.println(perA.getInfo());
        System.out.println(perB.getInfo());
        System.out.println(perC.getInfo());

    }

    class Person{
        private String name;
        private int age;
        String country = "中华人民共和国"; //该属性暂时不封装

        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }

        public String getInfo(){
            return "姓名:"+this.name+",年龄:"+this.age+",国家:"+this.country;
        }
    }

以上代码很简单,但是分析内存关系时就会发现问题:

以上红色标记的是重复的信息,在对象数量少的情况下没什么问题,但是在数据量大的情况下要修改属性信息,比如20亿,20亿对象要修改country属性,那是巨大的操作量~对整个代码 的维护很不友好。

造成以上问题的根源主要是:类中的普通属性是每一个对象独自拥有的,这样的设计不符号当前的环境,最好是将country设置为公共属性,所有对象都共享此属性,这时就可以通过static关键字实现。

【举例】:使用static关键字实现

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Person perA = new Person("张三",10);
        Person perB = new Person("李四",20);
        Person perC = new Person("王五",10);
        perA.country = "中国-唐朝";
        System.out.println(perA.getInfo());
        System.out.println(perB.getInfo());
        System.out.println(perC.getInfo());

    }

    class Person{
    private String name;
    private int age;
    static String country = "中国"; //该属性暂时不封装

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getInfo(){
        return "姓名:"+this.name+",年龄:"+this.age+",国家:"+this.country;
    }
    }

由以上结果可知,修改了一个对象的属性后,所有对象的属性都一起更改,这样的属性称为公共属性,该属性必须通过static关键字定义,对于公共属性的内容保存不会在堆栈中,而是保存在全局数据区中,所有的方法保存在全局代码区之中。内存分析如下:

但是有这样一个问题,既然static属于全局属性,那么由一个对象进行修改很明显不合适,最好的做法是利用所有对象的一个最高代表进行操作,即类。对于static定义的属性可以由类.属性直接调用。这是比较标准的操作:

Person.country = "中国-唐朝";

此时类中存在static和非static属性:

  • 所有的普通属性都是在对象实例化的时候进行内存分配;
  • 而static可以在没有实例化对象产生的情况下直接使用。
        System.out.println(Person.country);
        Person.country = "中国-北宋";
        System.out.println(Person.country);
        System.out.println(new Person("张三",20).getInfo());

由以上操作可知,虽然static属性定义在类中,但它是完全独立的,不受对象实例化的控制。

大多数情况下类的设计都会使用非static属性,只有表示公共 属性或与类实例化无关的情况下才会考虑使用static。

2、声明static方法

利用static定义的属性可以直接通过类名称进行访问,static也可以用于方法的定义上,这个方法也同样可以由类名称直接进行调用。

【举例】:定义static方法

class Person{
    private String name;
    private int age;
    private static String country = "中华人民共和国"; //该属性暂时不封装

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getInfo(){
        return "姓名:"+this.name+",年龄:"+this.age+",国家:"+this.country;
    }

    public static String getCountry() {
        return country;
    }

    public static void setCountry(String country) {
        Person.country = country;
    }
}

static的方法依然不受实例化的限制,所以可以直接由类名称直接调用。但是此类的方法就存在有两种了:static与非static,两者之间的访问就会出现问题,有如下语法规定:

  • 所有非static方法可以直接调用此类中的static方法或static属性。
  • static方法不能直接调用此类中的非static方法或非static属性。

【什么时候使用static方法】:

  • 类设计过程中,90%都使用非static方法;
  • 若类中没有任何属性,此类不需要定义普通方法,只需要定义static方法(比如开发中常用的自定义工具类,无需实例化对象,无需开辟无用的内存空间);

3、分析主方法

最早讲解方法定义的时候,实际上给出了两种方案:

  • 某方法定义在主类中,由主方法直接调用,格式:public static 返回值类型 方法名称(){};
  • 某方法定义在子类中,由实例化对象直接调用,格式:public 返回值类型 方法名称(){};

实际开发中,主类基本不会写太多方法,大部分方法都会封装在类中。

Java中的主方法是最长的:

  • public:一种访问权限,表示所有的操作者都可以看见;
  • static:执行类的时候输入:"java 类名称",表示由类直接调用;
  • void:主方法是程序的起点,无返回值;
  • main:系统定义好的方法名称;
  • String args[]:表示程序执行时的输入参数,初始化输入参数。

3、static应用案例

static在一些系统类库中大量出现,这些可能是因为定义static方法所导致。本次重点看static属性,该属性的一个最好的特点是公共属性,所有对象均可以对其进行修改。

【举例】:实现一个对象个数的统计

所有新的实例化对象产生时都会调用构造方法,可以在其中增加一个统计功能。

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        new Person();
        new Person();
    }

class Person{

    private static int count = 0;

    public Person() {
        System.out.println("对象个数:"+count++);
    }
}

【举例】:为属性自动命名

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        System.out.println(new Person().getName());
        System.out.println(new Person("张三").getName());
    }
class Person{

    private static int count = 0;
    private String name;

    public Person(){
        this("无名氏-"+count++);
    }

    public Person(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

4、总结

1)类的设计过程中,首先可以不去考虑static属性或方法;

2)使用static方法,大部分情况下有两种可能性:

  • 希望不受类实例化的控制;
  • 类中没有普通属性;