Archive for September, 2008

删除阴魂不散的微软拼音3.0

微软拼音挺不错的,起码我用了好几年,我个人感觉比较顺手。可是最近微软拼音给我带来了点麻烦。Windows XP中自带的是微软拼音输入法3.0,已经算是比较老的一个版本了,我已经安装了微软拼音输入法2007。但是安装完成之后原来的微软拼音3.0并没有升级到微软拼音2007,而是单独安装了微软拼音2007,两个版本独立存在。

这样的话,我只要在文字服务中把微软拼音输入法3.0删除就行了,这样我的系统中就只剩下微软拼音输入法2007。可是重新启动系统之后问题就出现了,微软拼音又回来了,可以在文字服务中却没有。很多人都不知道这个情况下该怎么删除了,实际上只要重新添加微软拼音输入法3.0之后再删除就可以了。但是这样重新启动之后它还是会出现…

microsoft pinyin 删除阴魂不散的微软拼音3.0

Read more »

体验Adobe Flash CS4

距离Adobe发布CS4系列软件已经有几天了,先安装了全新的Flash CS4。Flash是我平时使用频率费很高的几个软件之一,所以有新版本第一时间装上。感觉界面上Flash CS4相对Flash CS3变化相当大,具体功能上的变化要使用一段时间才会知道。废话少说,先来几张截图。

flash cs4 installation logo 体验Adobe Flash CS4

Read more »

怎么又是McAfee

自从两个多星期前买来acer Aspire One之后一直用的都很舒服。不过acer自带的McAfee Security Center,让我不是很放心,在去年底使用McAfee的时候就让很不放心(这里),果然今天安装Alcohol 120%的时候问题来了。

在运行Alcohol 120%的时候,McAfee居然报alcohol.exe有木马,并且在没有让我选择处理方式的情况下自作主张的把这个文件给删掉了,并且只是给我一个提示。没有了可执行文件自然无法运行程序,我还要自己在McAfee杂乱的菜单中找到恢复文件的选项。恢复之后要再次运行还是会被删掉,所以还要把McAfee自动防毒的功能给关掉才行。

mcafee 怎么又是McAfee

Read more »

Java中递归与循环

递归是指函数在运行中不断的调用自己的一中现象。递归并不是程序的流程结构,而是一种程序设计的一种思路和实现方式。而且递归不是一种算法,只是实现一种算法的思想。递归可以简化代码的思维强度,缩短代码,因此在很多语言中都有应用。

用递归实现阶乘是最好不过的了,这样可以有效地缩短代码。下面的代码就是用递归实现。

import java.util.*;

public class Factorial {
    public static void main(String[] args){
        System.out.println(”Please enter a number…”);
        Scanner in=new Scanner(System.in);
        int input=in.nextInt();
        factorial(input);
        System.out.print(factorials);
    }

    private static void factorial(int n){
        if(n>0){
            factorials*=n;
            n- -;
            factorial(n);
        }
    }
    private static int factorials=1;
}

Read more »

新完成的海报

朋友在学校参加了萨克斯乐团,托我帮他设计一张海报来吸引更多的人加入。因此我根据他的要求发挥我的想象设计了一幅海报,经过多次修改,最终效果就是这样了。

其实我也没有完全按照朋友的一些要求制作,我自己修改了一些地方,尤其在排版上。由于以前没有太多的制作海报的经验,所以感觉这次设计的并不是很完美。以后再继续努力吧。

主要是使用Photoshop CS3制作,一些矢量元素在Illustrator CS3中处理,最终导出到Photoshop中。PSD文件85M,分辨率1800*2400,算是我制作的所有图像中很大的了。

Read more »

Java中的继承(四)

继承是自上而下逐个派生,如果反过来看继承的层次,越是底层的类越特殊,越是高层的类越通用。因此在上层的更加通用,甚至更加抽象。不同的类拥有相同的方法和域就会造成代码的过长,因此把相同的方法和域放置在一个通用的类中,让需要的类来继承是个好选择。

有时候超类仅仅是为子类提供用于继承的方法和域,而并不需要构造超类的对象,因此把超类设计成抽象类是最好的选择。Java中使用abstract关键字来构造抽象类。抽象类与普通的类最大的区别就是抽象类只能被继承,而不能被实例化。

例如有三种人群,根据分类可以是这样的继承方式:

inheritance thumb Java中的继承(四)

Read more »

Java中的继承(三)

继续使用上一篇Java中的继承(二)中的代码为例。在Java中有一种可以用来判断时都应该将数据设计为继承关系的规则,也就是”is-a”规则。这表明一个子类的对象也是超类的对象。

简单来说所有在使用超类的地方都可以使用子类来替换。比如示例代码中的经理都是雇员一样。但是在子类的地方不可以使用超类来替换。比如不是所有雇员都是经理。也就是说is-a规则是单向的,只能由子类替换超类,而不能使用超类来替换字类。因为根据继承的规则,子类拥有所有超类的方法和域,因此超类可以使用子类来替换。但是更重要的是,子类可以添加或者重写方法或者域,因此就不能保证子类能够使用超类来替换。

例如可以将一个子类的对象变量赋给超类的变量:

Employee e;
e=new Employee(…);
e=new Manager(…);

另外,可以这样使用:

Manager boss=new Manager(…);
Employee[] staff=new Employee[3];
staff[0]=boss;

Read more »

Java中的继承(二)

上次讲了Java中继承的基本概念和理论知识。这次就来结合具体事例来讲解一下。就来看一个具体例子:

import java.util.*;

public class ManagerTest
{
   public static void main(String[] args)
   {
      Manager boss = new Manager(”Carl Cracker”, 80000, 1987, 12, 15);
      boss.setBonus(5000);

      Employee[] staff = new Employee[3];

      staff[0] = boss;
      staff[1] = new Employee(”Harry Hacker”, 50000, 1989, 10, 1);
      staff[2] = new Employee(”Tommy Tester”, 40000, 1990, 3, 15);

      for (Employee e : staff)
         System.out.println(”name=” + e.getName()
            + “,salary=” + e.getSalary());
   }
}

class Employee
{
   public Employee(String n, double s, int year, int month, int day)
   {
      name = n;
      salary = s;
      GregorianCalendar calendar = new GregorianCalendar(year, month – 1, day);
      hireDay = calendar.getTime();
   }

   public String getName()
   {
      return name;
   }

   public double getSalary()
   {
      return salary;
   }

   public Date getHireDay()
   {
      return hireDay;
   }

   public void raiseSalary(double byPercent)
   {
      double raise = salary * byPercent / 100;
      salary += raise;
   }

   private String name;
   private double salary;
   private Date hireDay;
}

class Manager extends Employee
{
   public Manager(String n, double s, int year, int month, int day)
   {
      super(n, s, year, month, day);
      bonus = 0;
   }

   public double getSalary()
   {
      double baseSalary = super.getSalary();
      return baseSalary + bonus;
   }

   public void setBonus(double b)
   {
      bonus = b;
   }

   private double bonus;
}

(摘自《Java2核心技术》)

Manager是Employee的一员,因此可以扩展Employee类。但是Manager又和普通的Employee有些不同,包括Salary(薪金)。因此就需要重新覆盖Manager类中的getSalary方法。看起来比较简单,只要返回salary和bonus就可以了,就如这样:

public double getSalary(){
    return salary+bonus;
}

但是编译运行之后就会发现这根本不起效果。原因在于虽然每个Manager对象都有一个名为salary的域,但是在Manager类中病不能直接访问私有的salary域,只有Employee类的方法才能够访问其私有的部分。但是Manager域可以通过公有的接口来访问私有域,Employee中的getSalary方法正符合。

public double getSalary(){
    double baseSalary=getSalary();
    return baseSalary+bonus;
}

现在,修改过的代码运行起来仍然有问题,在于Manager类中同样有getSalary方法,因此会无限次的调用自己知道程序崩溃为止。应该使用Employee类的getSalary方法而不是Manager类。使用super关键字来调用超类的方法,包括构造器。

public double getSalary(){
    double baseSalary=super.getSalary();
    return baseSalary+bonus;
}

这样,就解决问题了。

入手一台acer小机器

由于有了15.4寸的VAIO FZ27,因此比较看重acer Aspire One的便携性,所以入手一台,以后带到学校比较方便,路上不要背的太辛苦。

性能一般,主要考虑的就是便携。Super PI 100万位的运算时间是1分34秒,而FZ27的时间只有23秒。

dsc01189 入手一台acer小机器

Read more »

Java中的继承(一)

Java中类之间的关系之一就是继承。很多程序设计语言都具有继承这个特性。

在Java程序设计语言中,使用extends关键字表示一个类派生于另外一个类。习惯上,被派生的类成为超类,派生的类成为子类。一般的,子类会具有比超类更多的数据和功能。

继承的含义就如它的字面意思,当子类继承了超类之后,子类就拥有了超类的域和方法。简单的来说,继承看上去有些类似于复制。并且子类可以被当作超类的数据类型进行使用。Java中所有类都直接或者间接的继承于Object类,因此可以说Object类是所有Java类的超类,因此所有类类型都可以被当作Object类型使用。

再通过扩展超类定义子类的时候,仅需要指出子类与超类的不同之处。因此在设计类的时候,应该将通用的方法放置在超类中,通过继承获得超类的功能,而将具有特殊用途的方法放置在子类中,这种通用的功能放到超类中的做法十分普遍。

Read more »