美文网首页工作生活
浅谈Android中static修饰符,及Gson转String

浅谈Android中static修饰符,及Gson转String

作者: 空丶_0b92 | 来源:发表于2019-07-03 15:57 被阅读0次

肯定会很奇怪,为什么要把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修饰符的特点

  1. static修饰的成员(字段/方法),随着所在类的加载而加载。当JVM把字节码加载进JVM的时候,static修饰的成员已经在内存中存在了

  2. 优先于对象的存在,对象是我们手动通过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 = "女",但是让我们来看一下真实的效果

结果1.png 结果2.png

我们可以看到,这时候name和sex都有值,且都打印出来了。为什么jsonStr里却只有sex成为了jsonStirng呢,有的人说,是因为我前面赋值的时候,是直接调用赋值的,不是按照set赋值,那么我们把这个改一下,改成set赋值


修改1.png

然后,此时打印的:


结果3.png
对,没有看错,jsonString里还是没有name出现,这是为什么呢。
我们首先来看下Gson.toJson()的源码。
image.png

要求传递一个对象进来,并且,是利用反射的方法,拿到对象内的成员属性,那么我们在想一想,我们的bean类里,name属性,已经被static给修饰了,它已经属于这个类,在类没被加载的时候就已经存在。那么我们再去修改这个值,赋值,是给这个类,还是给对象里的属性呢,所以,我们去把bean类里的成员属性给修改了,不让用static给修饰,


img.png

毫无疑问,这样做之后,我们是给这个对象去赋值,那么这时候Gson去通过反射拿到这个类里的成员属性的时候,就自然而然的给序列化成了JsonString;


image.png

所以以后大家在用static的时候,一定要注意,不要什么地方为了方便就用static修饰一下,这样修饰完了,可能会出现大问题。

相关文章

网友评论

    本文标题:浅谈Android中static修饰符,及Gson转String

    本文链接:https://www.haomeiwen.com/subject/eqgqhctx.html