Archive for the 'Techniques' Category

Java中的接口

在Java程序设计语言中,接口不是类,而是一组对类的需求描述,这些类要遵从接口描述的统一格式进行定义。

接口中所有方法都自动的属于public。所以,在接口的声明方法时,不必提供关键字public。Java的接口中可以包含多个方法,也可以有常量。但是接口的定义中绝对不能有方法的具体实现,也不能有实例域。方法的具体实现和实例域应该由实现接口的类来完成。

Java中,接口被当作一种数据类型,因此一个类实现了一个接口之后,不仅能够当作类本身的数据类型,还可以被当作实现的接口的数据类型。另外,实现接口的类必须重新定义接口中的所有方法。

Java中使用implements关键字实现一个接口,例如:

class UserClass implements UserInterface

而定义一个Java接口使用interface,例如:

interface UserInterface

接口不是类,所以不能使用new关键字实例化一个接口。但却可以声明一个接口变量。接口对象必须引用实现了接口的类对象。

虽然Java中一个类不能继承多个类,但是却可以实现多个接口,不同的接口之间使用逗号分隔,例如:

class UserClass implements UserInterface,SystemInterface

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);
    }

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);

Read more »

Java中的继承(一)

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

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

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

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

Read more »

Java中值引用与地址引用

Java中数据类型分为基本类型和引用类型,如果还不清楚有哪些基本类型可以看这里的文章。

基本数据类型采用的是值传递,所谓值传递,也就是说当一个值赋给一个变量了之后,那么这个值就被存储于这个变量之中。

int a=5;    //声明一个整型变量a,并存储数值5
int b=a;    //声明一个整型变量b,并将a的值传递给b
b=6;    //将b的值更改为6

那么现在a中的值是多少?5还是6?答案是5。

原因在于Java中基本数据类型是值引用的,数值是存储在变量中的。声明变量a之后并将5赋给a,然后再将a的值赋给b。此时b已经存储5这个数值,但是和a中的互不干扰,改变任意一个变量的值并不会影响另外一个。这就是值引用。

Read more »

Java中的包与访问控制

Java中使用包组织类。使用包可以方便的管理代码,使得各个代码文件具有层次性,就如同硬盘中文件夹的嵌套一样具有层次性。实际上,在一个Java包在硬盘上的表现形式就是一个文件夹。

包可以有效地管理类,可以确保类名的唯一性。例如创建了两个名字相同的类但是却具有不同的功能,那么在不重新命名的前提下,最好的方法就是创建一个包,将其中一个类放入相应的包中。为了确保包名的唯一性,SUN公司建议将公司域名的逆序形式作为包名。以我的soleilneon.com域名为例,逆序形式就是com.soleilneon,那么在硬盘上文件夹的形式就是com\soleilneon。需要注意的是,Windows中使用的是反斜杠“\”,而Linux中使用的是斜杠“/”。

Java中标准类库就分别位于多个包内,为了使用特定的类需要指明包的路径。例如:

java.util.Date today=new java.util.Date();

这当然是个低效率的做法,每个类都需要指明完整包路径是相当的繁琐的,因此可以使用import语句导入包或者类,这样导入之后就可以不用写包路径,只需要类名就可以了。例如:

import java.util.*;
Date today=new Date();

另外也可以导入特定的类而不需要整个包:

import java.util.Date;

Read more »

如何制作全景图象

全景的概念我就不多说了,大多数人基本都有所了解。人眼的视觉比例大约为16:10,全景图像一般都要比这个比例要大很多。昨天我就新建了一个页面放置了我至今为止所制作过的所有全景图像。现在我要介绍就是如何制作全境图像。

拍照

全景是由多张照片拼接在一起的,因此拍照的时候就有一些要求。拍摄的相连的两张照片中需要有一定的重叠部分,这样软件或是自己才能有一定的参照。如下图蓝色区域所示。

pano_sample

另外,拍摄照片的时候画面要保持水平,这样在后期拼接的时候比较易于处理,不然会人为的增加麻烦。建议拍照从左向右或是反方向拍摄,不要随意拍摄,这样不能保证照片之间都有重叠的部分,而且也不利于处理。

Read more »

Java中println函数的陷阱

前几日在学习Java的时候我家Smigoo遇到了一个小麻烦,怎么调试都无法通过,因此向我求救。在看了代码之后我也糊涂了,一时找不出问题出在什么地方。源代码如下,目的是为了测试代码点和代码单元的不同。

public class AA
{
    public static void main (String[] args)
    {
        String greeting=”hello”;
        int n=greeting.length();
        int m=greeting.codePointCount(0,greeting.length());
        System.out.println(n,m);
    }
}

一开始使用Notepad++编写源代码进行编译也是一样无法通过,奇怪了,JDK返回如下的错误。

Read more »

Next Page »