java对象拷贝_JAVA 对象拷贝

JAVA 对象拷贝

为什么需要有对象拷贝?

对象拷贝相对的自然是引用拷贝。java初学者经常会问,我这个方法要改变一个对象的属性,可以把参数传进去了,为什么没有改变了?

——基本数据类型传值,而对象传引用或引用的拷贝。

而有时候我们要获取到一个当前状态的对象复制品,他们是两个独立对象。不再是引用或者引用拷贝(实质都是指向对象本身)。就是说a是b的拷贝,b发生变化的时候,不要影响a。

对象拷贝有浅拷贝和深度拷贝两种。

1)浅拷贝

浅拷贝是指对象中基本数据类型得到拷贝,而引用数据类型并未拷贝。

提到拷贝自然和clone联系起来了,所有具有clone功能的类都有一个特性,那就是它直接或间接地实现了Cloneable接口。

否则,我们在尝试调用clone()方法时,将会触发CloneNotSupportedException异常。

eg:

1

4f1150b881333f12a311ae9ef34da474.png public   class  DOG  implements  Cloneable

2

1fa987a29c6482f53d401256f96355eb.png {

3

d18c02628675d0a2c816449d98bda930.png     public  DOG(String name,  int  age)

4

97e794c86028c5f5b5461ae5ef440a4c.png      {

5

d18c02628675d0a2c816449d98bda930.png         this .name  =  name;

6

d18c02628675d0a2c816449d98bda930.png         this .age  =  age;

7

ecedf933ec37d714bd4c2545da43add2.png    } 

8

d18c02628675d0a2c816449d98bda930.png 

9

d18c02628675d0a2c816449d98bda930.png     public  String getName()

10

97e794c86028c5f5b5461ae5ef440a4c.png      {

11

d18c02628675d0a2c816449d98bda930.png         return   this .name;

12

ecedf933ec37d714bd4c2545da43add2.png    } 

13

d18c02628675d0a2c816449d98bda930.png 

14

d18c02628675d0a2c816449d98bda930.png     public   int  getAge()

15

97e794c86028c5f5b5461ae5ef440a4c.png      {

16

d18c02628675d0a2c816449d98bda930.png         return   this .age;

17

ecedf933ec37d714bd4c2545da43add2.png    } 

18

d18c02628675d0a2c816449d98bda930.png 

19

d18c02628675d0a2c816449d98bda930.png     public  Object clone()

20

97e794c86028c5f5b5461ae5ef440a4c.png      {

21

d18c02628675d0a2c816449d98bda930.png         try 

22

97e794c86028c5f5b5461ae5ef440a4c.png          {

23

d18c02628675d0a2c816449d98bda930.png             return   super .clone();

24

d18c02628675d0a2c816449d98bda930.png 

25

ecedf933ec37d714bd4c2545da43add2.png        }   catch  (CloneNotSupportedException e)

26

97e794c86028c5f5b5461ae5ef440a4c.png          {

27

d18c02628675d0a2c816449d98bda930.png             return   null ;

28

ecedf933ec37d714bd4c2545da43add2.png        } 

29

ecedf933ec37d714bd4c2545da43add2.png    } 

30

d18c02628675d0a2c816449d98bda930.png 

31

d18c02628675d0a2c816449d98bda930.png     public  String name;

32

d18c02628675d0a2c816449d98bda930.png 

33

d18c02628675d0a2c816449d98bda930.png     private   int  age;

34

d18c02628675d0a2c816449d98bda930.png 

35

d18c02628675d0a2c816449d98bda930.png     // test 

36

d18c02628675d0a2c816449d98bda930.png      public   static   void  main(String[] args)

37

97e794c86028c5f5b5461ae5ef440a4c.png      {

38

d18c02628675d0a2c816449d98bda930.png        DOG dog1  =   new  DOG( " xiaogou " ,  2 );

39

d18c02628675d0a2c816449d98bda930.png        DOG dog2  =  (DOG) dog1.clone();

40

d18c02628675d0a2c816449d98bda930.png        dog1.name  =   " dagou " ;

41

d18c02628675d0a2c816449d98bda930.png        System.out.println(dog2.getName());

42

d18c02628675d0a2c816449d98bda930.png        System.out.println(dog2.getAge());

43

d18c02628675d0a2c816449d98bda930.png        System.out.println(dog1.getName());

44

d18c02628675d0a2c816449d98bda930.png        System.out.println(dog1.getAge());

45

d18c02628675d0a2c816449d98bda930.png 

46

ecedf933ec37d714bd4c2545da43add2.png    } 

47

d18c02628675d0a2c816449d98bda930.png 

48

8f1ba5b45633e9678d1db480c16cae3f.png

49

4f1150b881333f12a311ae9ef34da474.png

运行结果:

xiaogou

2

dagou

2

2)深度拷贝

相对浅拷贝。实现对象中基本数据类型和引用数据类型的拷贝。

请先看下面代码:

1

4f1150b881333f12a311ae9ef34da474.png class  AAA

2

1fa987a29c6482f53d401256f96355eb.png {

3

d18c02628675d0a2c816449d98bda930.png     public  AAA(String name)

4

97e794c86028c5f5b5461ae5ef440a4c.png      {

5

d18c02628675d0a2c816449d98bda930.png         this .name  =  name;

6

ecedf933ec37d714bd4c2545da43add2.png    } 

7

d18c02628675d0a2c816449d98bda930.png 

8

d18c02628675d0a2c816449d98bda930.png     public  String name;

9

8f1ba5b45633e9678d1db480c16cae3f.png

10

4f1150b881333f12a311ae9ef34da474.png 

11

4f1150b881333f12a311ae9ef34da474.png class  DOG  implements  Cloneable

12

1fa987a29c6482f53d401256f96355eb.png {

13

d18c02628675d0a2c816449d98bda930.png     public  DOG(String name,  int  age, AAA birthday)

14

97e794c86028c5f5b5461ae5ef440a4c.png      {

15

d18c02628675d0a2c816449d98bda930.png         this .name  =  name;

16

d18c02628675d0a2c816449d98bda930.png         this .age  =  age;

17

d18c02628675d0a2c816449d98bda930.png         this .birthday  =  birthday;

18

ecedf933ec37d714bd4c2545da43add2.png    } 

19

d18c02628675d0a2c816449d98bda930.png 

20

d18c02628675d0a2c816449d98bda930.png     public  String getName()

21

97e794c86028c5f5b5461ae5ef440a4c.png      {

22

d18c02628675d0a2c816449d98bda930.png         return  name;

23

ecedf933ec37d714bd4c2545da43add2.png    } 

24

d18c02628675d0a2c816449d98bda930.png 

25

d18c02628675d0a2c816449d98bda930.png     public   int  getAge()

26

97e794c86028c5f5b5461ae5ef440a4c.png      {

27

d18c02628675d0a2c816449d98bda930.png         return  age;

28

ecedf933ec37d714bd4c2545da43add2.png    } 

29

d18c02628675d0a2c816449d98bda930.png 

30

d18c02628675d0a2c816449d98bda930.png     public  AAA getBirthday()

31

97e794c86028c5f5b5461ae5ef440a4c.png      {

32

d18c02628675d0a2c816449d98bda930.png         return  birthday;

33

ecedf933ec37d714bd4c2545da43add2.png    } 

34

d18c02628675d0a2c816449d98bda930.png 

35

d18c02628675d0a2c816449d98bda930.png     public  String getBirth(AAA a)

36

97e794c86028c5f5b5461ae5ef440a4c.png      {

37

d18c02628675d0a2c816449d98bda930.png         return  a.name;

38

ecedf933ec37d714bd4c2545da43add2.png    } 

39

d18c02628675d0a2c816449d98bda930.png 

40

d18c02628675d0a2c816449d98bda930.png     public  String name;

41

d18c02628675d0a2c816449d98bda930.png 

42

d18c02628675d0a2c816449d98bda930.png     private   int  age;

43

d18c02628675d0a2c816449d98bda930.png 

44

d18c02628675d0a2c816449d98bda930.png     public  AAA birthday;

45

d18c02628675d0a2c816449d98bda930.png 

46

d18c02628675d0a2c816449d98bda930.png     public  Object clone()

47

97e794c86028c5f5b5461ae5ef440a4c.png      {

48

d18c02628675d0a2c816449d98bda930.png         try 

49

97e794c86028c5f5b5461ae5ef440a4c.png          {

50

d18c02628675d0a2c816449d98bda930.png             super .clone();

51

d18c02628675d0a2c816449d98bda930.png             return   super .clone();

52

ecedf933ec37d714bd4c2545da43add2.png        }   catch  (Exception e)

53

97e794c86028c5f5b5461ae5ef440a4c.png          {

54

d18c02628675d0a2c816449d98bda930.png             return   null ;

55

ecedf933ec37d714bd4c2545da43add2.png        } 

56

ecedf933ec37d714bd4c2545da43add2.png    } 

57

8f1ba5b45633e9678d1db480c16cae3f.png

58

4f1150b881333f12a311ae9ef34da474.png 

59

4f1150b881333f12a311ae9ef34da474.png public   class  TestClone

60

1fa987a29c6482f53d401256f96355eb.png {

61

d18c02628675d0a2c816449d98bda930.png     public   static   void  main(String[] args)

62

97e794c86028c5f5b5461ae5ef440a4c.png      {

63

d18c02628675d0a2c816449d98bda930.png        AAA Day  =   new  AAA( " test " );

64

d18c02628675d0a2c816449d98bda930.png        DOG dog1  =   new  DOG( " xiaogou " ,  2 , Day);

65

d18c02628675d0a2c816449d98bda930.png        DOG dog2  =  (DOG) dog1.clone();

66

d18c02628675d0a2c816449d98bda930.png         //   dog2.birthday = (AAA) dog1.birthday.clone();  

67

d18c02628675d0a2c816449d98bda930.png         dog1.birthday.name  =   " 333 " ;

68

d18c02628675d0a2c816449d98bda930.png        System.out.println(dog1.getBirth(dog1.birthday));

69

d18c02628675d0a2c816449d98bda930.png        System.out.println(dog2.getBirth(dog2.birthday));

70

ecedf933ec37d714bd4c2545da43add2.png    } 

71

8f1ba5b45633e9678d1db480c16cae3f.png

72

4f1150b881333f12a311ae9ef34da474.png

运行结果是:

333

333

而真正要实现拷贝还的加点代码,如下请对比上面和下面代码的异同之处:

1

4f1150b881333f12a311ae9ef34da474.png class  AAA  implements  Cloneable

2

1fa987a29c6482f53d401256f96355eb.png {

3

d18c02628675d0a2c816449d98bda930.png     public  AAA(String name)

4

97e794c86028c5f5b5461ae5ef440a4c.png      {

5

d18c02628675d0a2c816449d98bda930.png         this .name  =  name;

6

ecedf933ec37d714bd4c2545da43add2.png    } 

7

d18c02628675d0a2c816449d98bda930.png 

8

d18c02628675d0a2c816449d98bda930.png     public  Object clone()

9

97e794c86028c5f5b5461ae5ef440a4c.png      {

10

d18c02628675d0a2c816449d98bda930.png         try 

11

97e794c86028c5f5b5461ae5ef440a4c.png          {

12

d18c02628675d0a2c816449d98bda930.png             super .clone();

13

d18c02628675d0a2c816449d98bda930.png             return   super .clone();

14

ecedf933ec37d714bd4c2545da43add2.png        }   catch  (Exception e)

15

97e794c86028c5f5b5461ae5ef440a4c.png          {

16

d18c02628675d0a2c816449d98bda930.png             return   null ;

17

ecedf933ec37d714bd4c2545da43add2.png        } 

18

ecedf933ec37d714bd4c2545da43add2.png    } 

19

d18c02628675d0a2c816449d98bda930.png 

20

d18c02628675d0a2c816449d98bda930.png     public  String name;

21

8f1ba5b45633e9678d1db480c16cae3f.png

22

4f1150b881333f12a311ae9ef34da474.png 

23

4f1150b881333f12a311ae9ef34da474.png class  DOG  implements  Cloneable

24

1fa987a29c6482f53d401256f96355eb.png {

25

d18c02628675d0a2c816449d98bda930.png     public  DOG(String name,  int  age, AAA birthday)

26

97e794c86028c5f5b5461ae5ef440a4c.png      {

27

d18c02628675d0a2c816449d98bda930.png         this .name  =  name;

28

d18c02628675d0a2c816449d98bda930.png         this .age  =  age;

29

d18c02628675d0a2c816449d98bda930.png         this .birthday  =  birthday;

30

ecedf933ec37d714bd4c2545da43add2.png    } 

31

d18c02628675d0a2c816449d98bda930.png 

32

d18c02628675d0a2c816449d98bda930.png     public  String getName()

33

97e794c86028c5f5b5461ae5ef440a4c.png      {

34

d18c02628675d0a2c816449d98bda930.png         return  name;

35

ecedf933ec37d714bd4c2545da43add2.png    } 

36

d18c02628675d0a2c816449d98bda930.png 

37

d18c02628675d0a2c816449d98bda930.png     public   int  getAge()

38

97e794c86028c5f5b5461ae5ef440a4c.png      {

39

d18c02628675d0a2c816449d98bda930.png         return  age;

40

ecedf933ec37d714bd4c2545da43add2.png    } 

41

d18c02628675d0a2c816449d98bda930.png 

42

d18c02628675d0a2c816449d98bda930.png     public  AAA getBirthday()

43

97e794c86028c5f5b5461ae5ef440a4c.png      {

44

d18c02628675d0a2c816449d98bda930.png         return  birthday;

45

ecedf933ec37d714bd4c2545da43add2.png    } 

46

d18c02628675d0a2c816449d98bda930.png 

47

d18c02628675d0a2c816449d98bda930.png     public  String getBirth(AAA a)

48

97e794c86028c5f5b5461ae5ef440a4c.png      {

49

d18c02628675d0a2c816449d98bda930.png         return  a.name;

50

ecedf933ec37d714bd4c2545da43add2.png    } 

51

d18c02628675d0a2c816449d98bda930.png 

52

d18c02628675d0a2c816449d98bda930.png     public  String name;

53

d18c02628675d0a2c816449d98bda930.png 

54

d18c02628675d0a2c816449d98bda930.png     private   int  age;

55

d18c02628675d0a2c816449d98bda930.png 

56

d18c02628675d0a2c816449d98bda930.png     public  AAA birthday;

57

d18c02628675d0a2c816449d98bda930.png 

58

d18c02628675d0a2c816449d98bda930.png     public  Object clone()

59

97e794c86028c5f5b5461ae5ef440a4c.png      {

60

d18c02628675d0a2c816449d98bda930.png         try 

61

97e794c86028c5f5b5461ae5ef440a4c.png          {

62

d18c02628675d0a2c816449d98bda930.png             super .clone();

63

d18c02628675d0a2c816449d98bda930.png             return   super .clone();

64

ecedf933ec37d714bd4c2545da43add2.png        }   catch  (Exception e)

65

97e794c86028c5f5b5461ae5ef440a4c.png          {

66

d18c02628675d0a2c816449d98bda930.png             return   null ;

67

ecedf933ec37d714bd4c2545da43add2.png        } 

68

ecedf933ec37d714bd4c2545da43add2.png    } 

69

8f1ba5b45633e9678d1db480c16cae3f.png

70

4f1150b881333f12a311ae9ef34da474.png 

71

4f1150b881333f12a311ae9ef34da474.png public   class  TestClone

72

1fa987a29c6482f53d401256f96355eb.png {

73

d18c02628675d0a2c816449d98bda930.png     public   static   void  main(String[] args)

74

97e794c86028c5f5b5461ae5ef440a4c.png      {

75

d18c02628675d0a2c816449d98bda930.png        AAA Day  =   new  AAA( " test " );

76

d18c02628675d0a2c816449d98bda930.png        DOG dog1  =   new  DOG( " xiaogou " ,  2 , Day);

77

d18c02628675d0a2c816449d98bda930.png        DOG dog2  =  (DOG) dog1.clone();

78

d18c02628675d0a2c816449d98bda930.png        dog2.birthday  =  (AAA) dog1.birthday.clone(); // 特别注意这里 

79

d18c02628675d0a2c816449d98bda930.png         dog1.birthday.name  =   " 333 " ;

80

d18c02628675d0a2c816449d98bda930.png        System.out.println(dog1.getBirth(dog1.birthday));

81

d18c02628675d0a2c816449d98bda930.png        System.out.println(dog2.getBirth(dog2.birthday));

82

ecedf933ec37d714bd4c2545da43add2.png    } 

83

8f1ba5b45633e9678d1db480c16cae3f.png

84

4f1150b881333f12a311ae9ef34da474.png

运行结果:

333

test

这样基本就达到了我们当初的母的。

但是明显的这种方法还是有许多不足,人们总是希望一个clone就是对象直接克隆。而上面还要对对象中的对象递归使用clone。下面提供一种更高级点的做法:

1

4f1150b881333f12a311ae9ef34da474.png import  java.io. * ;

2

4f1150b881333f12a311ae9ef34da474.png 

3

4f1150b881333f12a311ae9ef34da474.png class  AAA  implements  Serializable

4

1fa987a29c6482f53d401256f96355eb.png {

5

d18c02628675d0a2c816449d98bda930.png     public  AAA(String name)

6

97e794c86028c5f5b5461ae5ef440a4c.png      {

7

d18c02628675d0a2c816449d98bda930.png         this .name  =  name;

8

ecedf933ec37d714bd4c2545da43add2.png    } 

9

d18c02628675d0a2c816449d98bda930.png 

10

d18c02628675d0a2c816449d98bda930.png     public  String name;

11

8f1ba5b45633e9678d1db480c16cae3f.png

12

4f1150b881333f12a311ae9ef34da474.png 

13

4f1150b881333f12a311ae9ef34da474.png class  DOG  extends  SerialCloneable

14

1fa987a29c6482f53d401256f96355eb.png {

15

d18c02628675d0a2c816449d98bda930.png     public  DOG(String name,  int  age, AAA birthday)

16

97e794c86028c5f5b5461ae5ef440a4c.png      {

17

d18c02628675d0a2c816449d98bda930.png         this .name  =  name;

18

d18c02628675d0a2c816449d98bda930.png         this .age  =  age;

19

d18c02628675d0a2c816449d98bda930.png         this .birthday  =  birthday;

20

ecedf933ec37d714bd4c2545da43add2.png    } 

21

d18c02628675d0a2c816449d98bda930.png 

22

d18c02628675d0a2c816449d98bda930.png     public  String getName()

23

97e794c86028c5f5b5461ae5ef440a4c.png      {

24

d18c02628675d0a2c816449d98bda930.png         return  name;

25

ecedf933ec37d714bd4c2545da43add2.png    } 

26

d18c02628675d0a2c816449d98bda930.png 

27

d18c02628675d0a2c816449d98bda930.png     public   int  getAge()

28

97e794c86028c5f5b5461ae5ef440a4c.png      {

29

d18c02628675d0a2c816449d98bda930.png         return  age;

30

ecedf933ec37d714bd4c2545da43add2.png    } 

31

d18c02628675d0a2c816449d98bda930.png 

32

d18c02628675d0a2c816449d98bda930.png     public  AAA getBirthday()

33

97e794c86028c5f5b5461ae5ef440a4c.png      {

34

d18c02628675d0a2c816449d98bda930.png         return  birthday;

35

ecedf933ec37d714bd4c2545da43add2.png    } 

36

d18c02628675d0a2c816449d98bda930.png 

37

d18c02628675d0a2c816449d98bda930.png     public  String getBirth(AAA a)

38

97e794c86028c5f5b5461ae5ef440a4c.png      {

39

d18c02628675d0a2c816449d98bda930.png         return  a.name;

40

ecedf933ec37d714bd4c2545da43add2.png    } 

41

d18c02628675d0a2c816449d98bda930.png 

42

d18c02628675d0a2c816449d98bda930.png     public  String name;

43

d18c02628675d0a2c816449d98bda930.png 

44

d18c02628675d0a2c816449d98bda930.png     private   int  age;

45

d18c02628675d0a2c816449d98bda930.png 

46

d18c02628675d0a2c816449d98bda930.png     public  AAA birthday;

47

d18c02628675d0a2c816449d98bda930.png 

48

d18c02628675d0a2c816449d98bda930.png     public  Object clone()

49

97e794c86028c5f5b5461ae5ef440a4c.png      {

50

d18c02628675d0a2c816449d98bda930.png         try 

51

97e794c86028c5f5b5461ae5ef440a4c.png          {

52

d18c02628675d0a2c816449d98bda930.png             super .clone();

53

d18c02628675d0a2c816449d98bda930.png             return   super .clone();

54

ecedf933ec37d714bd4c2545da43add2.png        }   catch  (Exception e)

55

97e794c86028c5f5b5461ae5ef440a4c.png          {

56

d18c02628675d0a2c816449d98bda930.png             return   null ;

57

ecedf933ec37d714bd4c2545da43add2.png        } 

58

ecedf933ec37d714bd4c2545da43add2.png    } 

59

8f1ba5b45633e9678d1db480c16cae3f.png

60

4f1150b881333f12a311ae9ef34da474.png 

61

4f1150b881333f12a311ae9ef34da474.png public   class  TestClone

62

1fa987a29c6482f53d401256f96355eb.png {

63

d18c02628675d0a2c816449d98bda930.png     public   static   void  main(String[] args)

64

97e794c86028c5f5b5461ae5ef440a4c.png      {

65

d18c02628675d0a2c816449d98bda930.png        AAA Day  =   new  AAA( " test " );

66

d18c02628675d0a2c816449d98bda930.png        DOG dog1  =   new  DOG( " xiaogou " ,  2 , Day);

67

d18c02628675d0a2c816449d98bda930.png        DOG dog2  =  (DOG) dog1.clone();

68

d18c02628675d0a2c816449d98bda930.png         // dog2.birthday = (AAA) dog1.birthday.clone(); 

69

d18c02628675d0a2c816449d98bda930.png         dog1.birthday.name  =   " 333 " ;

70

d18c02628675d0a2c816449d98bda930.png        System.out.println(dog1.getBirth(dog1.birthday));

71

d18c02628675d0a2c816449d98bda930.png        System.out.println(dog2.getBirth(dog2.birthday));

72

ecedf933ec37d714bd4c2545da43add2.png    } 

73

8f1ba5b45633e9678d1db480c16cae3f.png

74

4f1150b881333f12a311ae9ef34da474.png 

75

4f1150b881333f12a311ae9ef34da474.png class  SerialCloneable  implements  Cloneable, Serializable

76

1fa987a29c6482f53d401256f96355eb.png {

77

d18c02628675d0a2c816449d98bda930.png     public  Object clone()

78

97e794c86028c5f5b5461ae5ef440a4c.png      {

79

d18c02628675d0a2c816449d98bda930.png         try 

80

97e794c86028c5f5b5461ae5ef440a4c.png          {

81

d18c02628675d0a2c816449d98bda930.png            ByteArrayOutputStream bout  =   new  ByteArrayOutputStream();

82

d18c02628675d0a2c816449d98bda930.png            ObjectOutputStream out  =   new  ObjectOutputStream(bout);

83

d18c02628675d0a2c816449d98bda930.png            out.writeObject( this );

84

d18c02628675d0a2c816449d98bda930.png            out.close();

85

d18c02628675d0a2c816449d98bda930.png            ByteArrayInputStream bin  =   new  ByteArrayInputStream(bout

86

d18c02628675d0a2c816449d98bda930.png                    .toByteArray());

87

d18c02628675d0a2c816449d98bda930.png            ObjectInputStream in  =   new  ObjectInputStream(bin);

88

d18c02628675d0a2c816449d98bda930.png            Object ret  =  in.readObject();

89

d18c02628675d0a2c816449d98bda930.png            in.close();

90

d18c02628675d0a2c816449d98bda930.png             return  ret;

91

ecedf933ec37d714bd4c2545da43add2.png        }   catch  (Exception e)

92

97e794c86028c5f5b5461ae5ef440a4c.png          {

93

d18c02628675d0a2c816449d98bda930.png             return   null ;

94

ecedf933ec37d714bd4c2545da43add2.png        } 

95

ecedf933ec37d714bd4c2545da43add2.png    } 

96

8f1ba5b45633e9678d1db480c16cae3f.png

97

4f1150b881333f12a311ae9ef34da474.png

输出:

333

test

上面的代码用序列化与反序列化实现了对象拷贝。比较通用。但是得注意的是其中的类得implements Serializable。

3)后记

我们如果利用强大的反射机制+序列化与反序列化,能做出更加灵活的对象拷贝。有兴趣的朋友可以自行去研究。

我在javaeye上看到一篇短文:http://www.javaeye.com/post/367014 主要讲的就是反射在对象拷贝中的应用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值