java程序员面试建议

2024-07-08

java程序员面试建议(精选6篇)

篇1:java程序员面试建议

考官:java中的反射机制是什么,有什么作用啊?

要点:

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的以及动态调用对象的方法的功能称为java语言的反射机制。Java反射机制主要提供了以下功能:在运行时判定任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判定任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。

问题:Java为什么要引入异常处理机制

要点:

程序执行时经常会出现除零溢出、数组越界等运行错误,影响程序的正常执行。错误及异常是不可避免的,一个好的应用程序,在满足用户要求的各种功能的同时,还应具备能预见程序执行过程中可能产生的各种异常的能力,并能为异常情况给予恰当处理。在Java语言中,这种技术就是异常处理 Java语言通过面向对象的异常处理机制来解决运行期间的错误,可以预防错误的程序代码或系统错误所造成的不可预期的结果发生。减少编程人员的工作,增加了程序的灵活性,增加程序的可读性和健壮性.问题:什么是JAVA多线程机制

一.什么是多线程?

多线程是指同时存在几个执行体,按照不同的执行线索共同工作的情况。

二.什么是程序,进程和线程?

程序是一段静态的代码,是应用软件执行的蓝本。

进程是程序的一次动态执行过程,它对应了从代码加载,执行至执行完毕的一个完整的过程。这个过程也是进程本身从生产,发展至消亡的过程。

线程是比进程更小的执行单位。

区别:一个进程在其执行过程中,可以产生多个线程,形成多条执行线索,每条线索即每个线程也有其从生产,发展到消亡的过程。

三.线程的生命周期

线程的生命周期可分为四个阶段,新建,运行,中断和死亡。

新建:当一个Thread类或者其子类的对象被声明并创建时,新生成的线程就处于新建装他,有了相应的内存空间和其他资源。

运行:线程被创建之后,就有了运行的条件了,一旦轮到它来享用CPU资源时,便可以摆脱创建它的主进程开始了自己的生命周期。

中断:一个正在执行的线程可能被认为的中断,让出CPU使用权,进入阻塞状态。线程阻塞时,不能进入排队队列,只有当引起阻塞的原因被撤销时,线程才可转入就绪状态,重新进入排队队列中,等待CPU资源,以便从中止处开始运行。

死亡:线程死亡有2种情况,一是正常运行,完成了它全部的工作。另一种是线程被提前强制终止。死亡状态下的线程,释放了被分配的内存。

四.线程的优先级

在java系统中,线程调度依据优先级基础上的“先到先服务”原则。

Thread类的setPriority(int a)方法可设置线程的优先级,取值有Thread.MIN_PRIORITY,Thread.MAX_PRIORITY, Thread.NORM_PRIORITY三种,默认级别为Thread.NORM_PRIORITY.五.如何实现多线程

Java编程中实现多线程有两种方式:一是继承Thread类,用其子类创建线程,二是实现Runnable接口

六.线程同步

当两个或者多个线程同时访问一个变量,并且一个线程需要改变某个变量时,需要对修改数据的方法修饰为synchronized.当一个线程在使用同步方法时需要用到某个变量,而此变量又需要其他线程修改后才能符合本线程需要,此时用wait(),让本线程等待。

其他线程如果在使用同步方法时不需要等待,那么当它使用完该方法后,用notifyAll()方法通知所有由于使用该同步方法而处于等待的线程结束等待,(notify()方法只能通知第一个处于等待的线程结束等待)

七.Interrupt()方法

一个线程在run方法执行完后便会自动消灭,如果想在run方法执完毕前就消灭线程,可以使用interrupt()方法,此时该线程会捕获InterruptedException异常,在处理该异常的语句里告诉线程立刻结束run方法的执行。

问题:java多线程使用cup是什么机制

要点:java获得cup使用权根据优先级,高优先的先执行,这个和操作系统是一样的,但是优先级别的控制是通过虚拟机控制的,然后在执行的时候是通过操作系统时间片的机制,多线程java有自己的调度算法,虚拟机会自动调度执行的线程,而操作系统处理的是cpu的执行,其实两者都有调度算法,xp的机制我想和

1、main方法是怎么写的public static void main(String [] args){}

2、变量的命名规则是怎么样的?

采用驼峰命名法,见名知意,以小写字母开始。

常量命名:全部大写。

方法命名: 小写字母开始,驼峰命名。

类命名:首字母大写。

3、if„else„和写两个if 有什么区别

if„else„只执行其中一条,写两个if,两个都要执行

4、在JAVA中直接写浮点常数,默认是什么类型?

默认是double类型

5、什么是标识符?它的命名规则是什么?

凡是可以命名的地方都叫标识符。

标识符有两种:

1、系统标识符(关键字);

2、用户标识符

以字母、数字、下划线、$复活组成,不能以数字开头

6、什么是变量?

变量是命了名的内存空间,并且空间的值是可以改变的。

7、JDK与JRE分别是什么?

JDK叫java开发工具集,包括编译环境、运行环境、调试环境以及基础类库。

JRE叫java运行环境,包括虚拟机、核心类库、以及健接文件。

8、try-catch-finally三个基本块的作用?catch里的代码是干什么的?

try块表示此处代码可能引发异常

catch块捕获try块的异常

finally块通常用于资源的回收,连接关闭,清理工作等

try-catch-finally不能单独存在,try块后必须跟catch或finally

catch或finally前必须跟try块

9、继承类和实现接口分别怎么做?

继承用extends关键字继承

定义接口用interface关键字

实现接口用implements10、如何去获得字符串的长度?

调用String类的length()方法

11、Java的基本数据类型有哪些?

int 4字节 整型

byte 1字节 整型

char 2字节 整型

short 4字节 整型

long 8字节 整型

double 8字节 浮点

float 4字节 浮点

boolean 布尔

12、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递

值传递,Java里没有引用传递

13、列出至少5个最常见到的runtime exception并描述在什么情况下出现

IOException在未找到文件时会抛出

NullPointerExecption在对象引用指向空时会抛出

ArrayIndexOutOfBoundsExecption在数组下标越界时会抛出

NumberFormatException在字符串不能转换成数字时会抛出

ArithmeticException在分母为零时会抛出

14、ArrayList和Vector的区别

vector是线程安全的,所以效率低,Arraylist是线程不安全的,但是效率高。

15、在IO中字节流和字符流的父类是什么?

字节流父类是InputStrean和OutputStream

字符流父类是Reader和Writer16、什么是包?定义包有什么好处?

文件夹。

好处:

1、可以有效的组织相关类;

2、可以做到信息的隐藏。

17、怎么样知道磁盘一个目录中有哪些文件?

1、File对象.list()方法;

2、File对象.listFile()方法。

18、如何获得一定范围的随机整数?

x+Math.random()*y 其中x是位移数,确定最小范围,y是放大系数,确定最大数。

(x-y)*Math.randon()+y19、如何获得java当前的工作目录

使用System.getProperty(“user.dir”)能够获得当前工作目录的字符串地址。

20、怎么样判断一个异常类是checked异常还是unchecked异常?

判断当前异常类,是否是RuntimeException的子类,如果是,则是运行期异常否则是编译期异常。

21、log4j一共有几个级别?分别是哪些?级别的高低有什么样的区别.log4j有五个级别:

DEBUG:调试

INFO:信息

WARN:警告

ERROR:错误

FATAL:崩溃

21、静态变量和成员变量应该怎么访问?

静态变量可以通过对象.和类名.的方式访问

成员变量通过对象.的方式访问

22、如何将一个字符串转成一个基本数据类型

Int x = Integer.parselint(“32”);

Double d = Double.parseDouble(“4.5”);

23、如何让JFrame的初始位置居中(在不同的分辨率中)

窗体对象.setLocationRelativeTo(null);

24、谈谈集合的作用

方便对数据进行 存储,检索,操作,传输。

25、类的修饰符能不能是private、static、protected?

内部类可以,因为内部类相当于外部类的属性

26、Try块中是否所有的语句都一定会执行,为什么?

不是,一但try中发生了异常,那么异常发生处下面的语句就不会执行,专区catch块执行

27、什么时候用继承,什么时候用接口?

当需要重用属性和方法时使用继承

当只需要重用方法时用接口

28、finally是不是什么时候都会执行?

是当虚拟机关闭,System.exit(0),finally内容不会执行;

29、什么是主线程?

当main()方法执行时会产生主线程,1最先开始 2最后结束

3产生其他子线程

4回收资源

30、进行IO流操作时,如果操作的文件不存在会发生什么情况?

读取流在文件不存在时,会抛出文件未找到异常

写入流在文件不存在时,会创建文件,但如果该文件所在目录不存在,同时会抛出文件未找到异常

31、IO流操作的步骤是怎么样的?

创建流 操作流 关闭流

32、finally的作用是什么?

无论是否有异常都会执行的代码块,一般用于资源回收,比如流动关闭、数据库的关闭

34、当一个线程进入一个对象的一个同步方法后,能否进入其它非同步方法? 么?一般在什么时候使用? 可以,但不能进入其他同步方法。

33、try {}里有一个return语句,那么紧跟在这个try后的finally {}里的代码会不会被执行,什么时候被执行?

Finally{}在程序开启时只执行它本身里的代码。

会执行,在方法返回前执行

35、如何启动线程,它直接调用run()方法有什么区别?

启动线程调用start方法,用start方法启动线程后,是多个线程同时进行,使用run()是普通方法,是不会产生新的线程,是单线程。

36、数组有没有length()这个方法? String有没有length()这个方法?

数组有length属性,String有length方法

37、GC是什么? 为什么要有GC?

GC叫做垃圾回收器,为了回收内存不再使用对象,释放内存空间,避免内存溢出。

38、线程同步化会带什么样的结果?

1:可以使数据安全

2:效率会降低

39、什么是线程安全?

当两个或两个以上线程,访问同一个资源时,为了保证数据的安全,只允许同一时间

只能有一个线程访问该资源。

40、服务器类有一个while循环,能否直接while(true)?

可以,但这样缺乏灵活性,没有办法控制循环结束,最好使用boolean变量来控制

循环的运行和结束。

41、java帮助文档是如何生成的?

Javadoc.exe42、什么时候类名和文件名必须一致?

当类的定义为Public时,类名必须与文件名保存一致

43、如何将实现包装类和基本数据类型转化?

包装转基本1:包装类对象.xxxvalue(值);2直接赋值

基本转包装1: Integer = new Integer(90);2直接赋值

44、类InputStream中方法read()的返回值是什么?读出的是什么?

Read()返回的是int,读取的数据

read(byte[])返回int 当前读取的字节数

45、如果一个类实现一个接口,可不可以不实现接口里定义的所有方法?

可以,但这个类只能是抽象类

46、构造方法和方法有什么区别?构造方法能不能被重载,能不能被重写?

构造方法和雷鸣相同,构造方法没有返回类型,在对象创建时,被调用。

构造方法可以重载,不能重写。

47、请列举switch()括号中能接受的所有数据类型。

Char byte short int48、GUI的布局管理器常见的有哪几种?

绝对布局

边界布局管理器

卡片布局管理器

流布局管理器

网格布局管理器

49、断言有什么作用?

断言是一个布尔表达式,当表达式为真继续执行,表达式为假,则抛出一个断言错误,主要用于测试。

50、String和StringBuffer的区别?

String具有长度不可变的特性,当String做添加、删除修改时,会产生一个新对象

StringBuffer是String类的一个改进版,是缓冲区的一个对象,当对该对象进行字符的添加、修改时,不会产生新对象。

51、接口里方法修符是什么?

Public abstract52、接口里可以定义变量吗?

不行,就可中的变量修饰符是public static final 只能定义常量

53、说几个String常用的方法

String.length()split()substring()equals()indexOf()lastundexOf()

54、在Dos界面下如何编译并执行Java程序?

Javac 文件名

Java 类名

55、创建一个线程有几种方法?

集成 thread 类

实现Runnable接口

56、项目开发的流程是怎么样的?

市场调研,需求分析,概要设计,详细设计,编码,测试,维护。

57、java语言的特点是什么?

简单,面向对象,分布式,健壮,可移植,解释性,安全,多线程,垃圾回收

58、main方法中有个参数String[] args。这个参数的值是由谁传递给它的。执行java类时,由控制台传入

59、java中采用什么字符编码集?char类型能不能放入一个中文字? Unicode 该字符集一个字符有2个字节。,char是两个字节可以放一个中文,因为中文是两个字节

60、byte的取值范围

-128~+127(-2的7次方to2的7次方-1)

61、GET方式和POST方式提交时,流有什么不同?

GET和POST是HTTP协议请求服务器的两种方式

GET方式页面参数,是附加在URL后面。/login?userName=XXX

POST方式,页面的参数是放在流最后的其他x86平台的差不多,

篇2:java程序员面试建议

一些Java软件工程师求职者们,可能因为种种原因,对Java语言及其深层原理掌握不牢固,以至于在面试中犯各种错误。本期乔布简历小编将为大家带来的主题是java程序员面试经验,一起来了解一下java程序员面试宝典吧~

关键词:java程序员面试宝典,java程序员面试经验

以下是一些java程序员面试需要注意的地方:

1、对于此类岗位而言,具体的项目是用人单位招聘时最看重的参考因素。即便是没有工作经验的应届生,也要准备可作为自己能力参考的具体作品。如果从未参加过任何项目,可以准备自己在相关领域的课程设计,如有必要还可以将其修改为完整的项目。对于这份具体作品,求职者要有相当的了解。通过求职者对于该作品的讲解,招聘官会判断求职者的技术能力到底如何。

2、Java程序员要求掌握的技能会比较多,求职者在简历上可以分类依次列举出自己所掌握的专业技能,有证书的列出自己所持有的证书名称。在面试的时候,可以对自己所掌握的技能做出介绍,并辅以实例证明,这样会更具有说服力。

3、基础很重要,不要生疏了。不管应聘什么程序员岗位,基础永远都是最重要的。只有有了踏实的基础,再辅以较好的学习能力,这样才不会被互联网日新月异的变化甩开。很多程序员在面试时往往是因为答不出最基础的问题才会错失工作机会。面试前巩固一下基础知识,永远不要轻视了基础。

程序员要时刻关注技术前沿,将新技术与自己所从事的工作联系到一起,做一些深入思考,面试时谈谈这样的问题也是向面试官展现自己学习能力的好机会~

篇3:Java开发目录同步程序

Java语言是一种十分流行的程序开发语言。由SUN公司推出, 具有简易性、健壮性、安全性、可移值性等许多特性。可以用它开发各种应用程序, 是目前主流的开发语言。这里使用Java语言开发一个实用的目录同步程序, 通过实例讲解基本的Java程序开发技术。

2 开发思路

在网络环境中, 往往存在这样的需求。网络中的一台或几台计算机需要和网络中的某一台计算机中的目录文件保持一致。也就要同步的目录名和文件名以及文件内容要完全一样。如果文件发生变化, 变化后的文件将被实时更新。要实现这样的功能, 可以设置有目录同步要求的计算机为服务器, 要进行同步的计算机设置为客户端。双方通过套接字传递数据, 完成同步的功能。

服务器端设置要进行同步的目录名, 然后扫描该目录下的文件, 将要同步的文件名、文件校验码、文件时间、文件大小信息传给客户端;客户端检查要同步的文件, 如发现文件不一致, 就进行文件同步, 如果一致, 就确认同步完成。

3 程序代码

程序中有如下类, 用于搜索目录, 并将搜索到的文件放到一个Array List中:

服务端和客户端按以下规则传递数据, 如表1所示。

使用如下类, 用于读写服务端套接字:

使用如下类, 用于读写客户端套接字:

使用如下类, 用于进行文件校验, 以保证文件可靠传输:

4 结语

程序经过测试, 完成了目录同步的功能, 可以在实际环境中使用。希望本开发实例对从事Java语言开发的读者有所帮助。

参考文献

篇4:Java程序混淆技术综述

关键词:Java程序;混淆技术;软件水印;防篡改;软件版权保护

中图分类号:TP311.52 文献标识码:A 文章编号:1007-9599 (2012) 09-0000-02

人们对于计算机的依赖性随着软件技术的不断给人们带来便利和乐趣,使工作更富有主动性和操作性,但是任何事物在发展过程中都会有其负面效应与之相对,随着计算机软件应用量和种类的不断扩展,其使用安全问题便开始影响到人们的正确使用,并开始逐渐打击使用计算机的积极性,以及对于安全问题的无奈。主要攻击形式是通过对软件备份的破坏而直接将软件彻底摧毁,根据现有问题,当前的软件已经经过改良,重新调试,但是攻击则换角度也将攻击破解方式进行重组,使改良的部分无法发挥其作用,这样软件就不会得到应有的保护,依旧能够以非正规途径得到软件的任何数据,从而进行大面积的传播,这也就是为何当今软件盗版现象严重的途径之一。Java程序的出现,首先能够在网络上加快传播速度并且无客观條件可以轻松普及,但同时却能够通过无关性对产权进行有效的保护,不会轻易的被人盗用。

一、软件混淆技术基本原理

(一)基本释义

软件混淆技术是为了能够在软件受到侵害或是盗用时可以被保护的一种现代技术,软件技术首先咋1977年新西兰首次被提出,其实是将原有的程序的语言转换成一种密码语言,不能被一般的软件所识破的一种转换,并且研制出能够对这种转换进行评估的理论计算。转换的形式未变,只是在形式上保留原有的运行根组成,添加一些其他能够扰乱破坏和读取的程序代码。如今混淆技术开始不断的发展,诸多的被应用于产权的保护中,所谓的混淆就是通过语词的转变但保持其语义依然与之前相同,这就能保证软件在使用时功能是不变的,却能够防止逆向工程攻击和被静态分析。

(二)软件混淆技术的分类

当Java文件经过处理,在原有的基础上添加了其他程序代码成为类文件,这种类文件包括魔数( magic number) 、版本( version) 、常量池( constant pool ) 、访问标识( access flag s) 、(this)类、(super)类、接口( interfaces) 、域( fields) 、方法(methods) 和属性(attributes) 。

软件混淆主要通过类内混淆和类间混淆来根据不同的使用对象进行划分,类内混淆主要是克服(methods)中的code字段,而类间混淆却是针对多种类文件的综合体进行混淆处理,其主要的方式是合并和拆分相对的过程处理。

下面分别介绍两种混淆。

(1)、类内混淆

能够支持类内混淆的途径有数据混淆、控制混淆、切片混淆以及针对特定工具混淆四种。数据混淆是对数据的结构组成元素原有的书写方式进行修改,使其不再成为能够被认知的程序。主要有:变量存储和编码混淆、变量聚合混淆、顺序调整混淆、词法混淆以及移除注释和调试信息混淆。控制混淆是在信息传输过程中的保护,主要采取追踪定位等方式实时监测信息的状态,从而对其他袭击系统进行抵御。切片混淆,正常在一般的软件中问了能够让计算机更好的识读软件,所以增加了切片以帮助更好的理解,降低难度,而混淆了切片则能够使其首先无法有助于难度的下降,另外会造成对于程序的误导可能降低了或是更改了某些其他的程序,达到了增加难度混淆的目的。针对特定工具混淆软件为了能够起到保护作用,本身具有一定的反编译和反混淆的功能,会在一定的紧急时刻自动启动,而针对特定工具就是抑制了自动的传导,对于能够使软件本身内部之间的反编译都可以正常的进行,但是对于外部的反编译就不会在自动启动,这就是混淆的高级之处。相区别与前三者人的行为,针对特定工具混淆具有自动的功能针对的是自动化。如果能够与以上三种任意搭配就能够达到防住人机的共同目的。

(2)、类间混淆

类间混淆是合并拆分类文件而造成混淆的目的其中又有三种表现形式:类合并、类拆分、隐形类间混淆。类合并是要面对多个文件的自身组成的函数变量,通过将函数、变量的名称进行更改,注意在更改过程中一定不能同时出现两个或以上的名子,如果在合并中有参数同系统提示无法进行更改,则要为其中一个虚拟一个参数。另外如果合并文件中有继承关系的则需要在合并成功后加入一个布尔型的私有变量用于区分标识符相同的函数。类拆分则是观察现有的文件是否进行拆分,同时并作出相应的调整。对于结果是可拆分的类就是将A拆分为A1与A2,为了能够使A的要素都能够实现所以应该是A2处于继承A1关系。类型隐藏是通过接口来实现混淆,并且能够保证原文件并不需要改变接口,所以被称为隐形。相比类合并,类拆分和隐形类间混淆所用的时间相对较短。

二、软件混淆算法的攻击模式

(一)混淆算法的理论研究

混淆技术的提出者曾经试图将整个运行过程当做是一个虚拟黑箱来看,也就是说对于其他程序来说这就完全是另外一个软件和原软件无任何联系,从它的输入和输出的方式内容和代码都不同,这种在理论中是可以站的住的,但是在实际操作中会受到很多因素的限制,但在相对宽松的要求下还是可以实现混淆技术的使用。后来又根据该理论研究通过点函数来实现虚拟黑箱,总而言之其未来的研究空间还有很大,期待它的日益成熟。

(二)混淆算法的攻击模式

1.针对数据混淆算法的攻击

假定T 是对程序P 的一个单向的混淆变换,当且仅当从原始程序P 除去某些信息后,无法通过混淆后的程序Pc恢复出P。词法变换是最典型的不可逆混淆算法。虽然对于经过词法变换的程序进行攻击不可能恢复程序的原貌,但只要理解程序各个模块的含义就可能对程序产生威胁。例如根据无法被混淆的系统API 名称等关键字,攻击者可以推测出该模块的大致功能。

2.针对控制流混淆算法的攻击

目前,针对控制流混淆算法的主要攻击方法是动态分析。动态分析对大部分混淆算法的攻击作用,并阐述攻击模型. 对于控制流混淆而言, 变换后生成的程序中若存在始终不执行的分支,通过动态分析就能找到对破解程序有用的信息.针对控制流混淆,还有黑盒测试攻击, 该方法通过对程序进行黑盒测试,了解各个类及其函数的功能, 从而获取攻击者需要的信息. 这种方法对大多数的混淆变换均能加以攻击。同时,该方法也存在着一定的局限性: 黑盒测试缺乏自动分析工具,需要依靠大量的人力来完成分析工作。

三、对于混淆技术的未来预估

混淆技术是一种可用于抵制逆向工程和重组工程、对软件知识产权进行保护的程序变换技术。使用混淆技术虽然会使代码的效率有一定程度的降低,但是它的实现代价相对较小, 因而在近年引起了广泛的关注.由于混淆技术不改变程序功能的特性, 并且有些词法混淆算法甚至可以减小原程序的体积, 因此混淆技术得以在保护移动代码方面得到广泛的应用. 受移动平台资源的限制,今后混淆技术的研究方向一方面要加大混淆的力度,增加攻击者反编译的难度,另一方面也要考虑降低混淆算法对目标程序的运行负担。文献探讨了混淆技术在移动代理上的应用。目前保护软件知识产权的新技术主要有3种:混淆技术、软件水印技术和防篡改技术。这3种技术各有特长,将它们互相结合使用,可以给予目标软件更为可靠的保护,这也是目前研究的一个重要方向。对于混淆算法的评估、正确性验证以及如何研制高效可靠的混淆算法, 也是将来的发展方向之一。

四、总结

混淆技术是对软件进行的基础产权保护,为了能够增加破译的难度和代价,从而使产权盗版的情况发生率降低,同时还能提高软件水银的鲁棒性,有人提出将程序的编译混淆, 而不是混淆程序本身。但是该方法还有若干问题需要考虑。使软件的安全度进一步提升,给人们的使用带来了更多的福音,虽然该技术已经广泛运用也颇收到好评,在技术上依旧有大的发展前景,需要投入更多的研究力量。

参考文献:

[1]霍建雷,范训礼,房鼎益.Java标识符重命名混淆算法及其实现[J].计算机工程,2010,第1期

[2]咸星海.面向对象代码混淆技术研究及软件实现[J].中国科技博览,2010,第19期

[3]刁俊峰.软件安全中的若干关键技术研究[D],北京:北京邮电大学,2007

[4]李新良,罗戈夕.基于Java的代码混淆算法研究[J].湖南文理学院学报:自然科学版,2010,第3期

[5]霍建雷,范训礼.房鼎益,Java标识符重命名混淆算法及其实现[J].计算机工程,2010,第1期

[6]李婧.基于控制流混淆轉换的代码保护技术[J].计算机安全,2009,第8期

[7]袁征,冯雁,温巧燕,张华.构造一种新的混淆Java程序的不透明谓词[J].北京邮电大学学报,2007,第6期

篇5:java程序员面试建议

1.abstract class Name { private String name;public abstract boolean isStupidName(String name){} }大侠们,这有何错误?答案: 错。abstract method必须以分号结尾,且不带花括号。

2.public class Something { void doSomething(){ private String s = “";int l = s.length();} }有错吗? 答案: 错。局部变量前不能放置任何访问修饰符(private,public,和protected)。final可以用来修饰局部变量(final如同abstract和strictfp,都是非访问修饰符,strictfp只能修饰class和method而非variable)。

3.abstract class Something { private abstract String doSomething();}这好像没什么错吧? 答案: 错。abstract的methods不能以private修饰。abstract的methods就是让子类implement(实现)具体细节的,怎么可以用private把abstract method封锁起来呢?(同理,abstract method前不能加final)。

4.public class Something { public int addOne(final int x){ return ++x;} }这个比较明显。

答案: 错。int x被修饰成final,意味着x不能在addOne method中被修改。

5.public class Something {

public static void main(String[] args){ Other o = new Other();new Something().addOne(o);}

public void addOne(final Other o){ o.i++;} } class Other { public int i;}和上面的很相似,都是关于final的问题,这有错吗? 答案: 正确。在addOne method中,参数o被修饰成final。如果在addOne method里我们修改了o的reference,(比如: o = new Other();),那么如同上例这题也是错的。但这里修改的是o的member vairable(成员变量),而o的reference并没有改变。

6.class Something { int i;

public void doSomething(){ System.out.println(”i = “ + i);} } 有什么错呢? 看不出来啊。

答案: 正确。输出的是”i = 0“。int i属於instant variable(实例变量,或叫成员变量)。instant variable有default value。int的default value是0。

7.class Something { final int i;

public void doSomething(){ System.out.println(”i = “ + i);} }和上面一题只有一个地方不同,就是多了一个final。这难道就错了吗? 答案: 错。final int i是个final的instant variable(实例变量,或叫成员变量)。final的instant variable没有default value,必须在constructor(构造器)结束之前被赋予一个明确的值。可以修改为”final int i = 0;“。

8.public class Something {

public static void main(String[] args){ Something s = new Something();

System.out.println(”s.doSomething()returns “ + doSomething());}

public String doSomething(){ return ”Do something...“;} } 看上去很完美。

答案: 错。看上去在main里call doSomething没有什么问题,毕竟两个methods都在同一个class里。但仔细看,main是static的。static method不能直接call non-static methods。可改成”System.out.println(“s.doSomething()

returns

+ s.doSomething());“。同理,static method不能访问non-static instant variable。

9.此处,Something类的文件名叫 OtherThing.javaclass Something {

private static void main(String[] something_to_do){ System.out.println(”Do something...“);} } 这个好像很明显。

答案: 正确。从来没有人说过Java的Class名字必须和其文件名相同。但public class的名字必须和文件名相同。

10.interface A{

int x = 0;} class B{ int x =1;}

class C extends B implements A { public void pX(){ System.out.println(x);}

public static void main(String[] args){ new C().pX();} } 答案:错误。在编译时会发生错误(错误描述不同的JVM有不同的信息,意思就是未明确的x调用,两个x都匹配(就象在同时import java.util和java.sql两个包时直接声明Date一样)。对于父类的变量,可以用super.x来明确,而接口的属性默认隐含为 public static final.所以可以通过A.x来明确。

11.interface Playable {

void play();} interface Bounceable { void play();}

interface Rollable extends Playable, Bounceable { Ball ball = new Ball(”PingPang“);}

class Ball implements Rollable { private String name;public String getName(){ return name;}

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

public void play(){

ball = new Ball(”Football“);System.out.println(ball.getName());} }这个错误不容易发现。

答案: 错。”interface Rollable extends Playable, Bounceable“没有问题。interface可继承多个interfaces,所以这里没错。问题出在interface Rollable里的”Ball ball = new Ball(“PingPang”);“。任何在interface里声明的interface variable(接口变量,也可称成员变量),默认为public static final。也就是说”Ball ball = new Ball(“PingPang”);“实际上是”public static final Ball ball = new Ball(“PingPang”);“。在Ball类的Play()方法中,”ball = new Ball(“Football”);“改变了ball的reference,而这里的ball来自Rollable interface,Rollable interface里的ball是public static final的,final的object是不能被改变reference的。因此编译器将在”ball = new Ball(“Football”);“这里显示有错。

JAVA编程题 1.现在输入n个数字,以逗号,分开;然后可选择升或者降序排序;按提交键就在另一页面显示按什么排序,结果为,提供reset import java.util.*;public class bycomma{

public static String[] splitStringByComma(String source){ if(source==null||source.trim().equals(”“))

return null;

StringTokenizer commaToker=new tringTokenizer(source,”,“);String[] result = new String[commaToker.countTokens()];int i=0;

while(commaToker.hasMoreTokens()){ result[i] = commaToker.nextToken();i++;} return result;} public static void main(String args[]){

String[] s = splitStringByComma(”5,8,7,4,3,9,1“);int[] ii = new int[s.length];for(int i = 0;i

for(int i=(s.length-1);i>=0;i--){ System.out.println(ii[i]);} } }

2.金额转换,阿拉伯数字的金额转换成中国传统的形式如:(¥1011)->(一千零一拾一元整)输出。package test.format;import java.text.NumberFormat;import java.util.HashMap;public class SimpleMoneyFormat { public static final String EMPTY = ”“;public static final String ZERO = ”零“;public static final String ONE = ”壹“;public static final String TWO = ”贰“;public static final String THREE = ”叁“;public static final String FOUR = ”肆“;public static final String FIVE = ”伍“;public static final String SIX = ”陆“;public static final String SEVEN = ”柒“;public static final String EIGHT = ”捌“;public static final String NINE = ”玖“;public static final String TEN = ”拾“;public static final String HUNDRED = ”佰“;public static final String THOUSAND = ”仟“;public static final String TEN_THOUSAND = ”万“;public static final String HUNDRED_MILLION = ”亿“;public static final String YUAN = ”元“;public static final String JIAO = ”角“;public static final String FEN = ”分“;public static final String DOT = ”.“;

private static SimpleMoneyFormat formatter = null;private HashMap chineseNumberMap = new HashMap();private HashMap chineseMoneyPattern = new HashMap();private

NumberFormat

numberFormat NumberFormat.getInstance();private SimpleMoneyFormat(){

numberFormat.setMaximumFractionDigits(4);numberFormat.setMinimumFractionDigits(2);

= numberFormat.setGroupingUsed(false);chineseNumberMap.put(”0“, ZERO);chineseNumberMap.put(”1“,ONE);chineseNumberMap.put(”2“, TWO);chineseNumberMap.put(”3“, THREE);chineseNumberMap.put(”4“, FOUR);chineseNumberMap.put(”5“, FIVE);chineseNumberMap.put(”6“, SIX);chineseNumberMap.put(”7“, SEVEN);chineseNumberMap.put(”8“, EIGHT);chineseNumberMap.put(”9“, NINE);chineseNumberMap.put(DOT, DOT);chineseMoneyPattern.put(”1“, TEN);chineseMoneyPattern.put(”2“, HUNDRED);chineseMoneyPattern.put(”3“, THOUSAND);chineseMoneyPattern.put(”4“, TEN_THOUSAND);chineseMoneyPattern.put(”5“, TEN);chineseMoneyPattern.put(”6“, HUNDRED);chineseMoneyPattern.put(”7“, THOUSAND);chineseMoneyPattern.put(”8“, HUNDRED_MILLION);} public static SimpleMoneyFormat getInstance(){ if(formatter == null)

formatter = new SimpleMoneyFormat();return formatter;} public String format(String moneyStr){

checkPrecision(moneyStr);String result;

result = convertToChineseNumber(moneyStr);result = addUnitsToChineseMoneyString(result);

return result;}

public String format(double moneyDouble){

return format(numberFormat.format(moneyDouble));}

public String format(int moneyInt){

return format(numberFormat.format(moneyInt));}

public String format(long moneyLong){

return format(numberFormat.format(moneyLong));} public String format(Number moneyNum){

return format(numberFormat.format(moneyNum));

private String convertToChineseNumber(String moneyStr){ String result;

StringBuffer cMoneyStringBuffer = new StringBuffer();for(int i = 0;i < moneyStr.length();i++){

cMoneyStringBuffer.append(chineseNumberMap.get(moneyStr.substring(i, i + 1)));

//拾佰仟万亿等都是汉字里面才有的单位,加上它们

int indexOfDot = cMoneyStringBuffer.indexOf(DOT);int moneyPatternCursor = 1;for(int i = indexOfDot1)

cMoneyStringBuffer.delete(cMoneyStringBuffer.length()1, JIAO);

cMoneyStringBuffer.insert(cMoneyStringBuffer.length(), FEN);if(cMoneyStringBuffer.indexOf(”零角零分“)!=-1)//没有零头,加整 cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf(”零角零分“), cMoneyStringBuffer.length(), ”整“);

else if(cMoneyStringBuffer.indexOf(”零分“)!=-1)//没有零分,加

cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf(”零分“), cMoneyStringBuffer.length(), ”整“);else { if(cMoneyStringBuffer.indexOf(”零角“)!=-1)

cMoneyStringBuffer.delete(cMoneyStringBuffer.indexOf(”零角“),cMoneyStringBuffer.indexOf(”零角“)+2);

tmpBuffer.append(”整“);

} result = cMoneyStringBuffer.toString();return result;} private void checkPrecision(String moneyStr){ int

fractionDigits

=

moneyStr.length()

-moneyStr.indexOf(DOT)-1;

if(fractionDigits > 2)throw new RuntimeException(”金额“ + moneyStr + ”的小数位多于两位。“);//精度不能比分低

} public static void main(String args[]){ System.out.println(getInstance().format(new Double(10010001.01)));} }

3、继承时候类的执行顺序问题,一般都是选择题,问你将会打印出什么? 答:父类:

package test;

public class FatherClass { public FatherClass(){

System.out.println(”FatherClass Create“);} } 子类: package test;

import test.FatherClass;

public class ChildClass extends FatherClass { public ChildClass(){

System.out.println(”ChildClass Create“);}

public static void main(String[] args){ FatherClass fc = new FatherClass();ChildClass cc = new ChildClass();} }

输出结果: C:>java test.ChildClass FatherClass FatherClass Create

ChildClass Create

4、内部类的实现方式? 答:示例代码如下:

package test;

public class OuterClass { private class InterClass { public InterClass(){

System.out.println(”InterClass Create“);} }

public OuterClass(){

InterClass ic = new InterClass();System.out.println(”OuterClass Create“);}

public static void main(String[] args){ OuterClass oc = new OuterClass();}

Create }

输出结果: C:>java test/OuterClass InterClass Create

OuterClass Create 再一个例题:

public class OuterClass { private double d1 = 1.0;//insert code here }

You need to insert an inner class declaration at line 3.Which two inner class declarations are valid?(Choose two.)

A.class InnerOne{ public static double methoda(){return d1;} } B.public class InnerOne{ static double methoda(){return d1;} } C.private class InnerOne{ double methoda(){return d1;} } D.static class InnerOne{ protected double methoda(){return d1;} } E.abstract class InnerOne{ public abstract double methoda();} 说明如下: 一.静态内部类可以有静态成员,而非静态内部类则不能有静态成员。故 A、B 错 二.静态内部类的非静态成员可以访问外部类的静态变量,而不可访问外部类的非静态变量;return d1 出错。故 D 错 三.非静态内部类的非静态成员可以访问外部类的非静态变量。故 C 正确 四.答案为C、E

5、Java 的通信编程,编程题(或问答),用JAVA SOCKET编程,读服务器几个字符,再写入本地显示?

答:Server端程序: package test;import java.net.*;import java.io.*;public class Server { private ServerSocket ss;private Socket socket;private BufferedReader in;private PrintWriter out;public Server(){ try {

ss=new ServerSocket(10000);while(true){

socket = ss.accept();String

RemoteIP

= socket.getInetAddress().getHostAddress();String RemotePort = ”:“+socket.getLocalPort();System.out.println(”A in!IP:“+RemoteIP+RemotePort);in

=

new

BufferedReader(new client

come InputStreamReader(socket.getInputStream()));String line = in.readLine();

System.out.println(”Cleint send is :“ + line);out

=

new PrintWriter(socket.getOutputStream(),true);out.println(”Your Message Received!“);out.close();in.close();socket.close();}

}catch(IOException e){ out.println(”wrong“);} }

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

Client端程序: package test;import java.io.*;import java.net.*;public class Client { Socket socket;BufferedReader in;PrintWriter out;public Client(){ try {

System.out.println(”Try to Connect to 127.0.0.1:10000“);socket = new Socket(”127.0.0.1“,10000);System.out.println(”The Server Connected!“);System.out.println(”Please enter some Character:");BufferedReader

line

=

new

BufferedReader(new InputStreamReader(System.in));

out = new PrintWriter(socket.getOutputStream(),true);Out

3、接口和内部类、抽象类的特征答:接口:在一个类里,只有申明没有实现。内部类:是在一个类的内部定义的一个类;抽象类:是以abstract 定义的,里面至少有一个抽象方法。

4、文件读写的基本类

答:File Reader 类和FileWriter类分别继承自Reader类和Writer类。FileReader类用于读取文件,File Writer类用于将数据写入文件,这两各类在使用前,都必须要调用其构造方法创建相应的对象,然后调用相应的read()或 write()方法。

6、线程的基本概念、线程的本状态以及状态之间的关系 ?新建(Born): 新建的线程处于新建状态?就绪(Ready): 在创建线程后,它将处于就绪状态,等待 start()方法被调用?运行(Running): 线程在开始执行时进入运行状态?睡眠(Sleeping): 线程的执行可通过使用 sleep()方法来暂时中止。在睡眠后,线程将进入就绪状态?等待(Waiting): 如果调用了 wait()方法,线程将处于等待状态。用于在两个或多个线程并发运行时。?挂起(Suspended): 在临时停止或中断线程的执行时,线程就处于挂起状态。?恢复(Resume): 在挂起的线程被恢复执行时,可以说它已被恢复。?阻塞(Blocked)– 在线程等待一个事件时(例如输入/输出操作),就称其处于阻塞状态。?死亡(Dead)– 在 run()方法已完成执行或其 stop()方法被调用之后,线程就处于死亡状态。

5、串行化的注意事项以及如何实现串行化答:如果有循环引用是不可以串行化的。对象输出流的WriteObject方法和 对象输入流的ReadObect 方法

7、线程的同步、如何实现线程的同步答:当两个或多个线程同时访问同一个变量,并且以个线程需要修改这个变量。就要用到线程同步。在Java 中,同步是通过 synchronized 关键字来定义的。诺是想同步化某程序段,可以使用 synchronized(object){}方法,其中{}内的程序语句被同步化。

9、socket通信(tcp/udp区别及JAVA的实现方式)TCP——传输控制协议,具有极高的可靠性,保证数据包按照顺序准确到达,但其也有着很高的额外负担。UDP——使用者数据元协议,并不能保证数据包会被成功的送达,也不保证数据包到达的顺序,但其传输速度很快。大多数我们会使用TCP,偶尔才会动用UDP,如声音讯号,即使少量遗失,也无

关紧要。

10、JAVA的事件委托机制和垃圾回收机制

java 事件委托机制的概念,一个源产生一个事件并将它送到一个或多个监听器那里。在这种方案中,监听器简单的等待,直到它收到一个事件。一旦事件被接受,监听器将处理这个事件,然后返回。垃圾回收机制 垃圾收集是将分配给对象但不在使用的内存回收或释放的过程。如果一个对象没有指向它的引用或者其赋值为null,则次对象适合进行垃圾回收

11、JDBC调用数据库的基本步骤导入必要的类,装入JDBC驱动程序,识别数据源,分配一个Connection对象,分配一个Statement对象,使用Statement执行一个查询,从返回的ResultSet对象中检索数据,关闭ResultSet,关闭Statement对象,关闭Connection对象

12、解析XML文件的几种方式和区别答:Dom解析 在内存中创建一个DOM树,能随机访问文件内容,也可以修改原文件内容SAX解析 线性解析,不能随机访问,也无法修改原文件Dom解析要先用SAX解析创建DOM树

13、JAVA的四种基本权限的定义public private protected 默认

篇6:java程序员面试要点

final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。finally是异常处理语句结构的一部分,表示总是执行。finalize是 Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。

第二,Anonymous Inner Class(匿名内部类)是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?

可以继承其他类或完成其他接口,在swing编程中常用此方式。

第三,Static Nested Class 和 Inner Class的不同,说得越多越好(面试题有的很笼统)。

Static Nested Class是被声明为静态(static)的内部类,它可以不依赖于外部类实例被实例化。而通常的内部类需要在外部类实例化后才能实例化。

第四,&和&&的区别。

&是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and).第五,HashMap和Hashtable的区别。

HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable.第六,Collection 和 Collections的区别。

Collection是集合类的上级接口,继承与他的接口主要有Set 和List.Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。

第七,什么时候用assert。

1.4新增关键字(语法),用于测试boolean表达式状态,可用于调试程序。使用方法 assert,表示如果表达式为真(true),则下面的语句执行,否则抛出AssertionError。另外的使用方式assert < boolean表达式>:,表示如果表达式为真,后面的表达式忽略,否则后面表达式的值用于AssertionError的构建参数。注意编译时要增加-source 1.4 参数,否则报错。]运行时要增加 –ea参数,否则assert行被忽略

第八,GC是什么? 为什么要有GC?

GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。

第九,String s = new String(“xyz”);创建了几个String Object?

两个

第十,Math.round(11.5)等於多少? Math.round(-11.5)等於多少?

Math.round(11.5)==12Math.round(-11.5)==-11round方法返回与参数最接近的长整数,参数加1/2后求其floor.第十一,short s1 = 1;s1 = s1 + 1;有什么错? short s1 = 1;s1 += 1;有什么错?

short s1 = 1;s1 = s1 + 1;(s1+1运算结果是int型,需要强制转换类型)short s1 = 1;s1 += 1;(可以正确编译)

第十二,sleep()和 wait()有什么区别?

sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用 sleep不会释放对象锁。wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。

第十三,Java有没有goto?

没有

很十三的问题,如果哪个面试的问到这个问题,我劝你还是别进这家公司。

第十四,数组有没有length()这个方法? String有没有length()这个方法?

数组没有length()这个方法,有length的属性。

String有有length()这个方法。

第十五,Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?

方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写(Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。

第十六,Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?

Set里的元素是不能重复的,那么用iterator()方法来区分重复与否。equals()是判读两个Set是否相等。

equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。

第十七,给我一个你最常见到的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

第十八,error和exception有什么区别?

error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。

exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。

第十九,List, Set, Map是否继承自Collection接口?

List,Set是

Map不是

第二十,abstract class和interface有什么区别?

声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。

接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个 有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。

第二十一,abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?

都不能

第二十二,接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?

接口可以继承接口。抽象类可以实现(implements)接口,抽象类是否可继承实体类,但前提是实体类必须有明确的构造函数。

第二十三,启动一个线程是用run()还是start()?

启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。

第二十四,构造器Constructor是否可被override?

构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading。

第二十五,是否可以继承String类?

String类是final类故不可以继承。

第二十六,当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?

不能,一个对象的一个synchronized方法只能由一个线程访问。

第二十七,try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?

会执行,在return前执行。

第二十八,编程题: 用最有效率的方法算出2乘以8等於几?

有C背景的程序员特别喜欢问这种问题。< < 3

第二十九,两个对象值相同(x.equals(y)== true),但却可有不同的hash code,这句话对不对?

不对,有相同的hash code。

第三十,当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?

是值传递。Java 编程语言只由值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。

第三十一,swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?

switch(expr1)中,expr1是一个整数表达式。因此传递给 switch 和 case 语句的参数应该是 int、short、char 或者 byte。long,string 都不能作用于swtich。

第三十二,编程题: 写一个Singleton出来。

Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。

一般Singleton模式通常有几种种形式:

第一种形式: 定义一个类,它的构造函数为private的,它有一个static的private的该类变量,在类初始化时实例话,通过一个public的getInstance方法获取对它的引用,继而调用其中的方法。

public class Singleton {

private Singleton(){}

//在自己内部定义自己一个实例,是不是很奇怪?

//注意这是private 只供内部调用

private static Singleton instance = new Singleton();

//这里提供了一个供外部访问本class的静态方法,可以直接访问

public static Singleton getInstance(){

return instance;

} }

第二种形式:

public class Singleton {

private static Singleton instance = null;

public static synchronized Singleton getInstance(){

//这个方法比上面有所改进,不用每次都进行生成对象,只是第一次

//使用时生成实例,提高了效率!

if(instance==null)

instance=new Singleton();

return instance;} }

其他形式:

定义一个类,它的构造函数为private的,所有方法为static的。

一般认为第一种形式要更加安全些

其中也存在一些问题,下面补充一下.希望大家继续补充

1.最好介绍一下final修饰变量的情形(分开说明基本类型变量和引用类型变量)。

2.不知道如何描述比较好,匿名内部类本身是一个实现了特定接口或继承了其他类的类。

3.非静态类不能有static的方法。参考一下java collections framework的代码,还能说出很多东西来。

4.&既是位运算符,也是逻辑操作符。

&和&&都是逻辑运算符,它们的区别是,&&进行短路计算。

6.可以补充一下,参考文档。

11.说一下具体的原因可能更好。

13.java有goto这个keyword,不过还没有使用。

15.overload和多态没有任何关系。多态是面向对象的基本特征,是和继承、overriding相关的。原来以为把overload当作多态的一种是从C++来的,后来翻了基本c++的经典的书,也强调多态只是和继承,虚函数,overriding相关,所以不知道这个错误思想从哪来的了.16.public interface Set extends Collection 一个不包含重复元素的 collection。更确切地讲,set 不包含满足 e1.equals(e2)的元素对 e1 和 e2,并且最多包含一个 null 元素。正如其名称所暗示的,此接口模仿了数学上的 set 抽象。

看文档就是了.22.“抽象类是否可继承实体类,但前提是实体类必须有明确的构造函数。”什么意思?谁规定的?

27.这个比较复杂,例如

public class Main {

public static void main(String[] args){

System.out.println(test());}

public static boolean test(){

boolean b = false;

try {

return b = 4 > 3;

} finally {

System.out.println(b);

//return false;} } }

这个例子中可以看出,return后面的表达式已经计算了,感觉return语句这里被挂起了,如果finally中没有return,这个return就返回.如果finally也有return,那么就是finally中的return返回了.29.碰上不守规矩的程序员谁也没办法.31.还有枚举呢

上一篇:民商下一篇:简单的温馨的早安朋友圈问候语摘录