当前位置:文档之家› Java 8函数式接口functional interface的秘密

Java 8函数式接口functional interface的秘密

Java 8函数式接口functional interface的秘密
Java 8函数式接口functional interface的秘密

函数式接口(Functional Interface)是Java 8对一类特殊类型的接口的称呼。这类接口只定义了唯一的抽象方法的接口(除了隐含的Object对象的公共方法),因此最开始也就做SAM类型的接口(Single Abstract Method)。

为什么会单单从接口中定义出此类接口呢?原因是在Java Lambda的实现中,开发组不想再为Lambda表达式单独定义一种特殊的Structural函数类型,称之为箭头类型(arrow type),依然想采用Java既有的类型系统(class, interface, method等),原因是增加一个结构化的函数类型会增加函数类型的复杂性,破

坏既有的Java类型,并对成千上万的Java类库造成严重的影响。权衡利弊,因此最终还是利用SAM 接口作为 Lambda表达式的目标类型。

JDK中已有的一些接口本身就是函数式接口,如Runnable。 JDK 8中又增加了java.util.function包,提供了常用的函数式接口。

函数式接口代表的一种契约,一种对某个特定函数类型的契约。在它出现的地方,实际期望一个符合契约要求的函数。 Lambda表达式不能脱离上下文而存在,它必须要有一个明确的目标类型,而这个目标类型就是某个函数式接口。

当然, Java 8发布快一年了,你对以上的概念也应该有所了解了,这篇文章

也不会介绍这些基础的东西,而是想深入的探讨函数式接口的定义和应用。

JDK 8之前已有的函数式接口

?https://www.doczj.com/doc/f24603936.html,ng.Runnable

?java.util.concurrent.Callable

?java.security.PrivilegedAction

?https://www.doczj.com/doc/f24603936.html,parator

?java.io.FileFilter

?java.nio.file.PathMatcher

?https://www.doczj.com/doc/f24603936.html,ng.reflect.InvocationHandler

?java.beans.PropertyChangeListener

?java.awt.event.ActionListener

?javax.swing.event.ChangeListener

新定义的函数式接口

java.util.function中定义了几组类型的函数式接口以及针对基本数据类型的子接口。

?Predicate—传入一个参数,返回一个bool结果,方法为boolean test(T t)

?Consumer —传入一个参数,无返回值,纯消费。方法为void accept(T t)

?Function—传入一个参数,返回一个结果,方法为R apply(T t)

?Supplier—无参数传入,返回一个结果,方法为T get()

?UnaryOperator —一元操作符,继承Function,传入参数的类型和返回类型相同。

?BinaryOperator—二元操作符,传入的两个参数的类型和返回类型相同,继承BiFunction

Java API对函数式接口都已经标明了,如:

https://www.doczj.com/doc/f24603936.html,ng

Interface Runnable

All Known Subinterfaces:

RunnableFuture, RunnableScheduledFuture

All Known Implementing Classes:

AsyncBoxView.ChildState, ForkJoinWorkerThread, FutureTask, RenderableImageProducer, SwingWorker, Thread, TimerTask

Functional Interface:

This is a functional interface and can therefore be used as the assignment target for a lambda expression or method reference.

函数式接口中可以额外定义多个抽象方法,但这些抽象方法签名必须和Object 的public方法一样

接口最终有确定的类实现,而类的最终父类是Object。因此函数式接口可以定义Object的public方法。

如以下的接口依然是函数式接口:

1 2 3 4 5 6 7 8 @FunctionalInterface

public interface ObjectMethodFunctionalInterface { void count(int i);

String toString(); //same to Object.toString

int hashCode(); //same to Object.hashCode

boolean equals(Object obj); //same to Object.equals }

为什么限定public类型的方法呢?因为接口中定义的方法都是public类型的。举个例子,下面的接口就不是函数式接口:

1 2 3 4 5 interface WrongObjectMethodFunctionalInterface { void count(int i);

Object clone(); //Object.clone is protected

}

因为Object.clone方法是protected类型。

声明异常

函数式接口的抽象方法可以声明可检查异常(checked exception)。在调用目标对象的这个方法时必须catch这个异常。

1 2 3 4 public class FunctionalInterfaceWithException { public static void main(String[] args) {

InterfaceWithException target = i -> {};

try {

5 6 7 8 9

10

11

12

13

14

target.apply(10);

} catch (Exception e) {

e.printStackTrace();

}

}

}

@FunctionalInterface

interface InterfaceWithException { void apply(int i) throws Exception; }

这和以前的接口/方法调用一样。

但是,如果在Lambda表达式中抛出异常,而目标接口中的抽象函数没有声明这个可检查,则此接口不能作为此lambda表达式的目标类型。

1 2 3 4 5 6 7 8 9 10 public class FunctionalInterfaceWithException {

public static void main(String[] args) {

InterfaceWithException target = i -> {throw new Exception();};

}

}

@FunctionalInterface

interface InterfaceWithException {

void apply(int i);

}

上面的例子中不能编译,因为lambda表达式要求的目标类型和InterfaceWithException不同。 InterfaceWithException的函数没有声明异常。

静态方法

函数式接口中除了那个抽象方法外还可以包含静态方法。

Java 8以前的规范中接口中不允许定义静态方法。 静态方法只能在类中定义。 Java 8中可以定义静态方法。

一个或者多个静态方法不会影响SAM 接口成为函数式接口。

下面的例子中FunctionalInterfaceWithStaticMethod 包含一个SAM: apply,还有一个静态方法sum 。 它依然是函数式接口。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

@FunctionalInterface interface FunctionalInterfaceWithStaticMethod { static int sum(int[] array) { return Arrays.stream(array).reduce((a, b) -> a+b).getAsInt(); } void apply(); } public class StaticMethodFunctionalInterface { public static void main(String[] args) { int sum = FunctionalInterfaceWithStaticMethod.sum(new int[]{1,2,3,4,5}); FunctionalInterfaceWithStaticMethod f = () -> {}; } } 默认方法

Java 8中允许接口实现方法, 而不是简单的声明, 这些方法叫做默认方法,使用特殊的关键字default 。

因为默认方法不是抽象方法,所以不影响我们判断一个接口是否是函数式接口。 1

2

3 @FunctionalInterface interface InterfaceWithDefaultMethod { void apply(Object obj);

4

5 6 7 8 9

10

11

12

13

14

15

16

17

default void say(String name) {

System.out.println("hello " + name);

}

}

class FunctionalInterfaceWithDefaultMethod { public static void main(String[] args) {

InterfaceWithDefaultMethod i = (o) -> {};

i.apply(null);

i.say("default method");

}

}

InterfaceWithDefaultMethod仍然是一个函数式接口。

泛型及继承关系

接口可以继承接口。如果父接口是一个函数接口,那么子接口也可能是一个函数式接口。判断标准依据下面的条件:

对于接口I, 假定M是接口成员里的所有抽象方法的继承(包括继承于父接口的方法),除去具有和Object的public的实例方法签名的方法,那么我们可以依据下面的条件判断一个接口是否是函数式接口,这样可以更精确的定义函数式接口。

如果存在一个一个方法m,满足:

?m的签名(subsignature)是M中每一个方法签名的子签名(signature)?m的返回值类型是M中的每一个方法的返回值类型的替代类型(return-type-substitutable)

那么I就是一个函数式接口。

看几个例子。

1)

1 2 3 interface X { int m(Iterable arg); } interface Y { int m(Iterable arg); } interface Z extends X, Y {}

接口Z继承了X,Y接口的m方法,由于这两个方法的签名相同,返回值也一样,所以Z有唯一的一个抽象方法int m(Iterable arg);,可以作为函数式接口。

2)

1 2 3 interface X { Iterable m(Iterable arg); } interface Y { Iterable m(Iterable arg); } interface Z extends X, Y {}

方法签名Y.m 既满足签名是X.m,并且返回值也满足

return-type-substitutable。所以Z是函数式接口,函数类型为Iterable m(Iterable arg)。

3)

1 2 3 interface X { int m(Iterable arg); } interface Y { int m(Iterable arg); } interface Z extends X, Y {}

编译出错,没有一个方法的签名是所有方法的子签名:4)

1 2 3 interface X { int m(Iterable arg, Class c); } interface Y { int m(Iterable arg, Class c); } interface Z extends X, Y {}

Compiler error: No method has a subsignature of all abstract methods 编译出错,没有一个方法的签名是所有方法的子签名

5)

1 2 3 interface X { long m(); } interface Y { int m(); } interface Z extends X, Y {}

Compiler error: no method is return type substitutable 编译出错,返回值类型不同。

6)

1 2 3 interface Foo { void m(T arg); }

interface Bar { void m(T arg); }

interface FooBar extends Foo, Bar {}

Compiler error: different signatures, same erasure 编译出错

7)

1 2 3 interface Foo { void m(String arg); } interface Bar { void m(T arg); } interface FooBar extends Foo, Bar {}

不是一个函数式接口,两个方法的类型参数不一样。

8)

1 2 3 4 5 interface X { void m() throws IOException; }

interface Y { void m() throws EOFException; }

interface Z { void m() throws ClassNotFoundException; }

interface XY extends X, Y {}

interface XYZ extends X, Y , Z {} X.m,Y.m,Z.m 方法签名相同,返回值类型都是void ,只是异常列表不同。 EOFException 是IOException 的子类。

在这种情况下XY 和XYZ 都是函数式接口,但是函数类型不同。

// XY has function type ()->void throws EOFException

// XYZ has function type ()->void (throws nothing)

9)

1 2 3 4 5 6 7 8 9 10 11 interface A {

List foo(List arg) throws IOException, SQLTransientException;

}

interface B {

List foo(List arg) throws EOFException, SQLException, TimeoutException; }

interface C {

List foo(List arg) throws Exception;

}

interface D extends A, B {}

interface E extends A, B, C {}

// D has function type (List)->List throws EOFException,

SQLTransientException

// E has function type (List)->List throws EOFException,

SQLTransientException

10)

1 2 3 4 5 6 7 interface G1 {

Object m() throws E;

}

interface G2 {

String m() throws Exception; }

interface G extends G1, G2 {}

// G has function type ()->String throws F 函数式接口的交集

1)

1 2 3 4 5 6 7 8 9

10

11 public class Z {

public static void main(String[] args) { Object o = (I & J) () -> {};

}

}

interface I {

void foo();

}

interface J {

void foo();

}

I和J方法的交集依然符合函数式接口的定义。上述代码可以用JDK中的javac 编译通过但是Eclipse报错,这是Eclipse的一个bug。

2)

1 2 3 public class Z {

public static void main(String[] args) { Object o = (I & J) () -> {};

4

5

6

7

8

9

10

11 } } interface I { void foo(); } interface J { void foo(); }

上述代码Eclipse 不会报错但是javac 无法编译,javac 认为 (I & J)不是一个函数式接口。 看起来javac 工作正常, Eclipse 处理这样的case 还有问题。 @FunctionalInterface

Java 不会强制要求你使用@FunctionalInterface 注解来标记你的接口是函数式接口, 然而,作为API 作者, 你可能倾向使用@FunctionalInterface 指明特定的接口为函数式接口, 这只是一个设计上的考虑, 可以让用户很明显的知道一个接口是函数式接口。

1

2

3

4 @FunctionalInterface public interface SimpleFuncInterface { public void doWork(); }

如果你在一个不是函数式的接口使用@FunctionalInterface 标记的话,会出现什么情况?编译时出错。

1 2 3 4 5 error: Unexpected @FunctionalInterface annotation

@FunctionalInterface

^

I is not a functional interface

multiple non-overriding abstract methods found in interface I

java项目开发实例图书信息管理系统开发及源码

j a v a项目开发实例图书信息管理系统开发及源 码 集团文件发布号:(9816-UATWW-MWUB-WUNN-INNUL-DQQTY-

图书信息管理系统 一、系统功能概述: 根据图书信息管理系统的特点,可以将本系统分为2大功能模块,分别为:基础数据维护、系统数据维护。本系统各个部分及其包括的具体功能模块如下图所示: 二、数据库设计: 图书信息表: 图书类别表: 用户信息表:

读者信息表: 三、系统源代码: ewInstance(); conn = (dbUrl, dbUser, dbPwd); "数据库连接成功!"); } else return; } catch (Exception ee) { (); } } xecuteQuery(sql); } catch (SQLException e) { ();

return null; } finally { } } xecuteUpdate(sql); } catch (SQLException e) { quals("[Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]DELETE 语句与 COLUMN REFERENCE 约束 'FK_TB_BORRO_REFERENCE_TB_BOOKI' 冲突。该冲突发生于数据库 'db_library',表 'tb_borrow', column 'bookISBN'。")) return -1; } finally { } } etLayout(borderLayout); setIconifiable(true); dd(panel); final JLabel label_2 = new JLabel(); ("图书编号:"); (label_2); ISBN = new JTextField("请输入13位书号",13); (new MyDocument(13)); dd(panel_1, ; final FlowLayout flowLayout = new FlowLayout();

Java Web项目开发总结

1、In Action (1)根据添加信息(insert)来考虑表中的字段,进行建表。使用PD画出ER图。要注意字段的数据类型的确定以及建表要满足三范式,减少数据冗余; (2)表建好后,根据表中各个字段来建pojo中的属性。要注意属性的数据类型和字段的数据类型要一致; (3)根据pojo中的属性确定bean的属性,直接拷贝即可,用于页面展示。在bean中,统一使用String类型变量接收前台页面传递的参数;每个HTML表单对应一个bean。HTML 表单中的字段和bean中的属性一一对应。 (4)自顶向下,依次定出action、manager、dao。先写出轮廓,跑通整个流程,再写具体实现,一点点累加,便于调试错误; (5)根据数据实体和具体业务逻辑,使用StarUML画类图,进行OOA和OOD,灵活运用设计模式。 (6)API命名: CRUD:add,get,update,delete,[list] 严格区分单复数形式,单数表示对象,复数表示对象集合。 对象、属性最好单个单词。 (7)前后台都要校验。 (8)按照资源方式组织数据接口,对前端开发帮助很大。即通过REST来实现资源的增、删、改、查。 (9)软件开发,思路最重要!代码开发多了,思路就有了。 a、一个版本一个版本递增的开发;每个版本增加一点内容; b、总结开发思路;第一步怎么做,下一步怎么做? c、用文档记录开发的思路,即第一个版本开发实现了什么功能以及开发步骤,下一个版本实现了什么功能等等?

d、程序员进行程序开发时,不要仅仅停留在代码,要深入到底层的运行机制,才可以对程序的运行机制有更准备的把握; (10)网页模板 request到template.jsp文件(此文件假设包括三个部分,即title、banner、body) web客户——> title banner———————>include:banner.jsp body————————>include:showcart.jsp (11)一步一步的定位。根据结果进行分析。 (12)分页控件 假分页: 基本思想是将所有的数据从数据库中取出,只显示有用的部分。靠的是程序的算法,实际上就是在ResultSet上进行操作。 真分页:(数据库中的一种实现) 任何数据库都会提供分页的函数操作:Oracle、MySQL(limit,即limit 开始的记录, 要查询的行数)、SQL Server(top) 基本思想是在数据库中编写特定的SQL语句。程序中只读取有用的部分,没用的部分不会加载到内存中。 (13) 2、TIPS

Java 接口与类之间继承例题

1,定义一个接口Assaultable(可攻击的),该接口有一个抽象方法attack()。 2,定义一个接口Mobile(可移动的),该接口有一个抽象方法move()。 3,定义一个抽象类Weapon,实现Assaultable接口和Mobile接口,但并没有给出具体的 实现方法。 4,定义3个类:Tank,Flighter,WarShip都继承自Weapon,分别用不同的方式实现Weapon 类中的抽象方法。 5,写一个类Army,代表一支军队,这个类有一个属性是Weapon数组w(用来存储该军队所拥有的所有武器);该类还提供一个构造方法,在构造方法里通过传一个int类型的参数来限定该类所能拥有的最大武器数量,并用这一大小来初始化数组w。该类还提供一个方法addWeapon(Weapon wa),表示把参数wa所代表的武器加入到数组w中。在这个类中还定义两个方法attackAll()和moveAll(),让w数组中的所有武器攻击和移动。 6,写一个主方法去测试以上程序。 interface Assaultable{//可攻击的 void attack(); } interface Mobile{//可移动的 void move(); } abstractclass Weapon implements Assaultable,Mobile { publicvoid attack(){} publicvoid move(){} } class Tank extends Weapon{ publicvoid attack(){ System.out.println("坦克攻击!!!"); } publicvoid move(){ System.out.println("坦克移动!!!"); } } class Flighter extends Weapon{ publicvoid attack(){ System.out.println("战斗机攻击!!!"); } publicvoid move(){ System.out.println("战斗机移动!!!");

实验五java项目开发实例

实验五Java项目开发实例 实验目的: 掌握运用RAD开发Java应用程序 目标要求: 1.掌握运用Visual Editor创建窗口应用程序 2.掌握通过JDBC连接数据库 内容简介: 本章将介绍MyLibrary的 GUI应用程序。 实验说明: 第一节创建GUI应用程序 1.添加JDBC环境变量 在菜单栏点击“文件 -> 新建 -> 项目”,选择“Java项目”,点击“下一步”。 输入项目名称“MyLibraryGUI”,点击“下一步”。 在Java设置中选择“库”栏,点击“添加变量”。在“新建变量类路径条目”对话框

中点击“配置变量” 在“类途径变量”对话框中点击“新建”按钮,会弹出“新建变量条目”对话框。在“名称”栏中输入“CLOUDSCAPE_DRIVER_JAR”,然后点击“文件”按钮,找到D:/Program Files/IBM/Rational/SDP/runtimes/base_v6/cloudscape/lib/,如下图: 点击“确定”。再次点击“确定”。在弹出对话框点击“是”。 在“新建变量类路径条目”窗口中选择 ,点击“确定”。

这样就在MyLibraryGUI项目里添加了Cloudscape 的JDBC驱动。点击“完成”按钮。 2.新建可视类(Visual Class) 在菜单栏选择“文件 -> 新建 -> 其它 -> Java -> 可视类”,点击“下一步”。 在“Java类”窗口,“包”文本框输入,“名称”文本框输入“MyLibraryDesktopApp”,“样式”选择“Swing -> 框架”(选择后“超类”变成),点击“接口”右侧的“添加”,输入ActionListener,点击“确定”。勾选“pulibc static void main(String[] args)”,点击“完成”

java开发接口文档模板

竭诚为您提供优质文档/双击可除java开发接口文档模板 篇一:java的接口与实例 一、定义 java接口(interface),是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。 接口定义的一般形式为: [访问控制符]interface{ 类型标识符final符号常量名n=常数; 返回值类型方法名([参数列表]); … } 二、接口的特点 1、java接口中的成员变量默认都是 public,static,final类型的(都可省略),必须被显示初始化,即接口中的成员变量为常量(大写,单词之间用"_"分隔) 2、java接口中的方法默认都是public,abstract类型

的(都可省略),没有方法体,不能被实例化 3、java接口中只能包含public,static,final类型的成员变量和public,abstract类型的成员方法 4、接口中没有构造方法,不能被实例化 5、一个接口不能实现(implements)另一个接口,但它可以继承多个其它的接口 6、java接口必须通过类来实现它的抽象方法 7、当类实现了某个java接口时,它必须实现接口中的所有抽象方法,否则这个类必须声明为抽象类 8、不允许创建接口的实例(实例化),但允许定义接口类型的引用变量,该引用变量引用实现了这个接口的类的实例 9、一个类只能继承一个直接的父类,但可以实现多个接口,间接的实现了多继承. 三、接口的用法 1、精简程序结构,免除重复定义 比如,有两个及上的的类拥有相同的方法,但是实现功能不一样,就可以定义一个接口,将这个方法提炼出来,在需要使用该方法的类中去实现,就免除了多个类定义系统方法的麻烦。举例:鸟类和昆虫类都具有飞行的功能,这个功能是相同的,但是其它功能是不同的,在程序实现的过程中,就可以定义一个接口,专门描述飞行。 下图是分别定义鸟类和昆虫类,其都有飞行的方法。

JAVA编程实例大全及详解答案(50例)

JA V A编程实例大全及详解答案(50例) 【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? //这是一个菲波拉契数列问题 public class lianxi01 { public static void main(String[] args) { System.out.println("第1个月的兔子对数: 1"); System.out.println("第2个月的兔子对数: 1"); int f1 = 1, f2 = 1, f, M=24; for(int i=3; i<=M; i++) { f = f2; f2 = f1 + f2; f1 = f; System.out.println("第" + i +"个月的兔子对数: "+f2); } } } 【程序2】 题目:判断101-200之间有多少个素数,并输出所有素数。 程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。 public class lianxi02 { public static void main(String[] args) { int count = 0; for(int i=101; i<200; i+=2) { boolean b = false; for(int j=2; j<=Math.sqrt(i); j++) { if(i % j == 0) { b = false; break; } else { b = true; } } if(b == true) {count ++;System.out.println(i );} } System.out.println( "素数个数是: " + count);

java继承与接口 实验报告

应用数学学院信息与计算科学专业 2 班学号3111008162 姓名许庆平教师评定_________________ 实验题目继承与接口 一、实验目的与要求 实验目的: 1、掌握类的继承关系。 2、掌握接口的定义与使用。 实验要求: 按下列要求编写Java程序: 1、定义接口Printx,其中包括一个方法printMyWay(),这个方法没有形参,返回值为空。 2、编写矩形类,矩形类要求实现Printx接口,有求面积、求周长的方法,printMyWay()方法要能显示矩形的边长、面积和周长。 3、编写正方形类作为矩形类的子类,正方形类继承了矩形类求面积和周长的方法,新增加求对角线长的方法,重写printMyWay()方法,要求该方法能显示正方形的边长、面积、周长和对角线长。 二、实验方案 先按要求定义接口Printx,再创建一个矩形类Rectangle,有成员变量length 和width,area()求面积,circle()求周长,用PrintMyWay()显示。 然后定义正方形类,继承Rectangle类,定义求对角线长的函数duijiaoxian()。面积和周长用父类中的area()和circle()实现。用PrintMyWay()显示。最后在主类中实现这两个类。 三、代码如下 interface Printx

{ void PrintMyWay();} class Rectangle implements Printx { int length,width; Rectangle(int x,int y){ length=x; width=y; } int area(){ return length*width; } int circle(){ return 2*(length+width); } public void PrintMyWay(){ System.out.println("矩形的长为:"+length); System.out.println("矩形的宽为:"+width); System.out.println("矩形的面积为:"+area()); System.out.println("矩形的周长为:"+circle()); }

javaweb开发案例

中原工学院软件学院 软件工程实践一设计任务书 指导教师签字: 年月日 超市商品管理系统

摘要 20 世纪90 年代后期特别就是近几年,我国的超市产业飞速发展,其经营模式更为复杂,旧的管理体制已经无法适应超市的发展,这就迫切的需要引进新的管理技术、超市的数据与业务越来越庞大,而计算机就就是一种高效的管理系统,这就需要我们把超市的管理与计算机结合起来,从而超市管理系统应运而生、依靠现代化的计算机信息处理技术来管理超市,节省了大量的人力、物力,并且能够快速反映出商品的进销,存等状况与各种反馈信息分析,使管理人员快速对市场的变化做出相应的决策,加快超市经营管理效率。随着人们生活水平的不断提高,对于物质的需求也越来越高,而超市作为日常生活用品聚集的场所,随着全球各种超市的数目的不断增加,规模不断增大, 其管理难度也相应的增加,而为了适应当今信息化发展的时代,一套完整的超市商品管理系统显得尤为重要。 关键词: 商品; 管理; 进销 目录 摘要 (2) 第1章项目分析 (1) 1、1背景 (1) 1、2技术分析 (1) 1、2、1 框架技术 (1) 1、2、2 Html、JSP、JavaScript动态网页技术 (1) 1、2、3 MySQL数据库 (2) 1、3工程进度计划 (2) 表1、3 工程进度计划表 (2) 第二章系统分析 (3) 2、1可行性分析 (3) 2、1、1技术可行性分析 (3) 2、1、2经济可行性分析 (3) 2、1、3安全可行性 (3) 2、1、4操作可行性 (3) 2、2需求分析 (4) 2、2、1系统的主要功能 (4)

2、2、2运行环境 (5) 第三章总体设计 (5) 3、1功能模块设计 (5) 3、2系统功能设计 (6) 3、3系统数据库E-R图 (6) 3、4数据库设计 (7) 3、4、1 职工信息表 (7) 3、4、2 用户登录表 (7) 3、4、3 商品信息表 (8) 3、4、4 供货商信息表 (8) 3、4、5 进货信息表 (8) 3、4、6 销售信息表 (9) 3、4、7 库存信息表 (9) 第四章系统实现 (9) 4、1登录界面 (9) 4、2商品信息管理模块 (10) 4、3职工信息管理模块 (10) 4、4供货商信息管理模块 (10) 4、5添加销售信息模块 (11) 4、6添加进货信息模块 (11) 4、7库存信息管理模块 (12) 4、8权限设置管理模块 (12) 第五章关键技术及实现方法 (13) 5、1主要任务 (13) 5、1、1商品管理 (13) 5、1、2销售管理 (15) 第六章结束语 (16) 附录:部分源代码 (18)

JAVA工程师个人简历中的项目经验范文

JAVA工程师个人简历中的项目经验范文 JAVA工程师个人简历中的项目经验范文 国产中间件参考实现及平台 软件环境: j2ee 硬件环境: x86 开发工具: Java 项目描述:核高基重大专项课题该课题旨在建立国产中间件标准体系,进而在该标准体系指导下构建国产中间件参考实现与平台,从技术、产品与产业运作机制等方面探索适合国产中间件发展的一体化方案。责任描述:编写相关文档和设计报告。将Onceportal 4.0中符合JSR 286规范的Portlet容器OSGi化。 轻量级数据持久框架 软件环境: j2ee 硬件环境: x86 开发工具: Java 项目描述:国家863项目子课题该课题旨在提供一种能够提高小型信息系统持久层的开发效率,降低其在异构数据库之间的迁移成本的数据持久化框架。责任描述:调研现有持久化技术,编写可行性报告。借鉴已有产品和标准的经验,提取数据持久化通用接口,完成持久化框架总体设计。在Java环境下对框架进行开发,并提供了框架接口在关系数据库、XML数据库和目录数据库下的

实现。 基于门户系统的单点登录工具 软件环境: j2ee 硬件环境: x86 开发工具: Java JSP 项目描述:国家863项目子课题该课题旨在研究门户环境下如何安全有效的对常见的B/S和C/S应用进行单点登录集成。责任描述:调研企业B/S和 C/S应用的常见认证方式,设计门户环境下B/S和C/S应用单点登录集成工具OnceportalBSSSO1.0,OnceportalCSSSSO1.0/2.0并使用Java和JSP等相关技术将其实现。 可视化快递追踪分析平台- VisualExpress 软件环境: j2ee 硬件环境: x86 开发工具: Java 项目描述:该项目旨在开发一个可以向用户提供基于Google Map的可视化快递单件查询,提供RSS、手机短信、Email等多种单件状态信息订阅,能够利用既往数据进行单件到达时间预测,并对快递公司的整体运营情况进行简单分析的综合快递交互平台。责任描述:任务分配、项目模块划分、项目进度监督以及相关人员的协调(项目组共6人)。需求分析、模块功能的取舍裁定以及

实验五Java项目开发实例

实验五Java 项目开发实例 实验目的: 掌握运用RAD 开发Java 应用程序 目标要求: 1. 掌握运用Visual Editor 创建窗口应用程序 2. 掌握通过JDBC 连接数据库 内容简介: 本章将介绍MyLibrary 的GUI 应用程序。 实验说明: 第一节创建GUI 应用程序 1. 添加JDBC 环境变量 在菜单栏点击“文件-> 新建-> 项目”选择“ JaVa项目”点击“下一步” ” 输入项目名称“ MyLibraryGUI ”,点击“下一步” 。 在Java 设置中选择“ 库”栏,点击“ 添加变量”。在“ 新建变量类路径条目”对话框中点击“ 配置变量”

CIjaUi)SCAPE -DRlVER _JAE - D:\Frograft Fil?≡?IEM ?E? ,点击“确定 ? Sf 鎳变量荚路径条目 选择要添加至构建路径的变量世〕: 雪 ACTIVATlON _JAR - ∕dΛFrogr?m FilesXlBMXRationtl^ " CLOuDSCAPE _I)RlVZR _JAK - D:\Tr C£rsm fιl?s VlBM ?IU 已ECLL P£E_HOME - IAFr o gra m Fιl 配吃量Q 牯科 确定 取消 在“类途径变量”对话框中点击“新建”按钮,会弹出“新建变量条目”对话框。在“名 称”栏中输入“ CLOUDSCAPE_DRIVER_JAR ”,然后点击“文件”按钮,找到 D:/PrOgram FiIeS/IBM/Rational/SDP/6.0/runtimes/base_v6/cloudscape/lib/db2j.jar ,如下图: 点击“确定”。再次点击“确定”。在弹出对话框点击“是”。 在“新建变量类路径条目”窗口中选择 -叵区

java的接口与实例

一、定义 Java接口(Interface),是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。 接口定义的一般形式为: [访问控制符]interface <接口名> { 类型标识符final 符号常量名n = 常数; 返回值类型方法名([参数列表]); … } 二、接口的特点 1、Java接口中的成员变量默认都是public,static,final类型的(都可省略),必须被显示初始化,即接口中的成员变量为常量(大写,单词之间用"_"分隔) 2、Java接口中的方法默认都是public,abstract类型的(都可省略),没有方法体,不能被实例化 3、Java接口中只能包含public,static,final类型的成员变量和public,abstract类型的成员方法 4、接口中没有构造方法,不能被实例化 5、一个接口不能实现(implements)另一个接口,但它可以继承多个其它的接口 6、Java接口必须通过类来实现它的抽象方法 7、当类实现了某个Java接口时,它必须实现接口中的所有抽象方法,否则这个类必须声明为抽象类 8、不允许创建接口的实例(实例化),但允许定义接口类型的引用变量,该引用变量引用实现了这个接口的类的实例 9、一个类只能继承一个直接的父类,但可以实现多个接口,间接的实现了多继承.

三、接口的用法 1、精简程序结构,免除重复定义 比如,有两个及上的的类拥有相同的方法,但是实现功能不一样,就可以定义一个接口,将这个方法提炼出来,在需要使用该方法的类中去实现,就免除了多个类定义系统方法的麻烦。 举例:鸟类和昆虫类都具有飞行的功能,这个功能是相同的,但是其它功能是不同的,在程序实现的过程中,就可以定义一个接口,专门描述飞行。 下图是分别定义鸟类和昆虫类,其都有飞行的方法。 下图定义了接口,其类图如下: 实现代码如下: [java]view plaincopyprint? 1. interface Flyanimal{ 2. void fly(); 3. }

实验五Java项目开发实例

实验五Java项目开发实例 令狐采学 实验目的: 掌握运用RAD开发Java应用程序 目标要求: 1.掌握运用Visual Editor创建窗口应用程序 2.掌握通过JDBC连接数据库 内容简介: 本章将介绍MyLibrary的GUI应用程序。 实验说明: 第一节创建GUI应用程序 1.添加JDBC环境变量 在菜单栏点击“文件-> 新建-> 项目”,选择“Java项目”,点击“下一步”。 输入项目名称“MyLibraryGUI”,点击“下一步”。 在Java设置中选择“库”栏,点击“添加变量”。在“新建变量类路径条目”对话框中点击“配置变量”

在“类途径变量”对话框中点击“新建”按钮,会弹出“新建变量条目”对话框。在“名称”栏中输入“CLOUDSCAPE_DRIVER_JAR”,然后点击“文件”按钮,找到D:/Program Files/IBM/Rational/SDP/6.0/runtimes/base_v6/cloudscape/lib/db2 j.jar,如下图: 点击“确定”。再次点击“确定”。在弹出对话框点击“是”。 在“新建变量类路径条目”窗口中选择 ,点击“确定”。 这样就在MyLibraryGUI项目里添加了Cloudscape 的JDBC驱动。点击“完成”按钮。 2.新建可视类(Visual Class) 在菜单栏选择“文件-> 新建-> 其它-> Java -> 可视类”,点击“下一步”。 在“Java类”窗口,“包”文本框输入mlg.library.gui,“名称”文本框输入“MyLibraryDesktopApp”,“样式”选择“Swing -> 框架”(选择后“超类”变成javax.swing.JFrame),点击“接口”右侧的“添加”,输入ActionListener,点击“确定”。勾选“puli bc static void main(String[] args)”,点击“完成” 在如下图的工作台中,点击1里的下三角箭头,将源代码区域最小化,点击2里的三角箭头使得选用板总是可见,将3处拉

java接口作用及其好处

java接口作用及其好处 接口是实现构件可插入性的关键,可插入构件的关键在于存在一个公用的接口,以及每个构件实现了这个接口。 什么是接口? Java中的接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。 接口的两种含义:一,Java接口,Java语言中存在的结构,有特定的语法和结构;二,一个类所具有的方法的特征集合,是一种逻辑上的抽象。前者叫做“Java接口”,后者叫做“接口”。 在Java语言规范中,一个方法的特征仅包括方法的名字,参数的数目和种类,而不包括方法的返回类型,参数的名字以及所抛出来的异常。在Java编译器检查方法的重载时,会根据这些条件判断两个方法是否是重载方法。但在Java编译器检查方法的置换时,则会进一步检查两个方法(分处超类型和子类型)的返还类型和抛出的异常是否相同。 接口继承和实现继承的规则不同,一个类只有一个直接父类,但可以实现多个接口。 Java接口本身没有任何实现,因为Java接口不涉及表象,而只描述public行为,所以Java接口比Java抽象类更抽象化。 Java接口的方法只能是抽象的和公开的,Java接口不能有构造器,Java接口可以有public,静态的和final属性。 接口把方法的特征和方法的实现分割开来。这种分割体现在接口常常代表一个角色,它包装与该角色相关的操作和属性,而实现这个接口的类便是扮演这个角色的演员。一个角色由不同的演员来演,而不同的演员之间除了扮演一个共同的角色之外,并不要求其它的共同之处。 为什么使用接口? 两个类中的两个类似的功能,调用他们的类动态的决定一种实现,那他们提供一个抽象父类,子类分别实现父类所定义的方法。 问题的出现:Java是一种单继承的语言,一般情况下,哪个具体类可能已经有了一个超类,解决是给它的父类加父类,或者给它父类的父类加父类,只到移动到类等级结构的最

java中接口的定义与实现

java中接口的定义与实现 1、定义接口 使用interface来定义一个接口。接口定义同类的定义类似,也是分为接口的声明和接口体,其中接口体由常量定义和方法定义两部分组成。定义接口的基本格式如下: [修饰符] interface 接口名[extends 父接口名列表]{ [public] [static] [final] 常量; [public] [abstract] 方法; } 修饰符:可选,用于指定接口的访问权限,可选值为public。如果省略则使用默认的访问权限。 接口名:必选参数,用于指定接口的名称,接口名必须是合法的Java标识符。一般情况下,要求首字母大写。 extends 父接口名列表:可选参数,用于指定要定义的接口继承于哪个父接口。当使用extends 关键字时,父接口名为必选参数。 方法:接口中的方法只有定义而没有被实现。 例如,定义一个用于计算的接口,在该接口中定义了一个常量PI和两个方法,具体代码如下: [java] view plain copy public interface CalInterface { final float PI=3.14159f;//定义用于表示圆周率的常量PI float getArea(float r);//定义一个用于计算面积的方法getArea() float getCircumference(float r);//定义一个用于计算周长的方法getCircumference() } 注意: 与Java的类文件一样,接口文件的文件名必须与接口名相同。 实现接口 接口在定义后,就可以在类中实现该接口。在类中实现接口可以使用关键字implements,其基本格式如下: [修饰符] class <类名> [extends 父类名] [implements 接口列表]{ } 修饰符:可选参数,用于指定类的访问权限,可选值为public、abstract和final。 类名:必选参数,用于指定类的名称,类名必须是合法的Java标识符。一般情况下,要求首字母大写。 extends 父类名:可选参数,用于指定要定义的类继承于哪个父类。当使用extends关键字时,父类名为必选参数。 implements 接口列表:可选参数,用于指定该类实现的是哪些接口。当使用implements关键字时,接口列表为必选参数。当接口列表中存在多个接口名时,各个接口名之间使用逗号分隔。 在类中实现接口时,方法的名字、返回值类型、参数的个数及类型必须与接口中的完全一致,并且必须实现接口中的所有方法。例如,编写一个名称为Cire的类,该类实现5.7.1节中定义的接口Calculate,具体代码如下:

java第六次实验报告接口

1、实验题目 体操比赛计算选手成绩的办法是去掉一个最高分和一个最低分再计算平均分,而学校考察一个班级的某科目的考试情况时,是计算全班学生的平均成绩。Gymnastics 类和School 类都实现了ComputerAverage接口,但实现方式不同。 2、程序代码 interface ComputerAverage{ public double average(double x[]); } class Gymnastics implements ComputerAverage{ public double average(double x[]){ int count=; double aver=0,temp=0; for(int i=0;i2) aver=aver/(count-2); else aver=0; return aver; } } class School implements ComputerAverage{ public double average(double x[]){ int count=; double aver=0; for(int i=0;i0) aver=aver/count; return aver; }

Java项目开发实例图书信息管理系统开发及源码

图书信息管理系统 一、系统功能概述: 根据图书信息管理系统的特点,可以将本系统分为2大功能模块,分别为:基础数据维护、系统数据维护。本系统各个部分及其包括的具体功能模块如下图所示: 二、数据库设计: 图书信息表: 字段名说明类型长度及备注 ISBN国际标准书号Varchar(13)主键 typeId图书类型id Int Bookname书名Varchar(40) Writer作者Varchar(21) Translater译者Varchar(30)可以为空 Publisher出版社Varchar(50) Date出版日期Smalldatetime Price价格money 图书类别表: 字段名说明类型长度及备注TypeName图书类型Varchar(20)

用户信息表: 三、系统源代码: Com.zhang.dao:Dao.java //数据库的连接与操作类package com.zhang.dao; import java.sql.Connection; import java.sql.Date; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List;

import com.zhang.model.BookInfo; import com.zhang.model.BookType; import com.zhang.model.Operator; import com.zhang.model.Reader; import https://www.doczj.com/doc/f24603936.html,er; public class Dao { protected static String dbClassName = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; protected static String dbUrl = "jdbc:sqlserver://localhost:1433;" + "DatabaseName=db_lib;SelectMethod=Cursor"; protected static String dbUser = "sa"; protected static String dbPwd = "zhangyong"; protected static String second = null; private static Connection conn = null; //创建数据库连接 private Dao() { try { if (conn == null) { Class.forName(dbClassName).newInstance(); conn = DriverManager.getConnection(dbUrl, dbUser, dbPwd); System.out.println("数据库连接成功!"); } else return; } catch (Exception ee) { ee.printStackTrace(); } } //执行查询 private static ResultSet executeQuery(String sql) { try { if(conn==null) new Dao(); return conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE).ex ecuteQuery(sql); } catch (SQLException e) { e.printStackTrace(); return null; } finally { } }

java接口面试题

接口和抽象类有什么区别? 接口是公开的,不能包含私有的方法或变量,而抽象类是可以有私有方法或私有变量的, 实现接口的一定要实现接口里定义的所有方法,而实现抽象类可以有选择地重写需要用到的方法, 接口可以实现多重继承,而一个类只能继承一个超类,但可以通过继承多个接口实现多重继承, 接口还有标识(里面没有任何方法,如Remote接口)和数据共享(里面的变量全是常量)的作用. 一般的应用里,最顶级的是接口,然后是抽象类实现接口,最后才到具体类实现。 String s = new String("xyz");创建了几个String Object? 两个对象,一个是“xyx”,一个是指向“xyx”的引用对象s。 short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 = s1 + 1; (s1+1运算结果是int型,需要强制转换类型) short s1 = 1; s1 += 1;有什么错? short s1 = 1; s1 += 1;(可以正确编译) 是否可以继承String类? String类是final类故不可以继承。 try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后? 会执行,在return前执行。

10. 常见的runtime exception有哪些?。ArithmeticException, ArrayStoreException, BufferOverflowException, BufferUnderflowException, CannotRedoException, CannotUndoException, ClassCastException, CMMException, ConcurrentModificationException, DOMException, EmptyStackException, IllegalArgumentException, IllegalMonitorStateException, IllegalPathStateException, IllegalStateException, ImagingOpException, IndexOutOfBoundsException, MissingResourceException, NegativeArraySizeException, NoSuchElementException, NullPointerException, ProfileDataException, ProviderException, RasterFormatException, SecurityException, SystemException, UndeclaredThrowableException, UnmodifiableSetException, UnsupportedOperationException NullPointException HashMap与HashTable的区别。

JAVA项目开发实例全教程

光盘内容框架 本书附带光盘内容包括本书源程序、全程视频教学程序、《编程词典》体验版,完整光盘内容框架如图1.1所示。 图1.1 光盘内容框架图 如何使用本书源程序 1、开发及运行环境 本书源程序都是在Windows Server 2003下开发的,程序测试环境为Windows Server 2003。用户只有在Windows Server 2003下正确配置程序所需的运行环境后,才可以使用本书中的源程序。软件开发平台如下: 操作系统:Windows Server 2003; 数据库:SQL Server 2000、SQL Server 2005、MySQL5.0、Oracle10g、JavaDB; 开发环境:Eclipse、MyEclipse、EclipseMe、JDK6、J2ME2.5.2、框架(Spring、Struts、Hibernate)、Tomcat5.5; 分辨率:最佳效果1024×768;

2、源程序用户名和密码 本书程序用户名和密码统一为: 用户名:tsoft 密码:111 3、源程序使用方法 (1)使用本书中源程序时,请将源程序文件夹下的所有文件拷贝到计算机硬盘上,并去掉所有文件的只读属性。 (2)安装Eclipse。 (3)安装数据库系统。其中第01章、第05章、第07章、第08章使用的是SQL Server 2000数据库,第03章使用的是Oracle数据库,第04章使用的是SQL Server 2005数据库,第09章使用的是MySQL数据库,第02章和第06章在运行程序时自动创建数据库,而第10章没有用到数据库。 (4)数据库文件存储于源程序下Database文件夹中。使用SQL Server 2000和SQL Server 2005需要附加数据库,附加方法可参见源程序所在目录下的readme.doc文档。 注意:为了方便读者学习和使用本书中的源程序,特在所有源程序路径下放置了“readme.doc”文档,该文档中提供了数据库的附加方法、配置以及程序详细使用说明。 本光盘根目录下的“源程序使用录像”,以录像的形式帮助读者安装相应的软件和配置对应的数据库。 如何使用《全程视频教学程序》 全程视频教学程序.exe 为本光盘中所有项目全程视频教学程序,通过它可以实现如下功能。 快速调用本书提供的全程视频教学录像 快速调用本书赠送的《编程词典》体验版 浏览整个光盘 查看帮助信息 下面介绍“全程视频教学程序”的使用方法。 (1)将光盘放入光驱,程序会自动运行,如果不能自动运行,请右键单击光盘图标,在弹出的菜单中选择“自动播放”。 (2)打开全程视频教学程序的主界面,如图1.2所示,单击相应按钮,即可执行相应的功能,例如单击“多媒体教学录像”,则打开各章项目录像列表,如图1.3所示。

相关主题
文本预览
相关文档 最新文档