java编程语言语句

2022-09-21

第一篇:java编程语言语句

Java:Java语言深入:究竟什么叫面向接口编程

[ 来源:Java | 作者:Java | 时间:2007-7-20 | 去论坛]

在一个面向对象的系统中,系统的各种功能是由许许多多的不同对象协作完成的。在这种情况下, 各个对象内部是如何实现自己的对系统设计人员来讲就不那么重要了;而各个对象之间的协作关系则成为系统设计的关键。小到不同类之间的通信,大到各模块之间 的交互,在系统设计之初都是要着重考虑的,这也是系统设计的主要工作内容。面向接口编程我想就是指按照这种思想来编程吧!实际上,在日常工作中,你已经按 照接口编程了,只不过如果你没有这方面的意识,那么你只是在被动的实现这一思想;表现在频繁的抱怨别人改的代码影响了你(接口没有设计到),表现在某个模 块的改动引起其他模块的大规模调整(模块接口没有很好的设计)等等。

Booch先生那天谈到Interaction Designer,它就是指做这类设计的人,只不过层次更高一些。我想目前我们的软件设计队伍中,这类人是最缺乏的人才之一。 非接口编程?是不是就是面向过程的编程思想?

1.关于接口的理解。

接口从更深层次的理解,应是定义(规范,约束)与实现(名实分离的原则)的分离。

我们在一般实现一个系统的时候,通常是将定义与实现合为一体,不加分离的,我认为最为理解的系统设计规范应是所有的定义与实现分离,尽管这可能对系统中的某些情况有点繁烦。

接口的本身反映了系统设计人员对系统的抽象理解。

接口应有两类:第一类是对一个体的抽象,它可对应为一个抽象体(abstract class);

第二类是对一个体某一方面的抽象,即形成一个抽象面(interface);

一个体有可能有多个抽象面。

抽象体与抽象面是有区别的。

2.设计接口的另一个不可忽视的因素是接口所处的环境(context,environment),系统论的观点:环境是系统要素所处的空间与外部影响 因素的总和。任何接口都是在一定的环境中产生的。因此环境的定义及环境的变化对接口的影响是不容忽视的,脱离原先的环境,所有的接口将失去原有的意义。

3.按照组件的开发模型(3C),它们三者相辅相成,各司一面,浑然一体,缺一不可。

面向对象是指,我们考虑问题时,以对象为单位,考虑它的属性及方法

面向过程是指,我们考虑问题时,以一个具体的流程(事务过程)为单位,考虑它的实现

接口设计与非接口设计是针对复用技术而言的,与面向对象(过程)不是一个问题

我认为:UML里面所说的interface是协议的另一种说法。并不是指com的interface,CORBA的interface,Java的interface,Delphi的interface,人机界面的interface或NIC的interface。

在具体实现中,是可以把UML的interface实现为语言的interface,分布式对象环境的interface或其它什么 interface,但就理解UML的interface而言,指的是系统每部分的实现和实现之间,通过interface所确定的协议来共同工作。

所以我认为,面向interface编程,原意是指面向抽象协议编程,实现者在实现时要严格按协议来办。也就是Bill Joy同志说的,一边翻 rfc,一边写代码的意思。面向对象编程是指面向抽象和具象。抽象和具象是矛盾的统一体,不可能只有抽象没有具象。一般懂得抽象的人都明白这个道理。 但 有的人只知具象却不知抽象为何物。

所以只有interface没有实现,或只有实现而没有interface者是没有用的,反OO的。

所以还是老老实实面向对象编程,面向协议编程,或者什么都不面向,老老实实编程。

但是我很讨厌讨论这样的术语,不如我们谈谈什么叫面向领导的编程?面向用户的编程?领导和用户有时都很BT,我们就面向BT编程?

第二篇:java编程

in the following code, which is the earliest statement, where the object originally held in e, may be garbage collected:

1.public class test {

2. public static void main (string args []) {

3. employee e = new employee("bob", 48);

4. e.calculatepay();

5. system.out.println(e.printdetails());

6. e = null;

7. e = new employee("denise", 36);

8. e.calculatepay();

9. system.out.println(e.printdetails());

10. }

11.}

only one:

in the following code, which is the earliest statement, where the object originally held in e, may be garbage collected:

1.public class test {

2. public static void main (string args []) {

3. employee e = new employee("bob", 48);

4. e.calculatepay();

5. system.out.println(e.printdetails());

6. e = null;

7. e = new employee("denise", 36);

8. e.calculatepay();

9. system.out.println(e.printdetails());

10. }

11.}

only one:

a.line 10

b.line 11

c.line 7

d.line 8

2:exhibit :

1. public class test (

2. private static int j = 0;

3.

4. private static boolean methodb(int k) (

5. j += k;

6. return true;

6. )

7.

8. public static void methoda(int i) {

9. boolean b:

10. b = i < 10 | methodb (4);

11. b = i < 10 || methodb (8);

12. )

13.

14. public static void main (string args[] } (

15. methoda (0);

16. system.out.printin(j);

17. )

18. )

what is the result?

a.the program prints “0”

b.the program prints “4”

c.the program prints “8”

d.the program prints “12”

3:what is written to the standard output given the following statement:system.out.println(4|7);

select the right answer:

a.4

b.5

c.6

d.7

4:

select valid identifier of java:

select valid identifier of java:

a.%passwd

b.3d_game

c.$charge

d.this

5:设有变量说明语句int a=1,b=0;

则执行以下程序段的输出结果为( )。

switch (a)

{

case 1:

switch (b)

{

case 0:printf("**0**");break;

case 1:printf("**1**");break;

}

case 2:printf("**2**");break;

}

printf(" ");

a.**0**

b.**0****2**

c.**0****1****2**

d.有语法错误

6:in the following pieces of code, which one will compile without any error?

a.stringbuffer sb1 = "abcd";

b.boolean b = new boolean("abcd");

c.c: byte b = 255;

d.float fl = 1.2;

7:

what is the result when you compile and run the following code?

public class throwsdemo

{

static void throwmethod()

{

system.out.println("inside throwmethod.");

throw new illegalaccessexception("demo");

}

public static void main(string args[])

{

try

{

throwmethod();

}

catch (illegalaccessexception e)

{

system.out.println("caught " + e);

}

}

}

choices:

what is the result when you compile and run the following code?

public class throwsdemo

{

static void throwmethod()

{

system.out.println("inside throwmethod.");

throw new illegalaccessexception("demo");

}

public static void main(string args[])

{

try

{

throwmethod();

}

catch (illegalaccessexception e)

{

system.out.println("caught " + e);

}

}

}

choices:

a.compilation error

b.runtime error

c.compile successfully, nothing is printed.

d.inside throwmethod. followed by caught:java.lang.illegalaccessexcption: demo

8:which of the following statements are not legal?

a.long l = 4990;

b.int i = 4l;

c.double d = 34.4;

d.double t = 0.9f.

9:

give the following java class:

public class example{

public static void main(string args[]){

static int x[] = new int[15];

system.out.println(x[5]);

}

}

which statement is corrected?

give the following java class:

public class example{

public static void main(string args[]){

static int x[] = new int[15];

system.out.println(x[5]);

}

}

which statement is corrected?

a.when compile, some error will occur.

b.when run, some error will occur.

c.output is zero.

d.output is null.

10:下面关于变量及其范围的陈述哪些是错的。

a.实例变量是类的成员变量。

b.实例变量用关键字static声明。

c.在方法中定义的局部变量在该方法被执行时创建

d.局部变量在使用前必须被初始化。

11:

public class x{

public object m(){

object o = new float(3.14f);//line 3

object [] oa = new object[1];//line 4

oa[0] = o;//line 5

o=null;//line 6

return oa[0];//line 7

}

}

when is the float object, created in line 3,eligible for garbage collection?

public class x{

public object m(){

object o = new float(3.14f);//line 3

object [] oa = new object[1];//line 4

oa[0] = o;//line 5

o=null;//line 6

return oa[0];//line 7

}

}

when is the float object, created in line 3,eligible for garbage collection?

a.just after line 5.

b.just after line 6

c.just after line 7(that is,as the method returns)

d.never in this method

12:

which is the most appropriate code snippet that can be inserted at line 18 in the following code?

(assume that the code is compiled and run with assertions enabled)

1. import java.util.*;

2.

3. public class asserttest

4. {

5. private hashmap cctld;

6.

7. public asserttest()

8. {

9. cctld = new hashmap();

10. cctld.put("in", "india");

11. cctld.put("uk", "united kingdom");

12. cctld.put("au", "australia");

13. // more code...

14. }

15. // other methods ....

16. public string getcountry(string countrycode)

17. {

18. // what should be inserted here?

19. string country = (string)cctld.get(countrycode);

20. return country;

21. }

22. }

which is the most appropriate code snippet that can be inserted at line 18 in the following code?

(assume that the code is compiled and run with assertions enabled)

1. import java.util.*;

2.

3. public class asserttest

4. {

5. private hashmap cctld;

6.

7. public asserttest()

8. {

9. cctld = new hashmap();

10. cctld.put("in", "india");

11. cctld.put("uk", "united kingdom");

12. cctld.put("au", "australia");

13. // more code...

14. }

15. // other methods ....

16. public string getcountry(string countrycode)

17. {

18. // what should be inserted here?

19. string country = (string)cctld.get(countrycode);

20. return country;

21. }

22. }

a.assert countrycode != null;

b.assert countrycode != null : "country code can not be null" ;

c.assert cctld != null : "no country code data is available";

d.assert cctld : "no country code data is available";

13:

give the following code:

public class example{

public static void main(string args[] ){

int l=0;

do{

system.out.println(“doing it for l is:”+l);

}while(—l>0)

system.out.println(“finish”);

}

}

which well be output:

give the following code:

public class example{

public static void main(string args[] ){

int l=0;

do{

system.out.println(“doing it for l is:”+l);

}while(—l>0)

system.out.println(“finish”);

}

}

which well be output:

a.doing it for l is 3

b.doing it for l is 1

c.doing it for l is 2

d.doing it for l is 0

14:which statements about java code security are not true?

a.the bytecode verifier loads all classes needed for the execution of a program.

b.executing code is performed by the runtime interpreter.

c.at runtime the bytecodes are loaded, checked and run in an interpreter.

d.the class loader adds security by separating the namespaces for the classes of the local file system from those imported from network sources.

15:a class design requires that a member variable should be accessible only by same package, which modifer word should be used?

a.protected

b.public

c.no modifer

d.private

16:character流与byte流的区别是

a.每次读入的字节数不同

b.前者带有缓冲,后者没有

c.前者是块读写,后者是字节读写

d.二者没有区别,可以互换使用

简答题

17:找出两个字符串中最大子字符串,如"abractyeyt","dgdsaeactyey"的最大子串为"actyet"

18:假设你有一个用1001个整数组成的数组,这些整数是任意排列的,但是你知道所有的整数都在1到1000(包括1000)之间。此外,除一个数字出现两次外,其他所有数字只出现一次。假设你只能对这个数组做一次处理,用一种算法找出重复的那个数字。如果你在运算中使用了辅助的存储方式,那么你能找到不用这种方式的算法吗?

19:到底在哪里使用cascade="..."?

20:使用tomcat部署应用程序 遇到过java.lang.outofmemoryerror 吗?如何解决的。

21:请写一个java程序实现数据库缓冲池的功能?

22:有200个正整数,且每个数均在1000至9999之间。请编制函数,其函数的功能是:要求按每个数的后三位的大小进行升序排列,然后取出满足此条件的前10个数依次存入数组bb中,如果后三位的数值相等,则按原先的数值进行降序排列。

23:anonymous inner class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?

24:找出字符串a中包含的字符可以进行的所有不同组合。例如:abccd中,ab,ac,bc,cc,abd等都是可能的组合。

25:下面的代码在绝大部分时间内都运行得很正常,请问在什么情况下会出现问题?问题的根源在哪里?

import java.util.linkedlist;

public class stack {

linkedlist list = new linkedlist();

public synchronized void push(object x) {

synchronized(list) {

list.addlast( x );

notify();

}

}

public synchronized object pop()

throws exception {

synchronized(list) {

if( list.size() <= 0 ) {

wait();

}

return list.removelast();

}

}

}

第三篇:Java语言课程设计

设计目的:

1、复习、巩固Java语言的基础知识,进一步加深对Java语言的理解和掌握;

2、课程设计为学生提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际有机的结合起来,锻炼学生的分析解决实际问题的能力。提高学生适应实际,实践编程的能力;

3、培养学生在项目开发中团队合作精神、创新意识及能力。

设计要求:

1、对系统进行功能模块分析、控制模块分析正确,符合课题要求,实现相应功能;可以加以其他功能或修饰,使程序更加完善、合理;

2、标识符命名遵循Java命名规范,代码多加注释;

3、注意各种可能遇到的异常处理,注重提高程序运行效率;

4、系统设计要实用,编程简练,可用,功能全面;

5、尽量使用图形界面实现,要符合日常软件使用规范来设计菜单和界面。

6、 说明书、流程图要清楚;

7、记录设计情况(备查,也为编写设计说明书作好准备);

8、 要求采用模块化程序设计方法,及锯齿型书写格式(缩进格式),要求上机调试通过和按设计报告格式;

9、上交课程设计软件代码、课程设计报告交老师保存。另外要用A4打印一份上交。

设计时间:

2012年-2013年第一学期 第10周

设计方式和安排:

设计方式:学院实验室上机

安排:布置题目;中期检查;验收

考核内容和方式: 课程设计结束时,要求学生写出课程设计报告(附源程序),可运行的软件系统;

课程设计成绩分两部分,设计报告占30%,设计作品占70%。按照优秀、良好、中、及格,不及格五级给予成绩。

设计题目:(要求每个学生在下面题目中选择一个适合自己且感兴趣的题目独立完成,若需新知识一定要去查资料,如果自己有另外的感兴趣的项目,可以自己设计,但一定不能是随便下载一个应付,否则将定为不及格,且不给补答机会,切记)

1、猜数游戏 功能要求:计算机产生随机数,猜中即胜,猜不中,提示是大了还是小了,继续猜,直至猜到,给出所用时间和评语。 界面要示:用字符界面实现、也可用图形界面实现。

2、学生成绩管理

功能要求:

1) 输入n个同学的学号,姓名,m门课程成绩。

2) 计算出平均成绩。以平均成绩降序输出成绩表。

3) 输出全组各科平均分,最高分和最低分。

4) 输入姓名查询成绩 界面要示:用字符界面实现、也可用图形界面实现。

5)能连接数据库并实现查询、增、删、改等功能(此项功能作为可选项,可以不要)。

3、高级计算器模拟程序

功能要求:该程序显示GUI用户界面,能实现整数的加、减、乘、除、乘方、立方、n次放、开平方、开n次方、倒数、三角函数、反三角函数运算。 界

面基本要求:用图形界面实现。

4、画随机的圆

功能要求:实现简单的动画。具体要求:自动出现由小到大变换的圆,位置与颜色随机,变到150直径时擦除,重新再出现圆;变换速度有HTML文件传入的参数控制(控制sleep时间)。 界面要求:用Java Applet实现。

5、用菜单和按钮来控制绘图

功能要求:实现简单绘图功能,具体要求:画直线,画空心或实心椭圆、画空心或实心矩形、画多边形(图形的位置和大小可在程序中设定)。 界面要求:用图形界面实现。可参考图

2、图3和图4。

6、聊天小程序

功能要求:使用图形用户界面,能实现一个聊天室中多人聊天,可以两人私聊,可以发送文件。 提示:使用socket通信

7、万年历带日程提醒功能

功能要求:使用图形用户界面,能显示月历,用户可以更改月份和年份,带有日程提醒功能。用户可以向前翻页查询前一个月的日期,也可以向后翻页查询下一个月的日期。定时提醒:用户可以针对某一天来添加,删除和编辑这一天的日程提醒信息,当系统时间和提醒时间相吻合时,给出具有提示信息的对话框。查询信息:用户可以查询到某个月的所有的提示信息。能够显示系统时间。能够设置闹钟。能够查询若干国际大城市(分布在不同时区)的时间。

8、电子英汉词典

功能要求:能够编辑词典库中的信息,能够实现英译汉,汉译英(要考虑一词多义)。

9、加密与解密

功能要求:采用图形用户界面,给定任意一个文本文件,进行加密,生成另一个文件;对加密后的文件还原。

10、销售管理系统

功能要求:1)产品类别信息管理:对客户的基本信息进行添加、修改和删除。2)产品信息管理:对产品的基本信息进行添加、修改和删除。3)供应商信息管理:对供应商的基本信息进行添加、修改和删除。4)定单信息管理:对定单的基本信息进行添加、修改和删除。

11、计算带变量的数学表达式的程序

功能要求: 1)由用户输入一个表达式,求出其计算结果后显示。 2)允许在表达式中出现常用的数学函数,如绝对值、取整、三角函数、倒数、平方根、平方、立方等。 3)要能够判断出表达式中的变量名及其个数,按照变量名自动弹出/出现输入界面逐个让用户输入变量。 4)尽量使用图形界面实现,要符合日常软件使用规范来设计菜单和界面。5)如果无法实现图形界面,则在命令行方式下也需要提供菜单,方便用户操作。

12、学生基本信息管理

功能要求:1)需要管理的学生信息有:学号、姓名、性别、出生日期、政治面貌、家庭住址、电话、宿舍号。2)实现查询、增、删、改等功能。3)存文本本件或者使用数据库。

13、抽奖程序

功能要求:1)能够在电脑上抽奖,分别抽取4等奖、3等奖、2等奖、1等奖、特等奖,设定每种奖项的人数后分别一次抽取每个奖项。2)按给定的总人数以序号或电话号码为抽奖依据。3)要求屏幕上能够显示抽奖的号码滚动过程,按“停止”按钮给出抽奖结果。 4)要求漂亮的图形用户界面。

14、度量衡换算器

功能要求:1)网上去找几个度量衡换算器现成软件,综合其优点,编写出源代码,实现常见长度、面积、容积(体积)、温度(华氏/摄氏)的换算。2)要求漂亮的图形用户界面。

15、个人财务系统

功能要求:1)管理个人每月收支。包括资金来源、数目,各项平时主要支出款项和其它支出,月平均支出,支出将要超标提醒,交款提醒等等。2)要求用加密了的文本文件或数据库保存结果,每次启动时调入上次结果。3)图形界面。

16、学生学籍管理

主要描述: 调查学校学生处、教务处,设计一个学籍管理系统。要求: ①建立学生档案,设计学生入学、管理及查询界面; ②设计学生各学期、学年成绩输入及查询界面; ③根据各总成绩,查询、输出学生学籍管理方案(优秀、合格、试读、退学); ④毕业管理; ⑤系统维护:如数据安全管理(含备份与恢复)、操作员管理、权限设置等; 主要功能模块 实现学生基本情况的录入、修改、删除等基本操作。 对学生基本信息提供灵活的查询方式。 完成一个班级的学期选课功能。实现学生成绩的录入、修改、删除等基本操作。 能方便的对学生的个学期成绩进行查询。 具有成绩统计、排名等功能。 具有留级、休学等特殊情况的处理功能。

17、招聘求职管理系统

主要描述: 编程模拟招聘/求职,设计两个类:企业类(招聘);求职者类;职位需求类

包括下列功能模块: 1.发布招聘需求信息: 2.增加、修改删除求职简历; 3.删除过期招聘信息: 4.查询招聘/求职信息: 5.职位签约;

18、教务辅助管理系统

主要描述: 1. 主要的数据表 教师基本信息表,课程表,教室资源表等

2.功能模块 1) 对上课教师基本信息进行管理。 2) 对全院开设的课程进行管理。 3) 录入教师基本上课信息。 4) 实现自动排课功能。

注意:课程设计报告:(保存在word 文档中,文件名要求 按照"姓名-学号-课程设计报告"起名,如文件名为"张三-001-课程设计报告".doc )按照课程设计的具体要求建立的功能模块,每个模块要求按照如下几个内容认真完成;

其中包括:

a)需求分析:

在该部分中叙述,每个模块的功能要求

b)概要设计

在此说明每个部分的算法设计说明(可以是描述算法的流程图),每个程序中使用的存储结构设计说明(如果指定存储结构请写出该存储结构的定义。

c)详细设计

各个算法实现的源程序,对每个题目要有相应的源程序(可以是一组源程序,每个功能模块采用不同的函数实现)

源程序要按照写程序的规则来编写。要结构清晰,重点函数的重点变量,重点功能部分要加上清晰的程序注释。

d)调试分析

测试数据,测试输出的结果,时间复杂度分析,和每个模块设计和调试时存在问题的思考(问题是哪些?问题如何解决?),算法的改进设想。

4. 课设总结: (保存在word 文档中)总结可以包括 : 课程设计 过程的收获、遇到问题、遇到问题解决问题过程的思考、程序调试能力的思考、对java程序设计这门课程的思考、在课程设计过程中对本课程的认识等内容。

第四篇:Java编程学习顺序

1. 第一阶段 掌握要点:Java语基础知识。包括异常、IO流、多线程、集合类、数据库。

(切记基础知识一定要时时刻刻巩固)eg:Java编程思想、Java2 核心技术

2. 第二阶段掌握要点:Tomcat,毋庸置疑,Tomcat为学习web服务首选。而应用服务器

目前主要有:jboss , weblogic . websphere. 而Tomcat和jboss是首选。

3. 第三阶段掌握要点:Java网络编程。包括:SocketRMLHTMLJSPJavaBean

Servlet.开发工具:Myeclipsedreamweaver顺序:

1、学习web 知识:htmldreamwavejavascript

2、先学习jsp设计、Javaservlet编程

3、学习jdbc数据库编程

4、学习 ,他和学习ejb可以结合起来《《精通ejb》》学习ejb设计模式和看代码(最重要)《jsp2.0 技术手册》 在jsp上不要花太多时间,在时间放在servlet多一些

4. 第四阶段 掌握要点:流行MVC 架构和Java对象持久化技术。包括struts

SpringHibernate JSF.学习过程:先学Struts,再学习Hibernate,最后学习Spring

第五篇:关于Java不适做主要编程教学语言

关于Java不适做主要编程教学语言.txt38当乌云布满天空时,悲观的人看到的是“黑云压城城欲摧”,乐观的人看到的是“甲光向日金鳞开”。无论处在什么厄运中,只要保持乐观的心态,总能找到这样奇特的草莓。最近有一篇文章,说两位退休的美国大学教授上书反对将Java作为编程教学语言,对此我表示高度认同。对于Java,我并不反感,而且相信它在工业应用中的地位不可取代,但是,我一直反对将Java作为主要的编程教学语言,因为教学语言承担着与生产语言不同的任务,它必须能够帮助学生奠定坚实的技术基础,塑造核心技术能力。在这方面,Java不能够胜任。

1990年代中期以前,美国的计算机编程入门教育以Pascal为主。我的一位美国程序员朋友至今还怀念他与Pascal为伴的高中年代。到了1990年代中后期,由于ANSI C语言“纠正”了早期C语言的一些不适合编程教学的问题,因此成为很多美国高中和大学编程入门课的教学语言。1998年,美国指导编程教学的一个协会推荐将C++作为入门教学语言,在当时引起很大的反响,认为是编程教育方面的一个重要进步。但遗憾的是,C++非常复杂,而当时C++语言的教育体系又非常不成熟,因此很多地方的教学方法不得当,把学生迅速拖入无边无际的语言细节当中,引起了学生痛苦的抱怨。大约经过两三年不成功的实践之后,在本世纪初,美国计算机教育界普遍接受Java作为编程入门语言。此后在很短的时间里,Java迅速成为美国高中和大学里的首选编程教学语言,老师教得轻松,学生学得甜蜜,所以这个局面一直持续到现在。

而在中国,BASIC语言及其变体一直到1990年代中期都还是“算法语言”课程的主要教学内容,充分折射出当时中国计算机教学与工业应用之间的脱节。只是到了1990年代后期,C语言才确立了在中国工科计算机编程入门教育中的主流地位。到现在为止,大部分工科学生都“必修”“C程序设计语言”这门课程。不过事实上,根据我的了解,这门课程的总体教学质量相当糟糕,大部分学生可以说是满怀希望而来,两手空空而去。在这种情况下,中国高校计算机编程入门教育已经开始悄悄向Java过渡了。据我所知,有一些名校已经开始将Java设为编程入门课程,并且认为这是与国际接轨进步标志。

在我的朋友圈子里,大多数真正的一线开发者和技术领导者,对于将Java作为入门教学语言的“发展方向”都持质疑态度。他们中很多人目前主要的工作都集中在Java上,因此这种态度并非来自所谓语言宗教情绪,而是来自他们招聘和实际工作中的感受。他们发现,只学习Java、C#、VB等“现代”编程语言的学生,精于拿来主义,长于整合和快速开发,思维活跃,生产效率高,让他们来做直截了当的、有章可循的、非研究性和非创新性的工作比较合适,但是基础不扎实,对计算机系统的理解薄弱,处理细节和矛盾的能力不足,一旦他们熟悉的套路用不上,则缺少自主分析问题、解决问题的知识、能力和经验。

今天看到两位教授的“上书”,才知道原来他们也有同感。只不过这两位教授说的更直白,直接反对将Java作为入门编程语言,而是冒天下之大不韪,公然号召开历史倒车,要求退回到C、C++、Lisp和Ada去。

我是支持两位教授的。我认为,Java、C#、VB和其它虚拟机之上的语言都不适合作为专业程序员的入门教学语言。在中国还非常缺乏具有创新和独立解决问题的高水平程序员的局面下,我们应该认真做好的事情是努力提高C/C++的教学质量,而不是图快活转向Java。

教学语言的选择是至关重要的事情。作为大多数学生第一种需要认真学习理解的编程语

言,教学语言将会成为他们中间很多人的“编程母语”,深深地烙印在学生的思维方式中。这个编程母语要帮助学生破除计算机和软件的神秘感,建立对于程序的基本认识和对计算机模型的最初理解。在后续专业基础课和专业课程的学习中,这门编程语言应该作为主要工具贯穿始终,帮助学生认识计算机系统,掌握算法与数据结构技能,熟悉操作系统概念,理解编译原理知识,理解软件抽象及软件设计的基本思想,完成一定量的课程及课外项目实践,建立正确的软件开发实践习惯。不但如此,这种教学语言必须是工业界的主流语言,否则学生学非所用,学习动力无法保证。

按照这个标准来衡量,Java适合于作为主要的编程教学语言吗?我不这么认为。首先,我承认Java在教学上有一些优势,比如其开发环境和工具支持非常成熟,有助于培养学生正确的编程习惯;Java是当今第一工业主流语言,标准类库非常全面,可以迅速地开发具有实际用途的程序,有助于激发和保持学生的兴趣;而在数据结构、算法、编译原理的教学方面,Java也毫不落于下风,在软件抽象设计(面向对象)方面,Java还有着明显的优势;特别是在并行编程的教学方面,Java 1.5 concurrency包提供的优势是压倒性的。尽管有如上这些优势,但Java作为教学语言存在着一个致命的缺陷,即它是一个虚拟机语言,这一点就足以把它从教学语言的名单上去掉。

作为一个虚拟机语言,Java对开发者隔绝了下层的真实系统,从而构造了一个近乎完美的环境,在这个环境里,世界上只有一种机器,一个操作系统,内存是无限的,所有的机器都具有相同的字节顺序和一致的类型约定,为了设计的优美而牺牲速度永远是正义行为,从反射到运行时自动加载,从完备的容器类到统一字符编码,一大堆漂亮的功能都可以不费吹灰之力唾手而得。要是这个世界上每台计算机都是一个Java机器,每项编程任务都可以在这样一个近乎完美的环境中开发,那毫无以为,Java是最合适的编程教学语言。但是事实上呢?这样一个完美的环境是Java力量的源泉,但这却不是真实的世界。在真实世界里,我们可能面对非常原始的环境,苛刻的运行时限制,复杂多变的系统环境,令人窒息的细节魔鬼,要对付这些东西,需要开发者具有在应对复杂性,自己构造环境,在诸多限制条件下寻找解决方案的能力。而这种能力,被无数人无数次地证明是软件开发、特别是软件创新的核心能力。把Java作为教学语言,恰恰会导致这种核心能力的缺失。除此之外,如果耐心观察的话,不难发现,几乎在任何软件领域里的创新性成果都首先是由C/C++语言实现的,原因很简单,Java是站在C/C++基础之上的,只有C/C++先把大路趟开,Java才能够顺势而上。

相反,尽管C/C++语言作为教学语言有很多的不足,比如不同环境下开发模式差异大,细节繁多,开发效率低,容易犯错,测试和调试困难,学习者难以保持动力,等等,但是这些问题都可以解决。而C/C++的关键优点,是能够让学习者在真实的计算机抽象上、在大量的细节和矛盾中学会思考,学会解决问题,学会了解真实的系统,知轻重,明生死,从而建立核心能力。掌握了C/C++语言,再去学习和理解Java、C#、Python、Ruby和其它语言,就比较容易达到更高的境界。反之,如果习惯了舒舒服服躺在完美世界里当阔少,那就很难有勇气面对真实的世界。当然,很多开发者认为,现在更重要的能力是理解业务、整合现有资源的能力,而不是处理底层细节的技术。这种说法放在个人身上没有问题,但是不能成为整个编程教育的指导思想。我们需要各个层面上的人才,精通业务和设计的架构师固然很重要,但能够在底层作出创新成果的编程高手实际上更为稀缺和珍贵,很多时候也能够创造更大的价值。而且,更重要的是,一个精通系统知识的开发者在往上走的时候不会遇到大的障碍,而一个只知道拼装组合的“高级设计师”,往往连往下看的勇气都没有。

Java的另外一个问题,是其所倡导的繁琐设计风格,一个对象套一个对象,一个对象叠一个对象,概念之间彼此横七竖八地互相依赖,人为制造出一大堆貌似精美、实则累赘的所谓设计。这个问题我已经批评过多次,并且相信这股歪风一定会最终被人们抛弃,Java最终会归于质朴。但是在这一天到来之前,Java对于初学者来说,很可能蒙住他们的双眼,使他们看不到软件设计中最可贵的简单性和优美的统一,体会不到数据和程序的统一。在这一点上,C表现的非常好,而C++如果教学得体,可以做的更好。

当然,这并不是为现在的C/C++教学辩护。恰恰相反,从我了解的情况来看,目前普通高校的C/C++教学质量非常令人担忧。学生学不会,而且越学越没有兴趣,老师则感到教起来很棘手,迫于现实情况往往选择敷衍了事。反而是教Java,无论如何学生还能学到一点东西,对就业也有直接的帮助。至于学生的核心能力确实,发展后劲不足等问题,就让他们在现实工作中自己解决吧。坦率地说,这种想法也很有道理。不过,从教学角度来说,我认为老师们还是应该积极考虑如何提高C/C++的教学质量。毕竟学生阶段是十分宝贵的,基础不在这个时期夯实,将来想弥补,就算不是完全不可能,也将付出十倍的代价。本着对学生职业生涯的负责态度,还是应该帮助学生达到这个阶段应该达到的目标。在两位教授的公开信里,也充分表达出这个意思。

我赞成的编程教育过程,应当是以C/C++(基本上是C)为主线,贯穿起算法、数据结构、系统原理、编译和数据处理、软件设计和组件技术等关键知识领域,让学生能够从根本上理解现代软件系统的原理和构造,并通过有效的练习建立正确的软件设计观念和良好的工程实践习惯。在这个基础上,无论将来是深入学习C++,还是进入Java的繁荣世界,或者拥抱Python、Ruby,甚至于走向Web开发,都会心领神会,势如破竹。

上一篇:我是谁1600字作文下一篇:11字春联集锦