所谓对象,说得直接一点,可称之为"东西"。这是个很抽象的名词,我们若以它具体的特性来描述,会比较清楚:
1、Object有生命周期,会"产生"和"死亡";
2、Object具有其内部状态, 同一类的不同Object, 其的内部状态可能都不一样;
3、Object可以接收"信息",并依据信息的参数以及该对象的内部状态,做出反应,并可能因而改变该对象的内部状态。
属于同一个Class的Object,会具有该Class所定义的以上三种特质。
除此之外,Class之间可以定义继承(Inheritance)关系,子类(Sub Class)继承父类(Super Class)的所有特性,子类还可以定义其专属的特性。
以Object-Oriented(面向对象) Language写作程序时,写作的主体是Class。Class定义了所有属于该Class的Object的特性,这些特性可分类如下:
Object产生时一定要调用的方法, 称为Constructor(构造方法)
Objec消灭需要调用的方法, 称为Destructor(析构方法)
表达Object内部状态的变量, 称为Object Variable(对象变量成员)
Object可以接收的信息, 称为Object Method(对象方法成员)
上述两个可总称为Object Member
属于Class的变量, 称为Class Variable(类变量)
属于Class的方法, 成为Class Method(类方法)
上述两个可总称为Class Member
和其他Class间的继承关系
如何以Java撰写类
Java规定公共类(public class)必须写在该公共类名称的.java文件内, 例如public class Example就必须写在Example.java这个文件内。Example.java里面也可以定义其他的类,但是只有class Example能够声明为public,其他Example.java里的class都不能声明为public。当Java Virtual Machine启动时,它会去找命令列上所指定的class里的public static void main(String[] argv)方法,当做是程序的进入点。这有点像是C语言的main, 不同处在于每个java class都可以定义自己的public static void main(String[] argv)。
java Example(示例为知识拓展研究,有基础的同学仔细思考,java初学者大概了解即可)
启动上述的JVM时, JVM会去执行class Example里的public static void main(String[] argv)。以下范例Example.java说明如何定义Java的class。
class Vehicle {
private int speed; // Object Variable
private String direction; // Object Variable, direction is a reference to
String Object
private static int numVehicle = 0; // Class Variable
public Vehicle() { // Constructor, called when new a Object
this(0,"north"); // call another constructor to do initialization
}
public Vehicle(int s, String dir) { // Another Constructor. Use overloading
to define two constructors
float speed; // define a local variable
speed = s; // the speed here refers to the above local variable
this.speed = s; // If we want to set object variable, use this.speed to
refer object variable speed
direction = dir; // dir is a reference to object, not the object itself
numVehicle++; // increase the Vehicle number
}
protected void finalize() { // Destructor, called when the object is
garbage collected by JVM
System.out.println("finalize has been called");
numVehicle--;
}
void setSpeed(int newSpeed) { // Object Method
this.speed = newSpeed;
}
void setDir(String dir) { // Object Method
this.direction = dir;
}
int getSpeed() { // Object Method
return speed;
}
String getDir() { // Object Method
return direction;
}
public static int totalVehicle() { // Class Method
return numVehicle;
}
}
public class Example {
public static void main(String[] argv) {
Vehicle v1 = new Vehicle(50, "west"); // new 叙述用来产生对象.
对象产生时需要调用Constructor来初始化对象
Vehicle v2;
v1.setSpeed(30);
v1.setDir("north");
System.out.println("V1: speed is "+v1.getSpeed()+", direction is
"+v1.getDir()+".\n");
v2 = new Vehicle(40, "south");
System.out.println("There are "+Vehicle.totalVehicle()+" Vehicles in the
world.\n");
v1 = v2; // let reference v1 point to where v2 is pointing
System.out.println("V1: speed is "+v1.getSpeed()+", direction is
"+v1.getDir()+".\n");
System.gc(); // force system to do garbage collection, the object
previously pointed by v1 shall be destroyed
System.out.println("There are "+Vehicle.totalVehicle()+" Vehicles in the
world.\n");
}
}上述例子里所用到的关键字或类名称说明如下:
public:可用在class前面表示此class可以供其他package里的类使用。同一个目录下的class均可视为属于同一个package。
object or class member前面, 表示所有的class均可存取此member。
private:可用在object or class member前面, 表示只有定义这些member的class才可存取。
static:可用在member前面。如果member前面有static, 表示该member属于class,否则属于object。不论系统创造了多少object,class variable只有一个;而每个object都有其object variable。存取class method的语法是ClassName.classMethod();存取object method时,则必须以reference.objectMethod()来调用。在Object Method里,可用this表示目前的对象。但在Class Method里就不能存取object member了。
this:表示目前这个对象
String:定义于java.lang package下面的类, 属于Java语言定义的标准程序库。
System:定义于java.lang package下面的类, 属于Java语言定义的标准程序库。
System.out是class System里面的一个Class Variable, 其型态为reference to 定义于java.io package里面的PrintStream。我们可通过该变量所指到的对象, 将信息印到屏幕上。
System.gc是class System里面的一个Class Method, 调用该方法可强迫JVM回收没有被任何reference指到的对象。当对象被回收时, 该对象的finalize方法会被调用。
new:用来产生新的对象。后面必须跟着某个constructor, 以便进行初始化的动作。
Object Method的名称如果和Class的名称相同, 则表示该Method为Constructor。Constructor不能声明传回值。
要附带说明的是, Java以new指令来产生对象, 但不像C++有提供相对应的delete指令来消灭对象。Java采用Garbage Collection的观念,当系统于闲置期间自动调用或由用户强制调用System.gc()时,没有被任何reference指到的Object就会被回收。
Class里面一定要定义一个以上的Constructor, 但为了方便起见,如果Compiler发现某Class没有定义Constructor,则Compiler会帮我们产生一个不做任何事的Constructor:
public class A {
}就相当于
public class A {
public A() {}
}Overloading
同一个class里的Method名称可以重复使用,只要可以由Method的参数个数和型态来区分就可以了。这种观念称为overloading。
不只一般的method可以overloading, constructor也可以overloading。
public class Overloading {
int data;
public Overloading() {
this(0); // call constructor Overloading(int)
}
public Overloading(int data) {
this.data = data;
}
public void print() {
this.print(0); // call method print(int)
}
public void print(int msg) {
}
public void print(float msg) {
}
public void print(int msg, String others) {
}
}上面的例子里说明constructor也可以overloading。要特别注意的是,传回值并不能用来分辨要调用哪个method,因此若再加上public int print()的声明,就会造成编译错误了。
初始化的执行顺序
Class variable是在该类载入JVM时进行初始化的, 因此写作上经常在class variable的声明后面加上初始化的动作。对Object Variable来说, 是在产生Object时进行初始化的, 但初始化的步骤可以写在变量声明后, 也可以写在constructor内, 因此必须对其执行顺序有所了解。步骤如下:
先将所有变量设为内定值。对数值型态来说, 其值为0;对reference来说, 其值为null;对boolean来说, 其值为false。
调用父类的constructor。
执行变量声明的初始化动作。
执行自己的constructor。
因此在如下的范例内
public class InitSequence {
int data = 2;
public InitSequence(int data) {
this.data = data;
}
public static void main(String[] argv) {
InitSequence s = new InitSequence(3);
System.out.println(s.data);
}
}data的变化如下
设为内定值0
调用父类的Constructor。因为类InitSequence没有声明继承任何类, Java规定此情况会自动继承java.lang.Object这个类。Object的Constructor不做任何事。
执行变量声明的初始动作,成为2
执行自己的constructor,成为3
因此最后执行的结果会在屏幕上印出数字3。
Java语言还可以定义static block:
public class StaticBlock {
static { // this is a static block
data = (int)(Math.random()*100);
}
static int data;
public static void main(String[] argv) {
System.out.println(data);
}
}static block内的源代码, 是在该class载入JVM之后, 进行class variable初始化之前的时间内执行。一般比较会使用static block的场合, 是该class用到一些非Java的程序库, 需要通过System.loadLibrary(String libName)方法把外界的源代码载入时。这样写的好处是只有当该class第一次被使用到时, 才会下载相关软件, 以节省内存空间, 避免重复下载, 并可以把实作的细节和外界隔离开来。对没有这种机制的C语言来说, 很可能就必须在主程序内写上一堆很难懂的启动源代码。
class ClassNeedToLoadLibrary {
static {
System.loadLibrary("mylib");
}
}
public class Main {
public static void main(String[] argv) {
}
}final关键字
final关键字用在变量声明时,表示该变量的值只能在声明时给定,然后就不能再更改了。
public class Main {
public static final double PI = 3.14159;
public final int x = 10;
public static void main(String[] argv) {
final int local = 10;
Main m = new Main();
PI = 100; // Compile Error, final variable can only be set at
initialization
m.x = 10; // Compile Error
local = 100; // Compile Error
}
}- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
