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

目录

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

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

某方法定义在主类中,由主方法直接调用,格式: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方法,大部分情况下有两种可能性:

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

作者:Winter_world

相关推荐

Django cookie 与 session

Django cookie 与 session

JavaScript实现简单的图片切换功能(实例代码)

JavaScript实现简单的图片切换功能(实例代码)

javascript中contains是否包含功能实现代码(扩展字符、数组、dom)

ASP.NET Core单文件和多文件上传并保存到服务端的方法