1、先谈谈作用域的概念,C或者C++老手可能觉得没必要,但是请不要这样,因为在Java中,作用域和C++中有点不一样,C和C++能将一个变量“隐藏”在一个更大的作用域里;
C++的程序
{
int x = 10;
{
int x = 20;
cout<<x<<endl;
}
cout<<x<<endl;
}
程序的输出结果是20和10;
Java程序:
{
int x = 10;
{
int x = 20; /* 此行出错*/
}
}
Java的设计者认为这样做使程序产生了混淆
1.Java中类的定义:
class [类名]
{
/*类的主体*/
}
2.类中的字段(数据成员)
class DataOnly { int i; float f; boolean b; }
(1).每个对象都为自己的数据成员保有存储空间;数据成员不会在对象之间共享;
(2).主成员的默认值
若某个主数据类型属于一个类成员,那么即使不明确(显式)进行初始化,也可以保证它们获得一个默认值,
这点与C++的处理不同,C++会给这个成员一个随机值;
若某个主数据类型不属于一个类成员,在函数的局部定义的,则处理是与C++一样的,有随机值,但是如果程序员自己不处理的话,
编译的时候会出错,C++只是出现没有初始化变量的警告;
(3).静态成员:
static数据成员,并对其初始化:
class StaticTest {
Static int i = 47;
}
现在,尽管我们制作了两个StaticTest对象,但它们仍然只占据StaticTest.i的一个存储空间。这两个对象都共享同样的i。请考察下述代码:
StaticTest st1 = new StaticTest();
StaticTest st2 = new StaticTest();
此时,无论st1.i还是st2.i都有同样的值47,因为它们引用的是同样的内存区域。
有两个办法可引用一个static变量。正如上面展示的那样,可通过一个对象命名它,如st2.i。亦可直接用它的类名引用,而这在非静态成员里是行不通的(最好用这个办法引用static变量,因为它强调了那个变量的“静态”本质)。
StaticTest.i++;
其中,++运算符会使变量增值。此时,无论st1.i还是st2.i的值都是48
3.类中的方法:
方法的定义:
返回类型 方法名( /* 自变量列表*/ ) {/* 方法主体 */}
(1).Java的方法只能作为类的一部分创建
(2).静态方法:
class StaticFun {
static void incr() { StaticTest.i++; }
}
从中可看出,StaticFun的方法incr()使静态数据i增值。通过对象,可用典型的方法调用incr():
StaticFun sf = new StaticFun();
sf.incr();
或者,由于incr()是一种静态方法,所以可通过它的类直接调用:
StaticFun.incr();
(3).方法的调用:
假设我们有一个方法名叫f(),它没有自变量,返回的是类型为int的一个值。那么,假设有一个名为a的对象,可为其调用方法f(),则代码如下:
int x = a.f();
返回值的类型必须兼容x的类型。
象这样调用一个方法的行动通常叫作“向对象发送一条消息”。在上面的例子中,消息是f(),而对象是a。面向对象的程序设计通常简单地归纳为“向对象发送消息”