肯定会很奇怪,为什么要把Gson和Static放一起去讲,因为在开发中,json这个东西是很常用的,不管是格式,还是数据的传递,还是我们与后台之间的交互,都离不开JSON,而今天,是在帮一个同行用ts调用java的时候,写到了json,需要把json当做字符串传回去,那么第一个想到的方法,肯定是谷歌的Gson
Gson gson = new Gson()
//Data为自定义对象
String s = gson.toJson(Data);
Logger.e(s)
这样,我们需要的String字符串就得到了,下面我把Data给挂出来。
public class TestStringDatas {
public static String name;
public String sex;
public static String getName() {
return name;
}
public static void setName(String name) {
TestStringDatas.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
很常见的一个bean类,但是注意,我们的name属性,是被static修饰了。下面,就开始讲下Static。
一.概述
static关键字的中文意思是静态的,该修饰符可以修饰字段、方法、内部类。使用该关键字修饰的内容,在面向对象中static修饰的内容是隶属于类,而不是直接隶属于对象的
,所以static修饰的成员变量一般称作类成员变量,而static修饰的方法一般称作类方法。
二.static修饰符的特点
-
static修饰的成员(字段/方法),随着所在类的加载而加载。当JVM把字节码加载进JVM的时候,static修饰的成员已经在内存中存在了
-
优先于对象的存在,对象是我们手动通过new关键字创建出来的。
3.static修饰的成员被该类型的所有对象所共享。根据该类创建出来的任何对象,都可以访问static成员。 分析:表面上通过对象去访问static成员,其本质依然使用类名访问,和对象没有任何关系
(通过反编译可以看到)。
三.类成员和实例成员的访问
1.类成员:使用static修饰的成员,直接属于类,可以通过类来访问static字段和static方法
2.实例成员:没有使用static修饰的成员,只属于对象,通过对象来访问非static字段和非static方法(对象其实可以访问类成员,但是底层依然使用类名访问的)
3.static方法中:只能调用static成员
4.非static方法:可以访问静态成员,也可以访问实例成员
四.什么时候定义成static的字段和方法
如果这个一个状态或行为属于整个事物(类),就直接使用static修饰,被所有对象所共享。 在开发中,往往把工具方法使用static修饰。如果不使用static修饰,则这些方法属于该类的对象,我们得先创建对象再调用方法,在开发中工具对象只需要一份即可,可能创建N个对象,此时我们往往把该类设计为单例的,但还是有点麻烦。所以,一般在开发中设计工具方法,为了调用简单,我们使用static修饰。
解析:
大家在初学java的时候一定都接触过static,这时候就有人想,这么简单的东西,还需要说么,回到最开始的代码,Gson可以把一个对象,转换成一个json的字符串,那根据我贴的bean类,转换成字符串是不会有问题的对吧。
TestStringDatas testStringDatas = new TestStringDatas();
TestStringDatas.name = "测试测试";
testStringDatas.setSex("女");
Gson g = new Gson();
String s = g.toJson(testStringDatas);
Logger.e("name= " + testStringDatas.getName());
Logger.e("sex= " + testStringDatas.getSex());
Logger.e("jsonStr= " + s.toString());
按照大部分人的思路,这肯定是没有问题的代码,那么照常理,我们此时的name = "测试测试",sex = "女"
,但是让我们来看一下真实的效果
![](https://img.haomeiwen.com/i17074128/1b7cc05c47b95bc3.png)
![](https://img.haomeiwen.com/i17074128/0dd167a731ec5e9c.png)
我们可以看到,这时候name和sex都有值,且都打印出来了。为什么jsonStr里却只有sex成为了jsonStirng呢,有的人说,是因为我前面赋值的时候,是直接调用赋值的,不是按照set赋值,那么我们把这个改一下,改成set赋值
![](https://img.haomeiwen.com/i17074128/44b70160b121fd00.png)
然后,此时打印的:
![](https://img.haomeiwen.com/i17074128/40505d0138178f5b.png)
对,没有看错,jsonString里还是没有name出现,这是为什么呢。
我们首先来看下Gson.toJson()的源码。
![](https://img.haomeiwen.com/i17074128/65a7fef4725407d9.png)
要求传递一个对象进来,并且,是利用反射的方法,拿到对象内的成员属性,那么我们在想一想,我们的bean类里,name属性,已经被static给修饰了,它已经属于这个类,在类没被加载的时候就已经存在。那么我们再去修改这个值,赋值,是给这个类,还是给对象里的属性呢,所以,我们去把bean类里的成员属性给修改了,不让用static给修饰,
![](https://img.haomeiwen.com/i17074128/b906a75ec72215a8.png)
毫无疑问,这样做之后,我们是给这个对象去赋值,那么这时候Gson去通过反射拿到这个类里的成员属性的时候,就自然而然的给序列化成了JsonString;
![](https://img.haomeiwen.com/i17074128/24ca36e382995ee2.png)
所以以后大家在用static的时候,一定要注意,不要什么地方为了方便就用static修饰一下,这样修饰完了,可能会出现大问题。
网友评论