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

网友投稿 808 2022-05-30

目录

1、声明static属性

2、声明static方法

3、分析主方法

3、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、分析主方法

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

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

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

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

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

Java中的主方法是最长的:

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方法,大部分情况下有两种可能性:

希望不受类实例化的控制;

类中没有普通属性;

作于202004061520,已归档

———————————————————————————————————

本文为博主原创文章,转载请注明出处!

若本文对您有帮助,轻抬您发财的小手,关注/评论//,就是对我最大的支持!

祝君升职加薪,鹏程万里!

Java

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:程序员是如何看待薪资被高估的?内容过于真实......
下一篇:深源恒际医疗票据OCR落地九省市 服务范围覆盖过半市场
相关文章