1
第一章 Java的类北京大学计算机系代亚非
2
第一章 Java的类? 1.1 有关面向对象的概念
1.2 Java语言的特点
1.3 Java的开发环境
1.4 第一个 Java程序
1.5 Java类型系统
1.6 Java中字符串的类
1.7 Java中的类、方法和变量
1.8 Java名空间及访问规则
1.9 Java中的抽象类、接口和程序包
1.10 对象的构造函数
3
1.1 有关面向对象的概念
面向对象程序设计围绕的几个主要概念,
抽象数据类型、类、类型层次(子类),继承性、多态性。
4
1.1 有关面向对象的概念
class Car {
int color_number;
int door_number;
int speed;
void brake() { … }
void speedUp() {…};
void slowDown() { … }
}
计算机中的对象的原型现实生活中的对象
数据抽象类型
5
1.1 有关面向对象的概念
什么是类?
类是描述对象的“基本原型”,它定义一种对象所能拥有的数据和能完成的操作,在面向对象的程序设计中,类是程序的基本单元。
variables
methods
程序中的对象是类的一个实例,
是一个软件单元,
它由一组结构化的数据和在其上的一组操作构成 。
6
1.1 有关面向对象的概念
变量:即指对象的所知道的状态
方法:指对象的功能单元。
什么是消息?
软件对象通过相互间传递消息来相互作用和通信
一个消息由三部分组成,
1,接受消息的对象
2,要完成方法的名字
3,方法需要的参数对象 B
对象 A
message
7
1.1 有关面向对象的概念
一个例子
在程序中操作对象是类的一个实例,即对象
创建一个对象 Hello obj=new Hello();
调用方法 obj.showString(“Hello World!”)
class Hello
{
}
private String s;
public void showString ()
{ System.out.println(s);}
public void changeString(String str)
{ s=str; return s;}
8
1.1 有关面向对象的概念
什么是封装?
封装把对象的所有组成部分组合在一起,封装定义程序如何引用对象的数据,封装实际私有数据方法上使用方法将类的数据隐藏起来,
控制用户对类的修改和访问数据的程度。方法数据对象 A 对象 B
公有数据
9
1.1 有关面向对象的概念
什么是子类?
子类是作为另一个类的扩充或修正所定义的一个类,
bicycle
(super class)
Mountain bikes Racing bikes Tandem bikes
sub class
10
1.1 有关面向对象的概念
什么是继承?
继承是子类利用父类中定义的方法和变量就像它们属于子类本身一样,
class Car
{ int color_number;
int door_number;
int speed;
push_break() { … }
add_oil() { … }
}
class Trash_Car
extends Car
{ double amount;
fill_trash() { … }
}
11
1.1 有关面向对象的概念
什么是方法的覆盖?
在子类中重新定义父类中已有的方法。
class Car
{ int color_number;
int door_number;
int speed;
push_break()
{ speed=0; }
add_oil() { … }
}
class Trash_Car
extends Car
{ double amount;
fill_trash() { … }
push_break()
{ speed=speed-10; }
}
12
1.1 有关面向对象的概念
什么是方法的重载 (多态性 )?
在同一个类中至少有两个方法用同一个名字,
但有不同的参数。

void show(int int_num)
void show(double double_num)
void show(nit nit_ um,float float_um)
123
1.23
123,1.23
13
1.2 Java语言的特点
Java是什么?
Java=
“C++”--“复杂性和奇异性” +“安全性和可移植性”
Java由那些特性?
(1) 面向对象
封装性、多态性、继承性、动态链接
(2) 操作平台无关性
严格的语言定义,“没有依据机器的不同而不同” 或“由编译器决定”等字眼,最后的目标码都是一致的,初值都是确定的
14
1.2 Java语言的特点
两种工作模式的比较源程序
Java编译器
SPARC
pentium
Powerpc
中间码
Powerpc
pentium
SPARC
二进制源程序
SPARC
Powerpc
pentium
Powerpc
pentium
SPARC
编译器 二进制Java解释器
15
1.2 Java语言的特点
,
编译,没有绝对地址 调入包含,继承所用道的所有类,内存分配确定,编程真正可执行的机器码
Java源程序
(.java文件 )
Java编译器
Java Bytecode
(.class文件 )
系统执行平台
Bytecode 解释器
Bytecode 载入器字节码校验器 不存在伪造的指针不违反访问权限不非法访问对象不导致操作栈溢出
16
1.2 Java语言的特点
Java虚拟机
Java
interpreter
Just-in-time
compiler
Runtime System
Operating System
Hardware
不同的操作系统有不同的虚拟机,
它类似一个小巧而高效的 CPU.
byte-code代码是与平台无关的是虚拟机的机器指令,
Java字节代码运行的两种方式,
interpreter(解释方式 )
Just-in-time(即时编译 ):有代码生成器将字节代码转换成本机的机器代码,然后可以以较高速度执行,
17
1.2 Java语言的特点
(3) 安全问题
Java是在网络环境下使用的语言
一个安全的网络至少要防止以下几种破坏的可能性,
毁灭系统资源
消耗系统资源
挖掘系统或个人机密
骚扰正常工作的进行
18
1.2 Java语言的特点
Java源程序
(.java文件 )
Java编译器
Java Bytecode
(.class文件 )
Bytecode 载入器
Bytecode 解释器系统执行平台语言定义
public
protected
private
final
取消指针自动回收垃圾
Bytecode检查限定对象的存取权限系统堆栈溢出参数类型一致程序执行系统
WWW浏览器限制 Java小应用程序的不正当使用
19
1.2 Java语言的特点
(4) 多线程
Java提供现成的类 Thread,只要继承这个类就可以编写多线程的程序。
(5) Java与 C及 C++的区别
不再有 #include 和 #define 等于处理功能
不再有 structure,union及 typedef
不再有函数、不再有指针、不再有多重继承
不再有 goto
不再有操作符重载 (Operatior Overloading)
取消自动类型转换,要求强制转换
20
1.3 Java的开发环境
Java开发环境 JDK
JDK中有 Java编译器和 bytecode解释器
Applwtviewer是小应用程序的 bytecode解释器
JDK的安装
直接执行 JDK.exe
21
1.3 Java的开发环境产生如下目录结构
java\bin的目录下包含义下主要文件,
javac,Java编译器,用来将 java程序编译成
Bytecode
java,Java编译器,执行已经转换成 Bytecode的
java应用程序,
jdb,Java调试器,用来调试 java程序
javap,反编译,将类文件还原回方法和变量,
javadoc:文档生成器,创建 HTML文件
appletviwer,Java解释器,用来解释已经转换成
Bytecode的 java小应用程序,
22
1.3 Java的开发环境
\java\lib子目录
库函数,其中 classese.zip不要解开,
在 autoexec.bat中加入以下两条命令
1,PATH c:\… \java\bin
2,SET CLASSPATH=,; c:\...\lib\classes.zip;
c:\myclasses;
23
1.3 Java的开发环境
C:\
java
bin
lib
classes.zip
javac
java
appletviewer
用户类文件所在目录
myclasses
当前目录
24
1.3 Java的开发环境
vj1.1++的使用
1.进入 vj,创建一个 project
2.加入 java文件
3,编辑 java文件
4,编译 java文件
5,Build一个 project文件
6,运行 java程序
--如果是小应用程序,则直接在 VJ环境下运行
--如果是应用程序,则在 dos下运行
25
1.4 你的第一个 Java程序
编辑存盘:主类名 (含有 main方法 )和文件 名要 一致性 HelloWorldApp.java
编译程序,javac HelloWorldApp.java
运行程序,java HelloWorldApp,myjava”
运行结果,Hi,myjava
class HelloWorldApp
{ public static void main(String args[])
{
System.out.println(“Hi,”+args[0]);}
}
Java应用和 Java小应用程序
26
1.4 你的第一个 Java程序
1,声明一个类,public class HelloWorldApp{},
类名的第一个字母要大写
2,一个类中可有很多方法,main方法是运行程序的第一个方法,方法名的第一个字母要小写,
3,System.out.println是向屏幕输出,相当于 C中的 printf();
public class HelloWorldApp
{ public static void main(String args[])
{ System.out.println(“Hi,”+args[0]); }}
27
1.4 你的第一个 Java程序
4,命令行参数的获取
c:>java HelloWorldApp myjava!
6,字符串的拼接
public class HelloWorldApp
{ public static void main(String args[])
{ System.out.println(“Hi,”+args[0]); }}
28
1.4 你的第一个 Java程序
Java小应用程序不能直接执行和使用,必须要在浏览器中执行
import java.applet.Applet;
import java.awt.*;
public class HelloApplet extends Applet
{ public void paint(Graphics g)
{ g.drawString(“Hello World”,0,50); }
}
编辑存盘,主类名 (extends Applet)和文件名一致编译代码,javac HelloApplet.java
编写 HTML文件,HelloApplet.html
29
1.4 你的第一个 Java程序
运行 applet程序,
1,appletviwer HelloApplet.html
2,在浏览器中运行
运行结果,Hello World!
<html><body>
<applet code=“HellApplet.class” width=200
height=100>
</applet></body></html>
30
1.4 你的第一个 Java程序
理解程序
1,import语句相当于 C语言中的 include每
2,每一个 applet都是 java.applet.Applet的子类用 extends继承
3,applet中没有 main方法
import java.applet.Applet; import java.awt.*;
public class HelloApplet extends Applet
{ public void paint(Graphics g)
{ g.drawString(“Hello World”,0,50); }
}
31
1.4 你的第一个 Java程序
4,当 applet被浏览器运行时,paint语句自动执行
5,在 applet中与屏幕输出有关的操作通过 Graphics对象来实现
6,一个 Java源文件内最多只能有一个 public 类,称为主类,且必须和文件名同名
import java.applet.Applet; import java.awt.*;
public class HelloApplet extends Applet
{ public void paint(Graphics g)
{ g.drawString(“Hello World”,0,50); }
}
32
1.5 Java类型系统
Java type system
primitive reference null
char numeric boolean class interface array
integral floating-point
byte short int long float double
33
1.5 Java类型系统
byte 8 位 2 的补码 (byte) 0
short 16位 2 的补码 (short) 0
int 32 位 2 的补码 0
long 64位 2 的补码 0L
float 32位 IEEE 754浮点数标准 0.0f
double 64位 IEEE 754浮点数标准 0.0d
char 16位 同一码字符集 ‘ \u0000’
(Unicode character)
34
1.5 Java类型系统
程序,保留字,标识符 (类名、域名、方法名、
符号常量、局部变量,标号,…),操作符、
界定符,字面常量。
声明一个变量
int data=10; Boolean isAlived;
Java中的操作符,与 C基本一致
Java中不再有指针了
35
1.5 Java类型系统
在 Java中”引用“是指向一个对象在内存中的位置,在本质上是一种带有很强的完整性和安全性的限制的指针,
当你声明某个类,接口或数组类型的一个变量时,那个变量的值总是某个对象的引用或者是
null引用,
指针就是简单的地址而已,引用除了表示地址而外,还象被引用的数据对象的缩影,还提供其他信息,
指针可以有 ++,--运算,引用不可以运算,
36
1.5 Java类型系统
s1
s2
10001
s2=s1;
a string
10001
class Mydate
{ int year;
int month;
int day;
}
Mydate today=new MyDate()
0
0
0
10008today
s1=“a string”;
例,String s1;String s2;
37
1.5 Java类型系统
能够动态取得的内存有两种,一种是对象实体,
一种数组,
Java用 new申请内存,不需要自己释放不用的内存,
在 Java中,定义数组时不必给出数组的大小,
因为 Java的数组是动态分配的。
数组变量实际上是一个引用变量,因此要实例化才能使用。
例,int Array[]; Array=new int[8];
38
1.5 Java类型系统? 例,String arrayOfString[]=new String[10];
每个数组元素包含一个对字符串对象的引用,
此时值分配了包含字符串引用的空间,并没有对字符串本身分配内存,此时不能访问。
arrayOfString
for(int i=0;i<arrayString.length;i++)
arrayOfString[i]=new String(“Hello”+i)
arrayOfString[0]
arrayOfString[1]
arrayOfString[8]
arrayOfString[9]
对数组的引用对字符串的引用
39
1.6 Java中的字符串
Java中的字符串类
String和 StringBuffer
String 类的定义和实例的生成
例,String str;
str=“this is a string”
或,String str1=new String(“hello”);
或,String str2=“aaaa”;
String类与其它类型的转换
例 1:将实型数转换成字符串
System.out.println(String.valueOf(Math.PI));
.
40
1.6 Java中的字符串
有两个字符串 str1,str2
str1=str2; 是指两个引用指向同一个地址
str1.equals(str2)
是指两个字符串内容相等
获取 String对象的信息
例如,String s=“this is a string”;
int len=s.length();
boolean result=s.equal(“this is a 特 test”);
char ch=s.charAt(6);
41
1.6 Java中的字符串
StringBuffer的字符串的内容是可以改变的
创建 StringBuffer对象
StringBuffer str=new Stringbuffer(“hello”);
获取 StringBuffer对象的信息
int len=str.length();
例,StringBuffer sb=new StringBuffer(“Drink Java!”);
sb.insert(6,”Hot,);
System.out.println(sb.toString());
Drink Hot Java! System.out.println
接受的是 String类
42
1.7 Java中的类、方法和变量
试用一个简单的类
class Car
{ int car_number;
void set_number(int car_num)
{ car_number=car_num;}
void show_number()
{ System.out.println (“My car No,is,”+car_number); }
}
class CarDemo
{ public static void main(String args[])
{ Car Democar=new Car();
DemoCar.set_number(3838);
DemoCar.show_number();
}}
My car number is 3838
43
1.7 Java中的类、方法和变量
类的继承关系
class Car
{
int car_number;
void set_number(int car_num)
{ car_number=car_num;}
void show_number()
{System.out.println (“My car No,is,”+car_number); }
}
class TrashCar extends Car
{ int capacity;
void set_capacity(int trash_car_capacity)
{ capacity=trash_car_capacity;}
void show_capacity();
{ System.out.println(“My capacity is:,+
capacity);}}
44
1.7 Java中的类、方法和变量
TrashCar中继承了 Car中的两个方法
class CarDemo
{ public static void main(String args[])
{ TrashCar DemoTrashCar=new TrashCar();
DemoTrashCar.set_number(4949);
DemoTrashCar.set_capacity(20);
DemoTrashCar.show_number();
DemoTrashCar.show_capacity();
}
}
Car是父类,TrashCar是子类
45
1.7 Java中的类、方法和变量
何时选择继承性?
一个很好的经验,,B是一个 A吗?”
如果是则让 B做 A的子类,
常犯的错误 A有一个 B吗? 例如让汽车轮子成为汽车的子类是错误的
46
1.7 Java中的类、方法和变量
类的严格定义及修饰字
[类的修饰字 ] class 类名称 [extends 父类名称 ]
{ …,}
public,abstract,final或者没有
[变量修饰字 ] 变量数据类型 变量名 1,变量名 2[=变量初值 ]…;
[方法修饰字 ] 方法的返回值类型 方法名称 (参数 1,参数 2,…
{
…// 方法的内容
}
方法和变量的定义及修饰字
public,protected,private
47
1.8 Java名空间及访问规则
每个类都创造了有自己的名字空间,指方法和变量可以知道彼此的存在,可以使用。
abstract类不能直接产生属于这个类的对象
final类不能被其他任何类所继承 (安全的考虑 )
public类不但可以被同一程序包中的其它类使用,别的程序包中的类也可以使用,
friendly(缺省 )类只能被本包中的其它类使用
48
1.8 Java名空间及访问规则
变量和方法的修饰字 public,protected,private
public,任何其它类、对象只要可以看到这个类的话,那么它就可以存取变量的数据,或使用方法。
class ABC
{ public int pub_i=5;
public void show)()
{ System.out.println
(“pub_i”+pub_i);
}
49
1.8 Java名空间及访问规则
class Demo
{ public static void main(String args[])
{ ABC abc=new ABC();
System.out.println(“abc.pub_i”+abc.pub_i);
abc.pub_i=10;
abc.show();
}
} abc.pub_i=5pub_i=10;
50
1.8 Java名空间及访问规则
protected变量和方法
如果一个类中变量或方法有修饰字 protected,
同一类,同一包可以使用。不同包的类要使用,必须是该类的子类可以存取变量或调用
public class ABC
{ protected int pro_i=5;
protected void show()
{ System.out.println
(“pro_i=” +pro_i;)
}
}
51
1.8 Java名空间及访问规则
不同中的类不能使用
class DEF
{ public static void main(String args[])
{ ABC abc=new ABC();
System.out.println
(“abc.pro_i=“+abc.pro_i);
abc.pub_i=10;
abc.show();
}
}
52
import mytest.pack.ABC;
class DEF extends ABC
{ public static void main(String agrs[])
{ DEF def=new DEF();
System.out.println(def.i);
def.i=10; def.show(); }
}
pro_i=5
pro_i=10
1.8 Java名空间及访问规则
不同包但是是子类
53
1.8 Java名空间及访问规则
private
不允许任何其他类存取和调用
friendly(前边没有修饰字的情况 )
在同一程序包中出现的类才可以直接使用它的数据和方法,
54
1.8 Java名空间及访问规则
当子类中的变量名与父类的相同,原来的变量被遮盖,
class A { int data_a=3;}
class B extends A { int data_a=5;}
class C extends B
{ void print_out()
{ System.out.println(“data_a=,+data_a);
System.out.println(“A.data_a=,+A.data_a);
System.out.println(“B.data_a=,+B.data_a);
}}
data_a=5
A.data_a=3
B.data_a=5
class demo
{ public static void main(String args[])
{ C c=new C(); c.println_out(); }}
55
1.8 Java名空间及访问规则
方法的覆盖 (overriding)和重载 (overloading)
子孙类中定义的方法和祖先类中某个方法同名,同参数行,则祖先类中的该方法被覆盖,
方法的重载是指一个对象的多态性,即多个方法用相同的名称,但参数行不同,

void show(int int_num)
void show(double double_num)
void show(nit nit_ um,float float_um)
123
1.23
123,1.23
56
1.8 Java名空间及访问规则
到此为止 -----final
final在方法之前,防止该方法被覆盖,
final在类之前,标是该类不能被继承
final在变量之前,定义一个常量,
属于类的变量和方法 ----static
static 在变量或方法之前,
表明它们是属于类的,
class ABCD
{ char data;
static int_share_data; }
class Demo
{ ABCD a,b,c,d}
object b
char data object cchar data
Object b
char data
static int
share_data
object b
char data
57
1.8 Java名空间及访问规则
静态变量在各实例间共享
如果是 public静态变量,则其它类可以不通过实例化访问它们
静态方法称为类的方法,因此不用实例化即可调用 (面向过程 )
一个对象的方法可以访问对象的数据成员,尽管不属于方法的局部变量
一个类的方法只能访问自己的局部变量
58
1.8 Java名空间及访问规则
例,不正确的引用
class StaticError
{ String mystring=“hello”;
public static void main(String args[])
{ System.out.println(mystring);}
}
错误信息,can’t make a static reference to
nonstatic variable.
为什么不正确? 只有对象的方法可以访问对象的变量,
59
1.8 Java名空间及访问规则
解决的办法,
1,将变量改称类变量
class StaticError
{ static String mystring=“hello”;
public static void main(String args[])
{ System.out.println(mystring);}
}
60
1.8 Java名空间及访问规则
2,先创建一个类的实例
class NoStaticError
{
public static void main(String args[])
{ String mystring=“hello”;
System.out.println(mystring);}
}
}
61
1.9 Java中的抽象类、接口和程序包
抽象类是指不能直接被实例化的类,因此一般作为其它类的超类,与 final类正好相反
抽象类中的抽象的方法 -在该类中定义但不在该类中提供实现,由继承类提供细节
public abstract class SomeAbstractClass
{ void method1()
{ System.out.println(“Hi,Java”);}
void method2();
}
定义抽象方法的类必须是抽象类,
62
1.9 Java中的抽象类、接口和程序包
//已有两个类 Circle和 Rectangle,完成相关参数的计算
class Circle
{ public int r;
Circle(int r) {this.r=r} //this指 "这个对象的 "
public int area() {return 3*r*r; } //取近似
}
class Rectange
{ public int width,height; //这里不需 "this"
Rectangle (int w,int h) {width=w,height=h;}
public int area()
{return width*height; }
}
63
1.9 Java中的抽象类、接口和程序包
假设有若干个 Circle,以及若干个 Rectangle,希望计算它们的总面积,直截了当的做法是将它们分别放到两个数组中,用两个循环,加上一个加法,这种做法是不漂亮的
如果还有其它形状,triangle,ellipses等,上述方法显得
“累赘”,我们希望有一种统一的表示,例如用一个数组 shape[],接受所有的形状,然后用
for (i=0;i<shape.length;i++) {
area_total+=shape[i].area();
64
1.9 Java中的抽象、接口和程序包abstract class Shape
{ abstract float area();}
class Circle extends Shape
{ public int r;
Circle(int r) {this.r=r;}
public float area() { return 3.14*r*r; }
}
class Square extends Shape
{public int width,height;
Rectangle (int w,int h){ width=w,height=h;}
public float area() {return width*height; }
}
65
1.9 Java中的抽象类、接口和程序包
利用接口可实现多重 继承 (可同时实现多个接口)
接口的作用和抽象类类似,指定原型,不直接定义方法的内容,
关键字 implement用 来实现方法,即在使用时要用给出方法的实际内容
接口中的方法和变量
是 public的
interface Stack
{ void push(object x);
object pop();}
class A extends Applet
implements Stack
{ void push(object x)
{
…;// 具体内容
}
object pop()
{
…;// 具体内容 }
}
66
1.9 Java中的抽象类、接口和程序包
程序包,相当于其它语言中的库函数
打包 package Graphics;
class Square {…;}
class Circle {…;}
class Triangle {…;}
使用程序包中的类要用 import命令,表示路径,*表示使用包中的所有类
import java.io.FileInputStream;
import java.io.*;
io
java
FileInputStream
67
1.10 对象的构造函数
使用 new来做内存配置class Demo1 //数组的配置{ public static void main(String args[])
{ int array[][];
array=new int[5][5];
array[1][4]=5;
}
} class myClass //对象实体的产生{ int data=5;}
class Demo2
{ public static void main(String args[])
{ myClass obj;//建立一个引用
obj=new myClass();
System.out.println(obj.data);
}}
68
1.10 对象的构造函数
Constructor和 finalizer
constructor(构造函数 ),在一个类中和类同名的方法叫构造函数,系统在产生对象时会自动执行,
class Point
{ int x,y;
Point()
{ x =0;y=0;}
Point(int new_x,int new_y)
{ x=new_x,y=new_y;}
}
class UsePoint
{ Point point_A=new Point();
Point point_B=new Point(5,7);
}
69
1.10 对象的构造函数
构造函数应包含哪些内容?
构造函数多半定义一些初值或内存配置工作
一个类可以有多个构造函数 (重载 ),根据参数的不同决定执行哪一个,
如果程序中没有定义构造函数,则创造实例时使用的是缺省函数,它是一个无内容的空函数,
70
1.10 对象的构造函数
this
this指自己这个对象
this的作用是要将自己这个对象当作参数,传送给别的对象中的方法,
class ThisClass
{ public static void main()
{ Bank bank=new Bank();
bank.someMethod(this);
}
}
class Circle
{ int r;
Circle(int r)
{this.r=r;}
public area()
{ return r*r*3;}
}
71
super指这个对象的父类
super用来引用父类中的方法及变量数据,
public class apple extends fruits
{ public apple(int price)
{ super(price); }
}
以上句子表示使用超类的构造函数生成实例
super必须是子类构造器的第一条语句
1.10 对象的构造函数
72
小结
一个 Java程序 (包括小应用程序 )由若干个类组成,它们分布在由 CLASSPATH指定的一个目录中
一个 Java程序中只能由一个主类,并且与文件同名,
CLASSPATH指定多个目录,它们和起来被看成是这个目录的根,根中的类构成缺省包
目录树中每个子目录中的类的集合对应 Java
一个包 (package),子目录的层次与包的记法的层次对应
73
小结
C:\
java
bin
lib
classes.zip
javac
java
appletviewer
javasource myclass
让 PATH包含 … \java\bin
SET CLASSPATH
=.; C:\...\myclasses
import java.io.*;
import java.awt.Graphics;
import mycalss.calculate.*;
public class test {}
myjava.java calculate
A B C
package myclass.calculate
class A{} class B{}
classC{}
74
小结
名空间及访问规则
--package,class/object,member,局部变量
--public,private,protected,default
成员的可视性描述
public protected 缺省 private
yes
yes yes yes yes
yes yes yes no
yes* no no
yes no no no
同一类中同一包中不同包的子类中非子类也不同包
75
小结
对象模型
---Java的类和对象 (一般,抽象,接口 )
--继承机制 (单继承,多实现 )
static,import,final的含义和作用
76
小结
避免在类中使用太多的基本类型
private String senderName;
private String senderStreet;
private String senderCity;
private String senderState;
private String senderZip;
private String receiverName;
private String receiverStreet;
private String receiverCity;
private String receiverState;
private String receiverZip;
address sender
address receiver