这一章是要读者了解如何使用 Java 来描述对象的特性,对对象信息进行封装(Encapsulation), 也就是定义类(Class).
书上并没有"封装"的概念,在另一个地方找来:
封装:
将成员变量声明为私有的(private),再提供一个或多个公有(public)方法实现对该成员变量的访问和修改。
封装的目的:
1. 隐藏类的实现细节;
2.让使用者只能通过指定的方法访问数据,可以方便加入控制逻辑,限制不合理的操作;
3.便于修改,增强代码可维护性;
4.可进行数据检查。
类(Class):
类是对一组具有相同属性、操作、关系和语义的对象的描述。
对象(Object):
对象封装了状态和行为的具有良好定义界面和身份的离散实体;即对象实例。
对象是类的实例,类描述了存在的可能对象集。
习惯在构造函数中利用 this 来避免代码重复
{
private String name;
public Ball()
{
this("No name");
}
public Ball(String n)
{
this.name = n;
}
}
关于static
和C#相同,.静态成员可以使用类名加上"."操作符来存取.
而和C#不同的是,在Java中,也可以在声明对象之后,通过对象名称加上"."操作符来存取静态域成员.
在 Java 的静态方法中不允许使用非静态成员
{
// 若将此处的 static 去掉,则不能在 main方法中被调用
public static void sayHello()
{
System.out.println("Hello!");
}
public static void main(String[] args)
{
sayHello();
}
}
编译器在处理重载方法,装箱问题和不定长参数时,会依下面的顺序来寻找合适的方法:
寻找在还没有装箱动作前就可以符合参数个数与类型的方法
尝试装箱动作后可以符合参数个数与类型的方法
尝试没有不定长度参数并可以符合的方法
编译器找不到合适的方法,报告错误.
不定长参数
在声明参数行时在类型关键词后加上 ...
需要注意的是:
1. 不定长参数只能在 J2SE5.0 中使用
2. 无法使用两个或以上的不定长参数
3. 不定长参数只能设定在众多参数的最后一个
{
// 这里 nums 实际上是一个数组
public static int sum(int nums)
{
int sum = 0;
// 注意这里for的用法, 类似于C#中的foreach
for (int num : nums)
{
sum += num;
}
return sum;
}
}
垃圾收集
Java 中并没有析构函数,但有 finalize() 方法
如果确定不再使用某个对象,可以指定为null
可以使用 System.gc() 建议程序进行垃圾收集.
{
private String name;
public GcTest(String n)
{
name = n;
System.out.println(name + "建立");
}
// 对象回收前执行
// 该方法重载了 Object.finzlize()
protected void finalize()
{
System.out.println(name + "被回收");
}
}
public class UseGC
{
public static void main(String[] args)
{
System.out.println("请按 Ctrl+C 终止程序");
GcTest obj1 = new GcTest("object1");
GcTest obj2 = new GcTest("object2");
GcTest obj3 = new GcTest("object3");
// 命令名称不参考至对象
obj1 = null;
obj2 = null;
obj3 = null;
// 建议回收对象
System.gc();
// 让垃圾收集在程序结束前有机会执行
while(true);
}
}