类是具有相同特性(数据元素)和行为(功能)的对象的抽象(集合),Java程序的所有数据类型都是用类来实现的。对象(具体)是类(抽象)的实例,Java程序中使用标识符(如Button button)表示对象,通过对象引用类中的变量和方法,进而实现不同的功能。类主要由成员变量、成员方法组成,通过对象引用。
1.创建类-关键字class
[类的修饰符] <class> <类名> <extends 父类名> [implements 接口名]
{
<类体(成员变量和成员方法)>
}
其中,[]表示为可选项,<>表示为必选项。
类的修饰符
-public(公共类):可以被任何包中的类访问,在同一个源程序中只能有一个public类;
-private(私有类):只能被该类的对象访问,其子类不能访问,更不能垮包访问;
-protect(保护类):能被该类对象与子类访问,即使子类在不同的包中也可以;
-default(默认类):与没有任何修饰符相同,类智能被同一个包中的其他类访问;
-abstract(抽象类):说明这个类是抽象的,不能用来创建实例对象,可以被用来继承,由继承它的子类来创建对象;
-final(最终类):最终类与abstract相反,它不能被继承,可以创建对象。最终类有利于提高系统的安全性,Java中的String类就是一个最终类。
说明:对于上述所说的对类的访问,即主要是通过对象来引用被继承的类。也就是说,要想访问一个类,首先我们要使自定义的类继承它(如果可以继承的话),如果是其他包中的类我们还需要需要通过包引入(import java.apple.Applet 引入applet包中的Applet类),然后实例化被继承类一个对象,通过这个对象引用被继承类中的方法和变量。
举例:
import java.awt.Button
public class Example extends Applet implements ActionListener
......成员函数
Button button=new Button();
button.xxxxx;
/*这里的button,为Example类的一个成员变量,它既可以引用Button类中的方法又可以使用Example类中的方法*/
总结:子类除了可以直接使用父类的数据和方法外,可以有自己的数据和方法。
2.创建对象
(1)构造方法
构造方法不是成员方法且无返回值,不能在程序中直接调用,只能由new操作符调用。其作用就是确定类成员变量的构成或者为成员变量赋初值,即对于成员变量的定义和赋值都在构造函数中实现。在类实现过程中,可以无构造方法,当我们在创建对象时,使用的就是该类默认的构造方法。在同一个类中,可以定义多个构造方法即函数名相同而参数不同。
public class Example extends Applet implements ActionListener
{
Example()//不带参数的构造函数
{
int x=0;
int y=0;
};
private int xPos,yPos,x,y;
Example(int x,int y)//带参数的构造函数
{
xPos=x;yPos=y;
}
}
两种形式构造方法:
第一种:不带参数的构造方法,它直接把Example类中的2个成员变量赋值为0(如果为boolean型为false,String型为null)。没有参数的构造方法是系统默认的构造方法,如果没有定义,系统将自动赋值。
第二种:带参数的构造方法,如Example(int x,int y)定义了2个整型参数,实例化对象时要传递2个整型参数据给Example类赋初值。
(2)创建对象
new成为操作符,它的任务是实例化对象同时调用类的构造方法完成新建实例对象的初始化任务。
创建一个对象有3个步骤:声明对象,实例化,初始化。
a.声明对象
<类名> <对象名> 举例:Button button;
b.实例化、初始化
<对象名>=new <构造方法名>([参数列表]),其中参数列表为可选项。
除此之外,可以一步到位:
<类名> <对象名>=new <构造方法名>([参数列表])
c.对象的使用
对象被实例化后,通过对象可以引用相应类的成员变量,可以调用类的方法进行操作实现特定的功能。创建对象时,对象的所有变量和方法代码都被读到专为它开辟的内存区域中。
<对象名>.<变量名>
<对象名>.<方法名> 其中“.”的作用是为了让解释器知道这些变量和方法代码的内存地址。
d.对象清除
Java引入了内存管理机制,由Java虚拟机担任垃圾收集器的工作。
总结:实例化对象作用:是为对象分配内存,由new操作符根据构造方法决定新建对象分配多大的内存来存储对象。new操作符需要一个参数,就是类的构造方法,构造方法是用于初始化对象的特别方法。new操作符为对象分配内存后将调用类的构造方法确定对象的初始状态(即为类的成员变量赋初值)。
3.成员变量
成员变量描述了类和对象的状态,成员变量可以是不同类型的变量或者对象,对成员变量的操作实际上就是改变类和对象的状态,使之满足程序的需要。成员变量也有很多修饰符,用来控制对成员变量的访问,实现对类和对象的封装。
(1)成员变量的声明
成员变量的声明必须放在类体中,一般是成员方法之前。这里需要注意区别成员变量和局部变量。所谓局部变量,即指在方法中声明的变量,不能称之为成员变量,因为它是方法的局部变量而已。
public class Time
{
private int x;//1.定义一个整型成员变量
Button button;//2.定义一个对象成员变量
Time() //构造函数
{
private float y;//3.构造方法中的局部变量,不是成员变量
}
}
注意:如果在类中定义一个对象成员变量,则这个成员变量不仅可以访问当前类的所有方法和变量,还可以访问所属类的方法或变量。
(2)成员变量的修饰
[public][private][protected][package] //访问修饰符
[static][final][transient][volatile] <数据类型> <成员变量名称>
-public:公共变量,可以被任何包中的任何类访问(即所有包和类),不具有数据保护功能
-private:私有变量,只能被声明它的类所使用,拒绝任何外部类的访问,包括子类,具有最好的保护功能
-protected:受保护变量,只能被声明它的类和派生的子类,以及同一个包中的类访问;
-package:包变量,在声明时常常省略package关键字,即没有修饰符的成员被视为包变量。包变量允许被声明它的类和同一个包中的类使用,不能被声明类的子类使用。
如:static int x;int y;都属于包变量。
-static:static声明的成员变量被视为类的成员变量,可以直接通过类名或实例对象使用。即静态变量是固有的,可以直接使用;非静态变量,仅仅在被声明和生成实例对象才存在,才可以被引用。
-final:成员变量被声明为final,即为常量.常量和直接量一样不占用内存空间
-transient:说明成员变量不允许被序列化
-volatile:声明成员变量为易失变量,用来防止编译器对该成员进行某种优化。
总结1:如果在类中定义一个对象成员变量,则这个成员变量不仅可以访问当前类的所有方法和变量,还可以访问所属类的方法或变量。
总结2:静态变量成为类变量,非静态变量成为实例变量;静态方法成为类方法,非静态方法成为实例方法。
总结3:(1)类的静态变量可以直接引用,类的静态变量相当于某些程序语言的全局变量;
(2)静态方法只能使用静态变量,不能使用实例变量;
(3)类的静态变量只有一个版本,所有实例对象引用的都是同一个版本。
(4)非静态变量:对象实例化后,每个实例变量都被制作为一个副本,实例变量之间互不影响。
4.成员方法
对象的行为由类的方法实现,其他对象可以调用一个对象的方法,通过消息的传递是实现对该对象行为的控制,类的设计集中体现在成员方法的设计上。
(1)成员方法声明
[public][private][protected][package] //访问修饰符
[static][final][abstract][native][synchronized][void]
返回值类型 方法名(参数表) [throws 异常类型]
注意:4种访问权限和成员变量的修饰符有相同的作用。静态方法体中智能访问静态变量,静态方法可以通过对象调用也可以通过类名来调用。
-final:最终方法。被声明为final的方法,不能被子类覆盖,即能被子类继承和使用,但不能在子类中修改或者重新定义它。
-abstract:抽象方法。抽象类不能被继承,但可以定义一个拥有共同的状态和行为的统一编程接口;抽象方法无具体内容,需在子类中覆盖以实现具体的细节。注意:一个抽象类不一定非要包含一个抽象方法,但是一个类中如果有一个抽象方法就必须声明为抽象类。一个子类如果没有实现分类中的抽象方法,也必须声明为抽象类。
-native:本地方法。SDK提供了Java本地接口JNI,使得Java虚拟机能运行嵌入在Java程序中的其他语言代码。
如
class HeelWorld{
public native void display();//为C语言编写程序实现这个方法
...
public static void main(String[] args)
{.....}
}
-void:Java要求一个方法必须声明他的返回值类型,void为空类型
public int getX(); //返回值为int类型
void setXY(); //无返回值
pulic Object clone(); //该方法返回值为Object类
(2)方法的参数传递
在参数表中要声明参数的类型,并用逗号分隔多个参数。一个对象和外部交换信息的主要靠方法的参数来传递,可传递的参数包括基本数据类型、数组和对象。通过传递对象调用其方法传递参数时需要现有包含调用方法的类,然后才能穿件类的对象,调用其方法传递参数。