博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

第七章: 封装

Posted on 2007-01-28 19:01  空气  阅读(240)  评论(0编辑  收藏  举报

这一章是要读者了解如何使用 Java 来描述对象的特性,对对象信息进行封装(Encapsulation), 也就是定义类(Class).


书上并没有"封装"的概念,在另一个地方找来:
封装:
      将成员变量声明为私有的(private),再提供一个或多个公有(public)方法实现对该成员变量的访问和修改。
封装的目的:
      1. 隐藏类的实现细节;
      2.让使用者只能通过指定的方法访问数据,可以方便加入控制逻辑,限制不合理的操作;
      3.便于修改,增强代码可维护性;
      4.可进行数据检查。
类(Class):
      类是对一组具有相同属性、操作、关系和语义的对象的描述。
对象(Object):
      对象封装了状态和行为的具有良好定义界面和身份的离散实体;即对象实例。
对象是类的实例,类描述了存在的可能对象集。


习惯在构造函数中利用 this 来避免代码重复

public class Ball
{
    
private String name;
    
    
public Ball()
    
{
        
this("No name");
    }

    
    
public Ball(String n)
    
{
        
this.name = n;
    }

}



关于static

和C#相同,.静态成员可以使用类名加上"."操作符来存取.
而和C#不同的是,在Java中,也可以在声明对象之后,通过对象名称加上"."操作符来存取静态域成员.

在 Java 的静态方法中不允许使用非静态成员

public class StaticDemo
{
    
// 若将此处的 static 去掉,则不能在 main方法中被调用
    public static void sayHello()
    
{
        System.out.println(
"Hello!");
    }

    
    
public static void main(String[] args)
    
{
        sayHello();
    }

}


编译器在处理重载方法,装箱问题和不定长参数时,会依下面的顺序来寻找合适的方法:
      寻找在还没有装箱动作前就可以符合参数个数与类型的方法
      尝试装箱动作后可以符合参数个数与类型的方法
      尝试没有不定长度参数并可以符合的方法
      编译器找不到合适的方法,报告错误.


不定长参数
在声明参数行时在类型关键词后加上 ...
需要注意的是:
      1. 不定长参数只能在 J2SE5.0 中使用
      2. 无法使用两个或以上的不定长参数
      3. 不定长参数只能设定在众多参数的最后一个

public class MathTool
{
    
// 这里 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() 建议程序进行垃圾收集.

public class GcTest
{
    
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);

    }


}