问题一:我声明了什么!
String s = "Hello world!";
许多人都做过这样的事情,但是,我们到底声明了什么?回答通常是:一个String,内容是“Hello world!”。这样模糊的回答通常是概念不清的根源。如果要准确的回答,一半的人大概会回答错误。
这个语句声明的是一个指向对象的引用,名为“s”,可以指向类型为String的任何对象,目前指向"Hello world!"这个String类型的对象。这就是真正发生的事情。我们并没有声明一个String对象,我们只是声明了一个只能指向String对象的引用变量。所以,如果在刚才那句语句后面,如果再运行一句:
String string = s;
我们是声明了另外一个只能指向String对象的引用,名为string,并没有第二个对象产生,string还是指向原来那个对象,也就是,和s指向同一个对象。
问题二:"=="和equals方法究竟有什么区别?
==操作符专门用来比较变量的值是否相等。比较好理解的一点是:
int a=10;
int b=10;
则a==b将是true。
但不好理解的地方是:
String a=new String("foo");
String b=new String("foo");
则a==b将返回false。
根据前一帖说过,对象变量其实是一个引用,它们的值是指向对象所在的内存地址,而不是对象本身。a和b都使用了new操作符,意味着将在内存中产生两个内容为"foo"的字符串,既然是“两个”,它们自然位于不同的内存地址。a和b的值其实是两个不同的内存地址的值,所以使用"=="操作符,结果会是false。诚然,a和b所指的对象,它们的内容都是"foo",应该是“相等”,但是==操作符并不涉及到对象内容的比较。
对象内容的比较,正是equals方法做的事。
看一下Object对象的equals方法是如何实现的:
boolean equals(Object o){
return this==o;
}
Object对象默认使用了==操作符。所以如果你自创的类没有覆盖equals方法,那你的类使用equals和使用==会得到同样的结果。同样也可以看出,Object的equals方法没有
达到equals方法应该达到的目标:比较两个对象内容是否相等。因为答案应该由类的创建者决定,所以Object把这个任务留给了类的创建者。
看一下一个极端的类:
Class Monster{
private String content;
...
boolean equals(Object another){ return true;}
}
我覆盖了equals方法。这个实现会导致无论Monster实例内容如何,它们之间的比较永远返回true。
所以当你是用equals方法判断对象的内容是否相等,请不要想当然。因为可能你认为相等,而这个类的作者不这样认为,而类的equals方法的实现是由他掌握的。如果你需要使用equals方法,或者使用任何基于散列码的集合
(HashSet,HashMap,HashTable),请察看一下java doc以确认这个类的equals逻辑
是如何实现的。
问题三:String到底变了没有?
没有。因为String被设计成不可变(i mm utable)类,所以它的所有对象都是不可变对象。请看下列代码:
String s = "Hello";
s = s + " world!";
s所指向的对象是否改变了呢?从本系列第一篇的结论很容易导出这个结论。我们来看看发生了什么事情。在这段代码中,s原先指向一个String对象,内容是"Hello",然后我们对s进行了+操作,那么s所指向的那个对象是否发生了改变呢?答案是没有。这时,s 不指向原来那个对象了,而指向了另一个String对象,内容为"Hello world!",原来那
个对象还存在于内存之中,只是s这个引用变量不再指向它了。
通过上面的说明,我们很容易导出另一个结论,如果经常对字符串进行各种各样的修改,或者说,不可预见的修改,那么使用String来代表字符串的话会引起很大的内存开销。因为String对象建立之后不能再改变,所以对于每一个不同的字符串,都需要一个String对象来表示。这时,应该考虑使用String B uffer类,它允许修改,而不是每个不同的字符串都要生成一个新的对象。并且,这两种类的对象转换十分容易。
同时,我们还可以知道,如果要使用内容相同的字符串,不必每次都new一个String。例如我们要在构造器中对一个名叫s的String引用变量进行初始化,把它设置为初始值,应当这样做:
public class D e m o {
private String s;
...
public D e m o {
s = "I nitial V alue";
}
...
}
而非
s = new String("I nitial V alue");
后者每次都会调用构造器,生成新对象,性能低下且内存开销大,并且没有意义,因为String对象不可改变,所以对于内容相同的字符串,只要一个String对象来表示就可以了。也就说,多次调用上面的构造器创建多个对象,他们的String类型属性s都指向同一个对象。
上面的结论还基于这样一个事实:对于字符串常量,如果内容相同,J ava认为它们代表同一个String对象。而用关键字new调用构造器,总是会创建一个新的对象,无论内容是否相同。
至于为什么要把String类设计成不可变类,是它的用途决定的。其实不只String,很多J ava标准类库中的类都是不可变的。在开发一个系统的时候,我们有时候也需要设计不可变类,来传递一组相关的值,这也是面向对象思想的体现。不可变类有一些优点,比如因为它的对象是只读的,所以多线程并发访问也不会有任何问题。当然也有一些缺点,比如每个不同的状态都要一个对象来代表,可能会造成性能上的问题。所以J ava标准类库还提供了一个可变版本,即String B uffer。
问题四:final关键字到底修饰了什么?
final使得被修饰的变量"不变",但是由于对象型变量的本质是“引用”,使得“不变”也有了两种含义:引用本身的不变,和引用指向的对象不变。
引用本身的不变:
final String B uffer a=new String B uffer("i mm utable");
final String B uffer b=new String B uffer("not i mm utable");
a=b;//编译期错误
引用指向的对象不变:
final String B uffer a=new String B uffer("i mm utable");
a.append(" bro k en!"); //编译通过
可见,final只对引用的“值”(也即它所指向的那个对象的内存地址)有效,它迫使引用只能指向初始指向的那个对象,改变它的指向会导致编译期错误。至于它所指向的对象的变化,final是不负责的。这很类似==操作符:==操作符只负责引用的“值”相等,至于这个地址所指向的对象内容是否相等,==操作符是不管的。
理解final问题有很重要的含义。许多程序漏洞都基于此----final只能保证引用永远指向
固定对象,不能保证那个对象的状态不变。在多线程的操作中,一个对象会被多个线程共享或修改,一个线程对对象无意识的修改可能会导致另一个使用此对象的线程崩溃。一个错误的解决方法就是在此对象新建的时候把它声明为final,意图使得它“永远不变”。其实那是徒劳的。
问题五:到底要怎么样初始化!
本问题讨论变量的初始化,所以先来看一下J ava中有哪些种类的变量。
1. 类的属性,或者叫值域
2. 方法里的局部变量
3. 方法的参数
对于第一种变量,J ava虚拟机会自动进行初始化。如果给出了初始值,则初始化为该初始值。如果没有给出,则把它初始化为该类型变量的默认初始值。
int类型变量默认初始值为0
float类型变量默认初始值为0.0f
double类型变量默认初始值为0.0
boolean类型变量默认初始值为false
char类型变量默认初始值为0(A SC II码)
long类型变量默认初始值为0
所有对象引用类型变量默认初始值为null,即不指向任何对象。注意数组本身也是对象,所以没有初始化的数组引用在自动初始化后其值也是null。
对于两种不同的类属性,static属性与instance属性,初始化的时机是不同的。instance 属性在创建实例的时候初始化,static属性在类加载,也就是第一次用到这个类的时候
初始化,对于后来的实例的创建,不再次进行初始化。这个问题会在以后的系列中进行详细讨论。
对于第二种变量,必须明确地进行初始化。如果再没有初始化之前就试图使用它,编译器会抗议。如果初始化的语句在tr y块中或if块中,也必须要让它在第一次使用前一定能够得到赋值。也就是说,把初始化语句放在只有if块的条件判断语句中编译器也会抗议,因为执行的时候可能不符合if后面的判断条件,如此一来初始化语句就不会被执行了,这就违反了局部变量使用前必须初始化的规定。但如果在else块中也有初始化语句,就可以通过编译,因为无论如何,总有至少一条初始化语句会被执行,不会发生使用前未被初始化的事情。对于tr y-catch也是一样,如果只有在tr y块里才有初始化语句,编译部通过。如果在catch或finall y里也有,则可以通过编译。总之,要保证局部变量在使用之前一定被初始化了。所以,一个好的做法是在声明他们的时候就初始化他们,如果不知道要出事化成什么值好,就用上面的默认值吧!
其实第三种变量和第二种本质上是一样的,都是方法中的局部变量。只不过作为参数,
肯定是被初始化过的,传入的值就是初始值,所以不需要初始化。
问题六:instanceof是什么东东?
instanceof是J ava的一个二元操作符,和==,>,<是同一类东东。由于它是由字母组成的,所以也是J ava的保留关键字。它的作用是测试它左边的对象是否是它右边的类的实例,返回boolean类型的数据。举个例子:
String s = "I A M an Object!";
boolean isObject = s instanceof Object;
我们声明了一个String对象引用,指向一个String对象,然后用instancof来测试它所指向的对象是否是Object类的一个实例,显然,这是真的,所以返回true,也就是isObject的值为True。
instanceof有一些用处。比如我们写了一个处理账单的系统,其中有这样三个类:public class B ill {//省略细节}
public class P hone B ill e x tends B ill {//省略细节}
public class G as B ill e x tends B ill {//省略细节}
在处理程序里有一个方法,接受一个B ill类型的对象,计算金额。假设两种账单计算方法不同,而传入的B ill对象可能是两种中的任何一种,所以要用instanceof来判断:public double calculate(B ill bill) {
if (bill instanceof P hone B ill) {
//计算电话账单
}
if (bill instanceof G as B ill) {
//计算燃气账单
}
...
}
这样就可以用一个方法处理两种子类。
然而,这种做法通常被认为是没有好好利用面向对象中的多态性。其实上面的功能要求用方法重载完全可以实现,这是面向对象变成应有的做法,避免回到结构化编程模式。只要提供两个名字和返回值都相同,接受参数类型不同的方法就可以了:
public double calculate(P hone B ill bill) {
//计算电话账单
}
public double calculate(G as B ill bill) {
//计算燃气账单
}
所以,使用instanceof在绝大多数情况下并不是推荐的做法,应当好好利用多态。
阅读全文 (15)/评论/给never_a m e留言/扔小纸条/文件夹:java/j2ee
收藏:QQ书签https://www.wendangku.net/doc/0e10441643.html,/订阅:G oogle抓虾
J ava笔试题
never_a m e@2007-12-24 08:51
一、介绍J S P中常用的内部对象。
request、response、application、config、session、out、page、e x ception、pageConte x t。
二、简述HttpSession的作用,使用方法,可以用代码说明。
HttpSession session = request.getSession();
session.set A ttribute("na m e", new D ate());
D ate date = (D ate)session.get A ttribute("na m e");
三、简述Servlet请求时GE T方法和P OST方法的区别。
(1)GE T:把F or m的数据封装到请求行里URL后边,在浏览器地址栏能看见。
例如:/servlet/e x a m ples.HelloServlet?na m e=2p&password=123 P OST:把F or m的数据封装到请求体里,在浏览器地址栏看不见。
(2)GE T:F or m缺省方法;F or m的方法设成GE T;超级连接;浏览器地址栏直接输入。
P OST:F or m的方法设成P OST。
(3)编写Servlet时重写do G et(只支持GE T请求)或do P ost(只支持P OST请求)。
四、请列出
......
page、request、session、application
B eanClass N a m e bean N a m e = (B eanClass N a m e)session.get A ttribute("bean N a m e");
if (bean N a m e == null) { bean N a m e = new B eanClass N a m e();
bean N a m e.set XXX();
}
五、简述Servlet生命周期。
Servlet首次创建实例时,W eb容器调用init()方法;每次请求Servlet时,W eb容器调用service(request, response)方法启动线程;Servlet实例销毁时,W eb容器调用destro y()方法。
六、清画出Servlet2.2以上W eb A pplication的基本目录结构。
J2EE1.2:J S P1.1 Servlet2.2
J2EE1.3:J S P1.2 Servlet2.3EJB2.0
J2EE1.4:J S P2.0 Servlet2.4EJB3.0
部署结构:
\my W eb-----\W EB—I N F-----web.xm l
|-----\classes\包\*.class
|-----\lib\*.jar
归档:*.war
开发结构:
\my W eb-----\src-----*.java
|-----\etc-----web.xm l, *.tld
|-----\lib-----*.jar
|-----\web-----*.jsp, *.ht m l, *.jpg
部署:三个拷贝,一个编译
七、谈谈你对三层结构的理解。
浏览器——W eb服务器(M V C)——数据库。(扩展画图)
八、名次解释。
a) J MS(J ava消息服务),做消息处理。
b) D OM(文档对象模型),用来解析X M L。
c) M V C(Model—V iew—Controller),分离表现逻辑、业务逻辑和数据。
d) J N DI(J ava命名和目录接口),提供名字服务。
e) LDAP(轻量级目录访问协议),提供数据的存储方式。
f) EJB(企业级J ava B ean),作为Model,可以封装数据(实体B ean),也可以表示业务功能(会话B ean),作为Model,可以处理消息(M DB)。
g) U M L(统一建模语言),提供画图的规范。R ose,V isio。
h) D T D(文档类型定义),规定X M L文件的格式。
i) X M L(可扩展的标记语言)。
j) JA X P(解析X M L的J ava API).
k) R M I(远程方法调用),在一个机器上使用另一个机器上创建的对象。
l) SO AP(简单对象访问协议),用在W ebService中。
九、程序设计,写出一个Servlet,实现以下功能,通过表单提取一个"ds"的参数(该参数代表一个可用的数据源),通过该参数获得一个可用的数据连接。
i m port java x.sql.*;
public class M y Servlet e x tends HttpServlet{
public void do G et(HttpServlet R equest request, HttpServlet R esponse response) throws I O Ex ception{
String ds = request.get P are m eter("ds");
Conte x t initial = new I nitialConte x t();
D ataSource dss = (D ataSource)initial.loo k up(ds);
Connection conn = dss.getConnection();
State m ent st m t = conn.createState m ent();
R esultSet rs = st m t.e x ecute Q uer y("select a, b, fro m my table");
while(rs.ne x t()){
rs.get XXX();
}
}
61、servlet的生命周期
web容器加载servlet,生命周期开始。通过调用servlet的init()方法进行servlet的初始化。通过调用service()方法实现,根据请求的不同调用不同的do***()方法。结束服务,web容器调用servlet的destro y()方法。
62、如何现实servlet的单线程模式
<%@ page isThreadSafe="false"%>
63、页面间对象传递的方法
request,session,application,coo k ie等
64、J S P和Servlet有哪些相同点和不同点,他们之间的联系是什么?
J S P是Servlet技术的扩展,本质上是Servlet的简易方式,更强调应用的外表表达。J S P 编译后是"类servlet"。Servlet和J S P最主要的不同点在于,Servlet的应用逻辑是在J ava 文件中,并且完全从表示层中的HTM L里分离开来。而J S P的情况是J ava和HTM L可以组合成一个扩展名为.jsp的文件。J S P侧重于视图,Servlet主要用于控制逻辑。
65、四种会话跟踪技术
会话作用域Servlets J S P页面描述
page否是代表与一个页面相关的对象和属性。一个页面由一个编译好的 J ava servlet 类(可以带有任何的 include 指令,但是没有 include 动作)表示。这既包括 servlet 又包括被编译成 servlet 的 J S P页面
request是是代表与W eb 客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个 W eb 组件(由于 forward 指令和 include 动作的关系)
session是是代表与用于某个 W eb 客户机的一个用户体验相关的对象和属性。一个 W eb 会话可以也经常会跨越多个客户机请求
application是是代表与整个 W eb 应用程序相关的对象和属性。这实质上是跨越整个
W eb 应用程序,包括多个页面、请求和会话的一个全局作用域
66、R equest对象的主要方法:
set A ttribute(String na m e,Object):设置名字为na m e的request的参数值
get A ttribute(String na m e):返回由na m e指定的属性值
get A ttribute N a m es():返回request对象所有属性的名字集合,结果是一个枚举的实例getCoo k ies():返回客户端的所有Coo k ie对象,结果是一个Coo k ie数组
getCharacter E ncoding():返回请求中的字符编码方式
getContent L ength():返回请求的B od y的长度
getHeader(String na m e):获得HTT P协议定义的文件头信息
getHeaders(String na m e):返回指定名字的request Header的所有值,结果是一个枚
举的实例
getHeader N a m es():返回所以request Header的名字,结果是一个枚举的实例
get I nputStrea m():返回请求的输入流,用于获得请求中的数据
getMethod():获得客户端向服务器端传送数据的方法
get P ara m eter(String na m e):获得客户端传送给服务器端的有na m e指定的参数值
get P ara m eter N a m es():获得客户端传送给服务器端的所有参数的名字,结果是一个枚
举的实例
get P ara m eter V alues(String na m e):获得有na m e指定的参数的所有值
get P rotocol():获取客户端向服务器端传送数据所依据的协议名称
get Q uer y String():获得查询字符串
get R equest URI():获取发出请求字符串的客户端地址
get R e m ote A ddr():获取客户端的IP地址
get R e m oteHost():获取客户端的名字
getSession([B oolean create]):返回和请求相关Session
getServer N a m e():获取服务器的名字
getServlet P ath():获取客户端所请求的脚本文件的路径
getServer P ort():获取服务器的端口号
re m ove A ttribute(String na m e):删除请求中的一个属性
67、J2EE是技术还是平台还是框架?
J2EE本身是一个标准,一个为企业分布式应用的开发提供的标准平台。
J2EE也是一个框架,包括JDB C、J N DI、R M I、J MS、EJB、J T A等技术。
68、我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个某种编码的字符串?
P ublic String translate (String str) {
String te m pStr = "";
tr y {
te m pStr = new String(str.get By tes("I SO-8859-1"), "GB K");
te m pStr = te m pStr.tri m();
}
catch (Ex ception e) {
S y ste m.err.println(e.getMessage());
}
return te m pStr;
}
69、简述逻辑操作(&,|,^)与条件操作(&&,||)的区别。
区别主要答两点:a.条件操作只能操作布尔型的,而逻辑操作不仅可以操作布尔型,而且
可以操作数值型
b.逻辑操作不会产生短路
70、X M L文档定义有几种形式?它们之间有何本质区别?解析X M L文档有哪几种方式?
a: 两种形式 dtd sche m a,b: 本质区别:sche m a本身是xm l的,可以被X M L解析器解
析(这也是从D T D上发展sche m a的根本目的),c:有D OM,S A X,ST A X等
D OM:处理大型文件时其性能下降的非常厉害。这个问题是由D OM的树结构所造成的,这种结构占用的内存较多,而且D OM必须在解析文件之前把整个文档装入内存,适合对
X M L的随机访问
S A X:不现于D OM,S A X是事件驱动型的X M L解析方式。它顺序读取X M L文件,不需要一次全部装载整个文件。当遇到像文件开头,文档结束,或者标签开头与标签结束时,它会触发一个事件,用户通过在其回调事件中写入处理代码来处理X M L文件,适合对
X M L的顺序访问
ST A X:Strea m ing API for X M L (St A X)
71、简述s y nchroni z ed和java.util.concurrent.loc k s.L oc k的异同 ?
主要相同点:L oc k能完成s y nchroni z ed所实现的所有功能
主要不同点:L oc k有比s y nchroni z ed更精确的线程语义和更好的性能。s y nchroni z ed
会自动释放锁,而L oc k一定要求程序员手工释放,并且必须在finall y从句中释放。72、EJB的角色和三个对象
一个完整的基于EJB的分布式计算结构由六个角色组成,这六个角色可以由不同的开发
商提供,每个角色所作的工作必须遵循Sun公司提供的EJB规范,以保证彼此之间的兼
容性。这六个角色分别是EJB组件开发者(E nterprise B ean P rovider)、应用组合者(A pplication A sse m bler)、部署者(D eplo y er)、EJB服务器提供者(EJB Server
P rovider)、EJB 容器提供者(EJB Container P rovider)、系统管理员(S y ste m
A d m inistrator)
三个对象是R e m ote(L ocal)接口、Ho m e(L ocalHo m e)接口,B ean类
73、EJB容器提供的服务
主要提供声明周期管理、代码产生、持续性管理、安全、事务管理、锁和并发行管理等服务。
74、EJB规范规定EJB中禁止的操作有哪些?
1.不能操作线程和线程API(线程API指非线程对象的方法如notif y,wait等),
2.不能操作awt,
3.不能实现服务器功能,
4.不能对静态属生存取,
5.不能使用I O操作直接存取
文件系统,6.不能加载本地库.,7.不能将this作为变量和返回,8.不能循环调用。
75、re m ote接口和ho m e接口主要作用
re m ote接口定义了业务方法,用于EJB客户端调用业务方法。
ho m e接口是EJB工厂用于创建和移除查找EJB实例
76、bean 实例的生命周期
对于Stateless Session B ean、E ntit y B ean、Message D riven B ean一般存在缓冲池管理,而对于E ntit y B ean和Statefull Session B ean存在Cache管理,通常包含创建实例,设
置上下文、创建EJB Object(create)、业务方法调用、re m ove等过程,对于存在缓冲池管理的B ean,在create之后实例并不从内存清除,而是采用缓冲池调度机制不断重用
实例,而对于存在Cache管理的B ean则通过激活和去激活机制保持B ean的状态并限
制内存中实例数量。
77、EJB的激活机制
以Stateful Session B ean 为例:其Cache大小决定了内存中可以同时存在的B ean实例的数量,根据M RU或N RU算法,实例在激活和去激活状态之间迁移,激活机制是当客户端调用某个EJB实例业务方法时,如果对应EJB Object发现自己没有绑定对应的
B ean实例则从其去激活B ean存储中(通过序列化机制存储实例)回复(激活)此实例。状态变迁前会调用对应的ejb A ctive和ejb P assivate方法。
78、EJB的几种类型
会话(Session)B ean ,实体(E ntit y)B ean 消息驱动的(Message D riven)B ean
会话B ean又可分为有状态(Stateful)和无状态(Stateless)两种
实体B ean可分为B ean管理的持续性(B M P)和容器管理的持续性(CM P)两种
79、客服端调用EJB对象的几个基本步骤
设置J N DI服务工厂以及J N DI服务地址系统属性,查找Ho m e接口,从Ho m e接口调用Create方法创建R e m ote接口,通过R e m ote接口调用其业务方法。
80、如何给weblogic指定大小的内存?
在启动W eblogic的脚本中(位于所在D o m ian对应服务器目录下的
startServer N a m e),增加set M E M_ARG S=-X m s32m-X mx200m,可以调整最小内存
为32M,最大200M
81、如何设定的weblogic的热启动模式(开发模式)与产品发布模式?
可以在管理控制台中修改对应服务器的启动模式为开发或产品模式之一。或者修改服务的启动文件或者co mm env文件,增加set PR O DU CT I O N_MO DE=true。
82、如何启动时不需输入用户名与密码?
修改服务启动文件,增加W L S_U S ER和W L S_P W项。也可以在boot.properties文件中增加加密过的用户名和密码.
83、在weblogic管理制台中对一个应用域(或者说是一个网站,D o m ain)进行j m s 及ejb或连接池等相关信息进行配置后,实际保存在什么文件中?
保存在此D o m ain的config.xm l文件中,它是服务器的核心配置文件。
84、说说weblogic中一个D o m ain的缺省目录结构?比如要将一个简单的
hello W orld.jsp放入何目录下,然的在浏览器上就可打入http://主机:端口
号//helloword.jsp就可以看到运行结果了?又比如这其中用到了一个自己写的java B ean该如何办?
D o m ain目录服务器目录applications,将应用目录放在此目录下将可以作为应用访问,如果是W eb应用,应用目录需要满足W eb应用目录要求,jsp文件可以直接放在应用
目录中,J avabean需要放在应用目录的W EB-I N F目录的classes目录中,设置服务器的缺省应用将可以实现在浏览器上无需输入应用名。
85、在weblogic中发布ejb需涉及到哪些配置文件
不同类型的EJB涉及的配置文件不同,都涉及到的配置文件包括ejb-jar.xm l,weblogic-ejb-jar.xm lCM P实体B ean一般还需要weblogic-c m p-rdb m s-jar.xm l
86、如何在weblogic中进行ssl配置与客户端的认证配置或说说j2ee(标准)进行ssl的配置
缺省安装中使用D e m o I dentit y.j k s和D e m oTrust.j k s K e y Store实现SS L,需要配置服
务器使用E nable SS L,配置其端口,在产品模式下需要从C A获取私有密钥和数字证书,创建identit y和trust k e y store,装载获得的密钥和数字证书。可以配置此SS L连接是单向还是双向的。
87、如何查看在weblogic中已经发布的EJB?
可以使用管理控制台,在它的D eplo ym ent中可以查看所有已发布的EJB
88、CO RBA是什么?用途是什么?
CO RBA 标准是公共对象请求代理结构(Co mm on Object R equest B ro k er
A rchitecture),由对象管理组织 (Object Manage m ent G roup,缩写为 OM G)标准化。它的组成是接口定义语言(IDL), 语言绑定(binding:也译为联编)和允许应用程序间互操作的协议。 其目的为:用不同的程序设计语言书写在不同的进程中运行,为不同的操作系统开发。
89、说说你所熟悉或听说过的j2ee中的几种常用模式?及对设计模式的一些看法Session F acade P attern:使用Session B ean访问E ntit yB ean
Message F acade P attern:实现异步调用
EJB Co mm and P attern:使用Co mm and J ava B eans取代Session B ean,实现轻量级访
问
D ata Transfer Object F actor y:通过D TO F actor y简化
E ntit yB ean数据提供特性
G eneric A ttribute A ccess:通过A ttibute A ccess接口简化E ntit yB ean数据提供特性
B usiness I nterface:通过远程(本地)接口和B ean类实现相同接口规范业务逻辑一致性
EJB架构的设计好坏将直接影响系统的性能、可扩展性、可维护性、组件可重用性及开发效率。项目越复杂,项目队伍越庞大则越能体现良好设计的重要性。
90、说说在weblogic中开发消息B ean时的persistent与non-persisten的差别
persistent方式的M DB可以保证消息传递的可靠性,也就是如果EJB容器出现问题而J MS 服务器依然会将消息在此M DB可用的时候发送过来,而non-persistent方式的消息将被丢弃。
91、Servlet执行时一般实现哪几个方法?
public void init(ServletConfig config)
public ServletConfig getServletConfig()
public String getServlet I nfo()
public void service(Servlet R equest request,Servlet R esponse response)
public void destro y()
92、j2ee常用的设计模式?说明工厂模式。
J ava中的23种设计模式:
F actor y(工厂模式), B uilder(建造模式), F actor y Method(工厂方法模式),
P rotot y pe(原始模型模式),Singleton(单例模式), F acade(门面模式),
A dapter(适配器模式),
B ridge(桥梁模式), Co m posite(合成模式),
D ecorator(装饰模式), F l y weight(享元模式), P ro xy(代理模式),
Co mm and(命令模式), I nterpreter(解释器模式), V isitor(访问者模式),
I terator(迭代子模式), Mediator(调停者模式), Me m ento(备忘录模式),Observer(观察者模式), State(状态模式), Strateg y(策略模式),
Te m plate Method(模板方法模式), Chain Of R esponsibleit y(责任链模式)
工厂模式:工厂模式是一种经常被使用到的模式,根据工厂模式实现的类可以根据提供的数据生成一组类中某一个类的实例,通常这一组类有一个公共的抽象父类并且实现了相同的方法,但是这些方法针对不同的数据进行了不同的操作。首先需要定义一个基类,
该类的子类通过不同的方法实现了基类中的方法。然后需要定义一个工厂类,工厂类可以根据条件生成不同的子类实例。当得到子类的实例后,开发人员可以调用基类中的方法而不必考虑到底返回的是哪一个子类的实例。
93、EJB需直接实现它的业务接口或Ho m e接口吗,请简述理由。
远程接口和Ho m e接口不需要直接实现,他们的实现代码是由服务器产生的,程序运行中对应实现类会作为对应接口类型的实例被使用。
94、排序都有哪几种方法?请列举。用JAVA实现一个快速排序。
排序的方法有:插入排序(直接插入排序、希尔排序),交换排序(冒泡排序、快速排序),选择排序(直接选择排序、堆排序),归并排序,分配排序(箱排序、基数排序)快速排序的伪代码。
//使用快速排序方法对a[ 0 :n- 1 ]排序
从a[ 0 :n- 1 ]中选择一个元素作为m i d d l e,该元素为支点
把余下的元素分割为两段left 和r i g h t,使得l e f t中的元素都小于等于支点,而right 中的元素都大于等于支点
递归地使用快速排序方法对left 进行排序
递归地使用快速排序方法对right 进行排序
所得结果为l e f t +m i d d l e + r i g h t
95、请对以下在J2EE中常用的名词进行解释(或简单描述)
web容器:给处于其中的应用程序组件(J S P,S ERVLE T)提供一个环境,使
J S P,S ERVLE T直接更容器中的环境变量接**互,不必关注其它系统问题。主要有W EB服务器来实现。例如:TOMC A T,W EBL O GI C,W EB S P H ERE等。该容器提供的接口严格遵守J2EE规范中的W EB APPLI C A T I O N 标准。我们把遵守以上标准的W EB服务器就叫做J2EE 中的W EB容器。
EJB容器:E nterprise java bean 容器。更具有行业领域特色。他提供给运行在其中的组件EJB各种管理功能。只要满足J2EE规范的EJB放入该容器,马上就会被容器进行高效率的管理。并且可以通过现成的接口来获得系统级别的服务。例如邮件服务、事务管理。
J N DI:(J ava N a m ing &D irector y I nterface)JAVA命名目录服务。主要提供的功能是:提供一个目录系统,让其它各地的应用程序在其上面留下自己的索引,从而满足快速查找和定位分布式应用程序的功能。
J MS:(J ava Message Service)JAVA消息服务。主要实现各个应用程序之间的通讯。包括点对点和广播。
J T A:(J ava Transaction API)JAVA事务服务。提供各种分布式事务服务。应用程序只需调用其提供的接口即可。
JAF:(J ava A ction F ra m e W or k)JAVA安全认证框架。提供一些安全控制方面的框架。让开发者通过各种部署和自定义实现自己的个性安全控制策略。
R M I/II O P:(R e m ote Method I nvocation /internet对象请求中介协议)他们主要用于通过远程调用服务。例如,远程有一台计算机上运行一个程序,它提供股票分析服务,我们可以在本地计算机上实现对其直接调用。当然这是要通过一定的规范才能在异构的系统之间进行通信。R M I是JAVA特有的。
96、JAVA语言如何进行异常处理,关键字:throws,throw,tr y,catch,finall y分别代表什么意义?在tr y块中可以抛出异常吗?
J ava通过面向对象的方法进行异常处理,把各种不同的异常进行分类,并提供了良好的接口。在J ava中,每个异常都是一个对象,它是Throwable类或其它子类的实例。当一
个方法出现异常后便抛出一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获到这个异常并进行处理。J ava的异常处理是通过5个关键词来实现的:
tr y、catch、throw、throws和finall y。一般情况下是用tr y来执行一段程序,如果出现异常,系统会抛出(throws)一个异常,这时候你可以通过它的类型来捕捉(catch)它,或
最后(finall y)由缺省处理器来处理。
用tr y来指定一块预防所有"异常"的程序。紧跟在tr y程序后面,应包含一个catch子句
来指定你想要捕捉的"异常"的类型。
throw语句用来明确地抛出一个"异常"。
throws用来标明一个成员函数可能抛出的各种"异常"。
F inall y为确保一段代码不管发生什么"异常"都被执行一段代码。
可以在一个成员函数调用的外面写一个tr y语句,在这个成员函数内部写另一个tr y语
句保护其他代码。每当遇到一个tr y语句,"异常"的框架就放到堆栈上面,直到所有的
tr y语句都完成。如果下一级的tr y语句没有对某种"异常"进行处理,堆栈就会展开,直
到遇到有处理这种"异常"的tr y语句。
java面试笔试题大汇总(2) [转]
97、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?
可以。必须只有一个类名与文件名相同。
98、M V C的各个部分都有那些技术来实现?如何实现?
M V C是Model-V iew-Controller的简写。"Model" 代表的是应用的业务逻辑(通过
J ava B ean,EJB组件实现), "V iew" 是应用的表示面(由J S P页面产生),"Controller" 是提供应用的处理过程控制(一般是一个Servlet),通过这种设计模型把应用逻辑,
处理过程和显示逻辑分成不同的组件实现。这些组件可以进行交互和重用。
99、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()
和suspend()方法为何不推荐使用?
有两种实现方法,分别是继承Thread类与实现R unnable接口
用s y nchroni z ed关键字修饰同步方法
反对使用stop(),是因为它不安全。它会解除由线程获取的所有锁定,而且如果对象处
于一种不连贯状态,那么其他线程能在那种状态下检查和修改它们。结果很难检查出真正的问题所在。suspend()方法容易发生死锁。调用suspend()的时候,目标线程会停下来,但却仍然持有在这之前获得的锁定。此时,其他任何线程都不能访问锁定的资源,除非被"挂起"的线程恢复运行。对任何线程来说,如果它们想恢复目标线程,同时又试图使
用任何一个锁定的资源,就会造成死锁。所以不应该使用suspend(),而应在自己的Thread类中置入一个标志,指出线程应该活动还是挂起。若标志指出线程应该挂起,便用wait()命其进入等待状态。若标志指出线程应当恢复,则用一个notif y()重新启动线程。100、java中有几种类型的流?JD K为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?
字节流,字符流。字节流继承于I nputStrea m OutputStrea m,字符流继承于
I nputStrea mR eader OutputStrea m W riter。在java.io包中还有许多其他的流,主要是为了提高性能和使用方便。
101、java中会存在内存泄漏吗,请简单描述。
会。如:int i,i2; return (i-i2); //when i为足够大的正数,i2为足够大的负数。结果会造
成溢位,导致错误。
102、java中实现多态的机制是什么?
方法的重写Overriding和重载Overloading是J ava多态性的不同表现。重写Overriding 是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。103、垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?
对于G C来说,当程序员创建对象时,G C就开始监控这个对象的地址、大小以及使用情况。通常,G C采用有向图的方式记录和管理堆(heap)中的所有对象。通过这种方式确定哪些对象是"可达的",哪些对象是"不可达的"。当G C确定一些对象为"不可达"时,G C就有责任回收这些内存空间。可以。程序员可以手动执行S y ste m.gc(),通知G C运行,但是J ava语言规范并不保证G C一定会执行。
104、静态变量和实例变量的区别?
static i = 10; //常量
class A a; a.i =10;//可变
105、什么是java序列化,如何实现java序列化?
序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。
序列化的实现:将需要被序列化的类实现Seriali z able接口,该接口没有需要实现的方法,i m ple m ents Seriali z able只是为了标注该对象是可被序列化的,然后使用一个输出流(如:F ileOutputStrea m)来构造一个ObjectOutputStrea m(对象流)对象,接着,使用ObjectOutputStrea m对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。
106、是否可以从一个static方法内部发出对非static方法的调用?
不可以,如果其中包含对象的m ethod();不能保证对象初始化.
107、写clone()方法时,通常都有一行代码,是什么?
Clone 有缺省行为,super.clone();他负责产生正确大小的空间,并逐位复制。
108、在JAVA中,如何跳出当前的多重嵌套循环?
用brea k; return 方法。
109、L ist、Map、Set三个接口,存取元素时,各有什么特点?
L ist 以特定次序来持有元素,可有重复元素。Set 无法拥有重复元素,内部排序。Map 保存k e y-value值,value可多值。
110、J2EE是什么?
J2EE是Sun公司提出的多层(m ulti-diered),分布式(distributed),基于组件(co m ponent-base)的企业级应用模型(enterpriese application m odel).在这样的一个应用系统中,可按照功能划分为不同的组件,这些组件又可在不同计算机上,并且处于相应的层次(tier)中。所属层次包括客户层(clietn tier)组件,web层和组件,B usiness层和组件,企业信息系统(EI S)层。
111、U M L方面
标准建模语言U M L。用例图,静态图(包括类图、对象图和包图),行为图,交互图(顺序图,合作图),实现图。
112、说出一些常用的类,包,接口,请各举5个
常用的类:B uffered R eader B uffered W riter F ile R eader F ile W irter String I nteger
常用的包:https://www.wendangku.net/doc/0e10441643.html,ng java.awt java.io java.util java.sql
常用的接口:R e m ote L ist Map D ocu m ent N ode L ist
113、开发中都用到了那些设计模式?用在什么场合?
每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案的核心。通过这种方式,你可以无数次地使用那些已有的解决方案,无需在重复相同的工作。主要用到了M V C的设计模式。用来开发J S P/Servlet或者J2EE的相关应用。简单工厂模式等。
114、jsp有哪些动作?作用分别是什么?
J S P共有以下6种基本动作 jsp:include:在页面被请求的时候引入一个文件。
jsp:use B ean:寻找或者实例化一个J ava B ean。 jsp:set P ropert y:设置J ava B ean的属性。jsp:get P ropert y:输出某个J ava B ean的属性。 jsp:forward:把请求转到一个新的页面。jsp:plugin:根据浏览器类型为J ava插件生成O BJE CT或E M BED标记。
115、A non ym ous I nner Class (匿名内部类) 是否可以e x tends(继承)其它类,是否可以i m ple m ents(实现)interface(接口)?
可以继承其他类或完成其他接口,在swing编程中常用此方式。
116、应用服务器与W EB S ERVER的区别?
应用服务器:W eblogic、To m cat、J boss
W EB S ERVER:II S、A pache
117、B S与CS的联系与区别。
C/S是Client/Server的缩写。服务器通常采用高性能的P C、工作站或小型机,并采用大型数据库系统,如Oracle、S y base、I nfor m i x或 S QL Server。客户端需要安装专用的客户端软件。
B/S是B rower/Server的缩写,客户机上只要安装一个浏览器(B rowser),如
N etscape N avigator或I nternet Ex plorer,服务器安装Oracle、S y base、I nfor m i x或 S QL Server等数据库。在这种结构下,用户界面完全通过WWW浏览器实现,一部分事务逻辑在前端实现,但是主要事务逻辑在服务器端实现。浏览器通过Web Server 同数据库进行数据交互。
C/S 与B/S 区别:
1.硬件环境不同:
C/S 一般建立在专用的网络上, 小范围里的网络环境, 局域网之间再通过专门服务器提供连接和数据交换服务.
B/S 建立在广域网之上的, 不必是专门的网络硬件环境,例与电话上网, 租用设备. 信息自己管理. 有比C/S更强的适应范围, 一般只要有操作系统和浏览器就行
2.对安全要求不同
C/S 一般面向相对固定的用户群, 对信息安全的控制能力很强. 一般高度机密的信息系统采用C/S 结构适宜. 可以通过B/S发布部分可公开信息.
B/S 建立在广域网之上, 对安全的控制能力相对弱, 可能面向不可知的用户。
3.对程序架构不同
C/S 程序可以更加注重流程, 可以对权限多层次校验, 对系统运行速度可以较少考虑. B/S 对安全以及访问速度的多重的考虑, 建立在需要更加优化的基础之上. 比C/S有更高的要求B/S结构的程序架构是发展的趋势, 从MS的.N et系列的B i z Tal k2000
Ex change 2000等, 全面支持网络的构件搭建的系统. S U N 和IB M推的J ava B ean 构件技术等,使 B/S更加成熟.
4.软件重用不同
C/S 程序可以不可避免的整体性考虑, 构件的重用性不如在B/S要求下的构件的重用性好.
B/S 对的多重结构,要求构件相对独立的功能. 能够相对较好的重用.就入买来的餐桌可以再利用,而不是做在墙上的石头桌子
5.系统维护不同
C/S 程序由于整体性, 必须整体考察, 处理出现的问题以及系统升级. 升级难. 可能是再做一个全新的系统
B/S 构件组成,方面构件个别的更换,实现系统的无缝升级. 系统维护开销减到最小.用户从网上自己下载安装就可以实现升级.
6.处理问题不同
C/S 程序可以处理用户面固定, 并且在相同区域, 安全要求高需求, 与操作系统相关. 应该都是相同的系统
B/S 建立在广域网上, 面向不同的用户群, 分散地域, 这是C/S无法作到的. 与操作系统平台关系最小.
7.用户接口不同
C/S 多是建立的W indow平台上,表现方法有限,对程序员普遍要求较高
B/S 建立在浏览器上, 有更加丰富和生动的表现方式与用户交流. 并且大部分难度减低,减低开发成本.
8.信息流不同
C/S 程序一般是典型的中央集权的机械式处理, 交互性相对低
B/S 信息流向可变化, B-B B-C B-G等信息、流向的变化, 更像交易中心。
118、LI N U X下线程,GDI类的解释。
LI N U X实现的就是基于核心轻量级进程的"一对一"线程模型,一个线程实体对应一个核心轻量级进程,而线程之间的管理在核外函数库中实现。
GDI类为图像设备编程接口类库。
119、ST RU TS的应用(如ST RU TS架构)
Struts是采用J ava Servlet/J avaServer P ages技术,开发W eb应用程序的开放源码的fra m ewor k。 采用Struts能开发出基于M V C(Model-V iew-Controller)设计模式的应用构架。 Struts有如下的主要功能: 一.包含一个controller servlet,能将用户的请求发送到相应的A ction对象。 二.J S P自由tag库,并且在controller servlet中提供关联支持,帮助开发员创建交互式表单应用。 三.提供了一系列实用对象:X M L处理、通过J ava reflection API s自动处理J ava B eans属性、国际化的提示和消息。
120、J do是什么?
JD O是J ava对象持久化的新的规范,为java data object的简称,也是一个用于存取某种数据仓库中的对象的标准化API。JD O提供了透明的对象存储,因此对开发人员来说,存储数据对象完全不需要额外的代码(如JDB C API的使用)。这些繁琐的例行工作已经转移到JD O产品提供商身上,使开发人员解脱出来,从而集中时间和精力在业务逻辑上。另外,JD O很灵活,因为它可以在任何数据底层上运行。JDB C只是面向关系数据库(RDB MS)JD O更通用,提供到任何数据底层的存储功能,比如关系数据库、文件、X M L 以及对象数据库(O DB MS)等等,使得应用可移植性更强。
121、内部类可以引用他包含类的成员吗?有没有什么限制?
一个内部类对象可以访问创建它的外部类对象的内容
122、W EB S ERVI C E名词解释。J S W DL开发包的介绍。JA X P、JA X M的解释。SO AP、UDDI,W S DL解释。
W eb Service W eb Service是基于网络的、分布式的模块化组件,它执行特定的任务,遵守具体的技术规范,这些规范使得W eb Service能与其他兼容的组件进行互操作。
JA X P(J ava API for X M L P arsing) 定义了在J ava中使用D OM, S A X, X S L T的通用的接口。这样在你的程序中你只要使用这些通用的接口,当你需要改变具体的实现时候也不需要修改代码。
JA X M(J ava API for X M L Messaging) 是为SO AP通信提供访问方法和传输机制的API。W S DL是一种X M L格式,用于将网络服务描述为一组端点,这些端点对包含面向文档信息或面向过程信息的消息进行操作。这种格式首先对操作和消息进行抽象描述,然后将其绑定到具体的网络协议和消息格式上以定义端点。相关的具体端点即组合成为抽象端点(服务)。
SO AP即简单对象访问协议(Si m ple Object A ccess P rotocol),它是用于交换X M L编码信息的轻量级协议。
UDDI 的目的是为电子商务建立标准;UDDI是一套基于W eb的、分布式的、为W eb Service提供的、信息注册中心的实现标准规范,同时也包含一组使企业能将自身提供的W eb Service注册,以使别的企业能够发现的访问协议的实现标准。
JAVA代码查错
1.
abstract class N a m e {
private String na m e;
public abstract boolean isStupid N a m e(String na m e) { }
}
大侠们,这有何错误?
答案: 错。abstract m ethod必须以分号结尾,且不带花括号。
2.
public class So m ething {
void doSo m ething () {
private String s = "";
int l = s.length();
}
}
有错吗?
答案: 错。局部变量前不能放置任何访问修饰符 (private,public,和protected)。final可以用来修饰局部变量
(final如同abstract和strictfp,都是非访问修饰符,strictfp只能修饰class和m ethod 而非variable)。
3.
abstract class So m ething {
private abstract String doSo m ething ();
}
这好像没什么错吧?
答案: 错。abstract的m ethods不能以private修饰。abstract的m ethods就是让子类i m ple m ent(实现)具体细节的,怎么可以用private把abstract
m ethod封锁起来呢? (同理,abstract m ethod前不能加final)。
4.
public class So m ething {
public int addOne(final int x) {
return ++x;
}
}
这个比较明显。
答案: 错。int x被修饰成final,意味着x不能在addOne m ethod中被修改。
5.
public class So m ething {
public static void m ain(String[] args) {
Other o = new Other();
new So m ething().addOne(o);
}
public void addOne(final Other o) {
o.i++;
}
}
class Other {
public int i;
}
和上面的很相似,都是关于final的问题,这有错吗?
答案: 正确。在addOne m ethod中,参数o被修饰成final。如果在addOne m ethod里我们修改了o的reference
(比如: o = new Other();),那么如同上例这题也是错的。但这里修改的是o的m e m ber vairable
(成员变量),而o的reference并没有改变。
6.
class So m ething {
int i;
public void doSo m ething() {
S y ste m.out.println("i = " + i);
}
}
有什么错呢? 看不出来啊。
答案: 正确。输出的是"i = 0"。int i属於instant variable (实例变量,或叫成员变量)。instant variable有default value。int的default value是0。
7.
class So m ething {
final int i;
public void doSo m ething() {
S y ste m.out.println("i = " + i);
}
}
和上面一题只有一个地方不同,就是多了一个final。这难道就错了吗?
答案: 错。final int i是个final的instant variable (实例变量,或叫成员变量)。final的instant variable没有default value,必须在constructor (构造器)结束之前被赋予一个
明确的值。可以修改为"final int i = 0;"。
8.
public class So m ething {
public static void m ain(String[] args) {
So m ething s = new So m ething();
S y ste m.out.println("s.doSo m ething() returns " + doSo m ething());
}
public String doSo m ething() {
return "D o so m ething ...";
}
}
看上去很完美。
答案: 错。看上去在m ain里call doSo m ething没有什么问题,毕竟两个m ethods都在同一个class里。但仔细看,m ain是static的。static m ethod不能直接call non-static
m ethods。可改成"S y ste m.out.println("s.doSo m ething() returns " + s.doSo m ething());"。同理,static m ethod不能访问non-static instant variable。
9.
此处,So m ething类的文件名叫OtherThing.java
class So m ething {
private static void m ain(String[] so m ething_to_do) {
S y ste m.out.println("D o so m ething ...");
}
}
这个好像很明显。
答案: 正确。从来没有人说过J ava的Class名字必须和其文件名相同。但public class的名字必须和文件名相同。
10.
interface A{
int x = 0;
}
class B{
int x =1;
}
class C e x tends B i m ple m ents A {
public void p X(){
史上最全Java基础知识点归纳 写这篇文章的目的是想总结一下自己这么多年来使用Java的一些心得体会,主要是和一些Java基础知识点相关的,所以也希望能分享给刚刚入门的Java 程序员和打算入Java开发这个行当的准新手们,希望可以给大家一些经验,能让大家更好学习和使用Java。 这次介绍的主要内容是和J2SE相关的部分,另外,会在以后再介绍些J2EE 相关的、和Java中各个框架相关的内容。 经过这么多年的Java开发,以及结合平时面试Java开发者的一些经验,我觉得对于J2SE方面主要就是要掌握以下的一些内容。 1.JVM相关(包括了各个版本的特性) 对于刚刚接触Java的人来说,JVM相关的知识不一定需要理解很深,对此里面的概念有一些简单的了解即可。不过对于一个有着3年以上Java经验的资
深开发者来说,不会JVM几乎是不可接受的。 JVM作为Java运行的基础,很难相信对于JVM一点都不了解的人可以把Java语言吃得很透。我在面试有超过3年Java经验的开发者的时候,JVM几乎就是一个必问的问题了。当然JVM不是唯一决定技术能力好坏的面试问题,但是可以佐证Java开发能力的高低。 在JVM这个大类中,我认为需要掌握的知识有: JVM内存模型和结构 GC原理,性能调优 调优:Thread Dump,分析内存结构 class二进制字节码结构,class loader体系,class加载过程,实例创建过程 方法执行过程 Java各个大版本更新提供的新特性(需要简单了解) 2.Java的运行(基础必备) 这条可能出看很简单,Java程序的运行谁不会呢?不过很多时候,我们只是单纯通过IDE去执行Java程序,底层IDE又是如何执行Java程序呢?很多人并不了解。
j a v a面向对象精华总 结
Java面向对象精华总结 面向对象是相对面向过程而言的,面向过程强调的是功能行为,面向对象是将功能封装进对象,强调具备了功能的对象。 面试官若问什么是面向对象(开放式问题,回答必须有自己的体会): 1、面向对象是一种思想,可以使复杂的问题简单化,可以使我们从执行者变成 指挥者 2、结合实际场景举个例子说明:面试官就是在用面向对象的思想思考问题,公 司里面现在有招人的需求,说明公司现在的业务量比较大,代表着公司在蓬勃发展,你需要找一些具有专业编程经验的人来帮你完成公司的工作,我就是那个对象,我具备专业编程的功能,你就是在指挥我做事情,就是使用我的功能,来为公司创造效益。【万物皆对象】 面向对象三大特征:封装、继承、多态 类和对象的关系: 类:对现实生活中事物的描述 对象:就是这类事物,实实在在存在个体 描述事物就是描述事物的属性(对应类中变量)和行为(对应类中方法),属性和行为共同称为类的成员(成员变量和成员方法) 成员变量作用于整个类中,局部变量作用于函数中,或者语句中 成员变量在堆内存中,因为对象的存在,才在内存中存在,局部变量:存在栈内存中 封装(Encapsulation):是指隐藏对象的属性和实现细节,仅对外提供公共访问方式
好处:将变化隔离、便于使用、提高重用性、提高安全性 封装原则:将不需要对外提供的内容都隐藏起来,把属性都隐藏,提供公共方法对其访问 private(私有):权限修饰符,用于修饰类中的成员(成员变量,成员函数),私有只在本类中有效。 static用于修饰成员(成员变量和成员函数) 被修饰的成员:随着类的加载而加载,优先于对象存在,被所有对象所共享,可以直接被类名调用。类名.静态成员【方法区、共享区、数据区】----存放类中的方法和共享数据。 什么时候定义静态函数:当功能内部没有访问到非静态数据(对象的特有数据),那么该功能可以定义成静态的,用类名直接调用。 Eg:获取数组的最大值 class ArrayTool { public static void main(String[] args) { int[] arr={5,8,4,1,3,5,8,77,55,99}; int max=GetMax.getMax(arr); System.out.println("max="+max); } } class GetMax { public static int getMax(int[] arr) { int max=0; for(int x=0;x
java的心得体会 篇一:java初学者学习心得 学习Java心得体会 学习了一学期的Java课程,觉得是该总结自己的心得体会了。开始学习任何一门课,兴趣最重要。一直觉得自己在学计算机编程语言,学习了很多,但每门语言都停留在知识边缘地带,都没深入到它们的精华部分,对它们的精华部分知之甚少,于是趁学校开设这门课,并且有自己的老师讲解,还有了上机的机会,比自己自学省事多了,于是鼓足信心,开始了漫长的java征途。 还记得我编写的第一个经典程序“hello Word”。从那时起我已开始走进Java的世界。当时自己不是很理解为什么main方法一定要这样来定义public static void main,能不能不这样写?问了好多同学,他们告诉我的答案是一样的“java本身要求就是这样子的”,但我自己不甘心,就进行了下面的好多操作:把main改个名字运行一下,看看报什么错误,然后根据出错信息进行分析;把main的public 取掉,在试试看,报什么错误;static去掉还能不能运行;不知道main方法是否一定要传一个String[]数组的,把String[]改掉,改成int[],或者String试试看;不知道是否必须写args参数名称的,也可以把args改成别的名字,
看看运行结果如何。结果把Hello World程序反复改了七八次,不断运行,分析运行结果,最后就彻底明白为什么了main方法是这样定义的了。接着在以后的学习中我也采用这样的方法解决问题,却发现自己的速度比别人慢了好多,我就把自己的课余时间也分一部分给了java。 因为基础是最重要的,只有基础牢固才有可能对后面的学习有更加深刻的认识! 学习一门新的语言,参考书是离不开的。听老师说订的教材偏难,不适合我们初学者,于是我在图书馆借了参考书(一本篇幅较短的入门书来学习那些最简单、最基本的东西,包括学习Java语法等)。同时,对一个最简单的程序也应该多去调试,多想想如果改动一下会出现什么结果?为什么必须那样写?多去想想这些问题然后去操作,会让你有更多的收获。这样反复地思考是很有用的。 在学习Java的语法时,Java的语法是类似c语言的,所以学习的比较轻松。唯一需要注意的是有几个不容易搞清楚的关键字的用法,public,protected,private,static,什么时候用,为什么要用,怎么用,和同学一起讨论了好久才得以解决。 在学习Java的面向对象的编程语言的特性。比如继承,构造器,抽象类,接口,方法的多态,重载,覆盖,Java的异常处理机制。对于一个没有面向对象语言背景的人来说,
Created by AIwen on 2017/5/14. java是面向对象的程序设计语言;类可被认为是一种自定义的数据类型,可以使用类来定义变量,所有使用类定义的变量都是引用变量,它们将会引用到类的对象。类用于描述客观世界里某一类对象的共同特征,而对象则是类的具体存在,java程序使用类的构造器来创建该类的对象。 java也支持面向对象的三大特征:封装、继承、和多态。java提供了private、protected、和public三个访问控制修饰符来实现良好的封装,提供了extends关键字让子类继承父类,子类继承父类就可以继承到父类的成员变量和和方法,如果访问控制允许,子类实例可以直接调用父类里定义的方法。继承是实现类复用的重要手段。使用继承关系来实现复用时,子类对象可以直接赋给父类变量,这个变量具有多态性。 面向对象的程序设计过程中有两个重要的概念:类(Class)和对象(object,也被称为实例,instance)。类可以包含三种最常见的成员:构造器、成员变量、和方法。 构造器用于构造该类的实例,java语言通过new关键字类调用构造器,从而返回该类的实例。构造器是一个类创建对象的根本途径,如果一个类没有构造器,这个类通常无法创建实例。因此java语言提供了一个功能:如果程序员没有为一个类编写构造器,则系统会为该类提供一个默认的构造器,这个构造器总是没有参数的。一旦程序员为一个类提供了构造器,系统将不再为该类提供构造器。 构造器用于对类实例进行初始化操作,构造器支持重载,如果多个重载的构造器里包含了相同的初始化代码,则可以把这些初始化代码放置在普通初始化块里完成,初始化块总在构造器执行之前被调用。静态初始化块代码用于初始化类,在类初始化阶段被执行。如果继承树里某一个类需要被初始化时,系统将会同时初始化该类的所有父类。 构造器修饰符:可以是public、protected、private其中之一,或者省略构造器名:构造器名必须和类名相同。 注意:构造器既不能定义返回值类型,也不能使用void声明构造器没有返回值。如果为构造器定义了返回值类型,或使用void声明构造器没有返回值,编译时不会出错,但java会把这个所谓的构造器当成方法来处理——它就不再是构造器。 实际上类的构造器是有返回值的,当使用new关键字来调用构造器时,构造器返回该类的实例,可以把这个类的实例当成构造器的返回值。因此构造器的返回值类型总是当前类,无须定义返回值类型。不要在构造器里显式的使用return来返回当前类的对象,因为构造器的返回值是隐式的。 java类名必须是由一个或多个有意义的单词连缀而成的,每个单词首字母大写,其他字母全部小写,单词与单词之间不要使用任何分隔符。 成员变量: 成员变量的修饰符:public、protected、private、static、final前三个只能出现一个再和后面的修饰符组合起来修饰成员变量,也可省略。 成员变量:由一个或者多个有意义的单词连缀而成,第一个单词首字母小写,后面每个单词首字母大写,其他字母全部小写,单词与单词之间不要使用任何分隔符。 类型:可以是java语言允许的任何数据类型,包括基本类型和引用类型。 成员方法: 方法修饰符:public、protected、private、static、final、abstract,前三个只能出现一个,static和final最多只能出现其中的一个,和abstract组合起来使用。也可省略。 返回值类型:可以是java语言的允许的任何数据类型,包括基本类型和引用类型。 方法名:和成员变量的方法命名规则相同,通常建议方法名以英文动词开头。 方法体里多条可执行语句之间有严格的执行顺序,排在方法体前面的语句总先执行,排在方法体后面的语句总是后执行。 static是一个特殊的关键字,它可用于修饰方法、成员变量等成员。static修饰的成员表明它属于这个类本身,而
目录 第一章 Java入门 (2) 第二章 Java基础 (5) 第三章条件转移 (16) 第四章循环语句 (22) 第五章方法 (28) 第六章数组 (35) 第七章面向对象 (44) 第八章异常 (65)
第一章Java入门 知识点汇总 1、JAVA 三大体系 ?Java SE:(J2SE,Java2 Platform Standard Edition,标准版),三个平台中最核心 的部分,包含Java最核心的类库。 ?JavaEE:(J2EE,Java 2 Platform, Enterprise Edition,企业版),开发、装 配、部署企业级应用,包含Servlet、JSP、 JavaBean、JDBC、EJB、Web Service等。 ?Java ME:(J2ME,Java 2 Platform Micro Edition,微型版),用于小型电子设备 上的软件开发。 2、JDK,JRE,JVM的作用及关系 作用 ★JVM:保证Java语言跨平台 ★JRE:Java程序的运行环境 ★JDK:Java程序的开发环境 关系 ★JDK:JRE+工具 ★JRE:JVM+类库 3、JDK环境变量配置 ?path环境变量:存放可执行文件的存 放路径,路径之间用逗号隔开 ?classpath环境变量:类的运行路径, JVM在运行时通过classpath加载需要 的类 4、重点掌握两个程序 ?javac.exe:Java编译器工具,可以将编 写好的Java文件(.java)编译成Java 字节码文件(.class); ?java.exe:Java运行工具,启动Java虚 拟机进程,运行编译器生成的字节码 文件(.class) 5、一切程序运行的入口 public static void main(String args []){ System.out.println(“Hello World!”); } 课堂笔记
j a v a面向对象知识点总 结 Company Document number:WTUT-WT88Y-W8BBGB-BWYTT-19998
1 类和对象 类: 类是用来描述一类事物的共性内容的, 类是抽象的; 创建类,如何描述 属性功能 用变量来描述属性 用方法来描述功能 对象: 就是现实中具体的事物,对象是具体的; 创建对象 类名对象名 = new 类名(); 如何通过对象访问类中属性和方法呢 对象名.变量名 对象名.方法名(); 只要是new的对象,就是新创建的,就会在内存中开辟一段单独的空间匿名对象 创建的对象没有赋值给具体的变量; 所以给匿名对象的属性赋值是没有任何意义的; 匿名对象使用场景
1 调用方法 2 作为参数传递 3 添加进容器中 This 关键字 This. 类中的普通方法访问到的成员前边都有this.这个关键字This. 就代表当前对象, 普通方法, 创建对象调方法, 谁调用就代表谁 This(); 可以用来在构造函数中调用本类与之相对应的构造函数使用注意事项: 1 this() 只能是构造函数的第一条执行语句 2 this() 不能在构造函数之间相互调用 3 this() 不能调用自己 构造函数(方法) 构造函数的作用 用来给对象进行初始话的(初始化就是指给对象的各个属性赋值) 构造函数何时执行 对象一创建就会调用与之相对应的构造函数
构造函数语法 修饰符没有返回值类型类名(参数列表){ 具体执行的代码 } 构造函数自动添加 当一个类中我们没有明确指定构造函数的话,jvm会自动帮我们添加一个空参数的构造, 如果我们指定了,就不添加了 构造函数和普通函数的区别 执行时机不同 对象一创建就会调用与之相对应的构造函数 普通函数只有被调用才会执行 return 1 就是用来在方法中返回具体结果(结果类型必须和方法的返回值类型一致) 2 即便方法的返回值类型是void,方法中也可以出现 return; 3 构造函数中也可以有return关键字 成员变量和局部变量 1 作用范围不同, 成员变量是定义在类中的,在整个类中都起作用 局部变量是定义在方法中的,在所在代码块起作用
Java面向对象程序设计实验课的心得体会经过这几周对Java面向对象程序设计的学习,让我更加了解到Java学习的重要性。 在实验课上,我们完成多个实验,在这个阶段的学习中,我从认识到熟悉,而后到能够自主运用。通过对Java的了解,我发现它确实有很多方便之处,它集抽象性、封装性、继承性和多态性于一体,实现了代码重用和代码扩充,提高了软件开发的效率。对于我们这个专业来说学好Java语言是很重要的,所以在实验的过程中我都尽力理解java编程思想、掌握基本技巧,尽量学到最多的知识。 学习程序设计的基本目的就是培养描述实际问题的程序化解决方案的关键技能,Java面向对象程序设计是一门实践性比较强的课程,在实际中,我们必须把理论和实践结合起来。在实验中,我们理解理论课上的知识,然后运用到实际的操作中,我们必须在现有的理论的基础上,进行实践。多次实验后,也让我看到了现在学习的一个很大弱点:只听不练,永远不会熟练运用;空记技巧,忽略思想,会在多变的习题中十分无奈。 Java思想:Java是一门面向对向语言,他定义一切都是对象面向对象,就是面对现实; 现实中的一切都是对象,他们有分类,就产生了“类”; 他们有不同,类和类之间的不同,使用类来区分; 同一个类中不同的对象的区别,使用成员区分。
所以,面向对象的内部逻辑是分类。 面向对象编程思想就象数学上的一些概念,如:空间、群、环、域等 原始的编程思想就象古典数学,人们只在一个集合上探讨问题,没有系统的方法(即运算)定义,于是仁者见仁、智者见智,这样在一定程度上造成了理论的一种混乱局面,不利于科学的发展。于是近代数学向公理化发展,这是什么意思呢?就是说,人们除了在限定论域(即上面的集合,面向对象也有此概念)外,还在此论域上加进了一套通用的、公认的运算(方法);集合加上集合上定义的运算就构成了数学上的空间、群等,在计算机领域里,就变成为“类”。这种集合上定义了操作的东西利用起来就方便多了,这使得人们讨论问题时都在给定集合的运算能力上下工夫,即有通用性可事半功倍。 面向对象的编程思想就要想近世代数的分析思想,首先要确定“论域”,即工程所涉及到的所有的“对象”,然后要分类处理,把隶属同一类别的对象集合在一起(做成一个集合),定义他们之间的运算性质及可以进行的操作,这样就构建了一个类,当然以后用到这个类的对象时都要通过已经定义了的操作来完成各项功能,这就是常要求的类的“类的成员变量要通过共有函数来操作”。 我想真正的面向对象编程思想不应该是编程思想,应该是面向对象的分析方法才对! 我的理解: 1、将分析过程为抽象的过程:简言之:分成多个小问题(组成部分),
心得体会 此次只实训了短短的三周。虽说时间很短,但其中的每一天都使我收获很大、受益匪浅, 它不但极大地加深了我对一些理论知识的理解,不仅使我在理论上对java有了全新的认识, 在实践能力上也得到了提高,真正地做到了学以致用,更学到了很多做人的道理,对我来说 受益非浅。除此以外,我知道了什么叫团队,怎样和团队分工合作;同时我还学会了如何更好 地与别人沟通,如何更好地去陈述自己的观点,如何说服别人认同自己的观点。这也是第一 次让我亲身感受到理论与实际的相结合,让我大开眼界。也是对以前所学知识的一个初审吧! 这次实训对于我以后学习、找工作也是受益菲浅的,在短短的三周中相信这些宝贵的经验会 成为我今后成功的重要的基石;这对于我的学业,乃至我以后人生的影响无疑是极其深远的。 这次实训虽然是我们的第一次,不过同学们表现不错,由此看来,我们在进入大学的这 几个月里学到了不少的专业知识,只是自己感觉不到而已。对于所学专业,我们不能过于自 卑和担忧,否则会妨碍自己学习。实训是学习java的重要环节,有利于我们巩固专业知识、 掌握工作技能,提高就业筹码。 我把本次为期三周的实训看作是“理论与实践相结合的桥梁”。通过这周的实训和学习, 我知道了此次实训的目的,也清楚目前自己的不足,那就是缺乏相应的知识与经验,对所学 的专业知识不能够很好地运用于实践操作。正所谓“百闻不如一见”,经过这次自身的切身实 践,我才深切地理会到了“走出课堂,投身实践”的必要性。平时,我们只能在课堂上与老 师一起纸上谈兵,思维的认识基本上只是局限于课本的范围之内,也许就是这个原因就导致 我们对专业知识认识的片面性,使得我们只知所以然,而不知其之所以然!限制了我们网络 知识水平的提高。但是课本上所学到的理论知识是为我们的实际操作指明了方向、提供相应 的方法,真正的职业技巧是要我们从以后的实际工作中慢慢汲取的。而针对实际操作中遇到 的一些特殊的问题,我们不能拘泥于课本,不可纯粹地“以本为本”。 在这次实训中我得到了许多收获,我第一次体会到java工程师的工作是什么样子的,也 发现了很多不曾注意到的细节,在实训的演示过程中,我对作为一名java工程师注意的事项 应该从小事做起、从基本做起。把职业能力训练与职业素质有机的结合起来。相信这对我接 下来学习专业知识会起到很有效的帮助,在接下来的几个月里,我会以作为一名职业人的身 份在这几个方面要求自己,严格自我,向java工程师靠近。 而经过这次实训,让我明白如果是一个完整项目的开发,必须由团队来分工合作,否则, 即费力又费时还做不好这个项目。因此不管在工作中还是在生活中要和老师、同学保持良好 的关系是很重要的。做事首先要学做人,要明白做人的道理,如何与人相处是现代社会的做 人的一个最基本的问题。对于自己这样一个即将步入社会的人来说,需要学习的东西很多, 他们就是最好的老师,正所谓“三人行,必有我师”,我们可以向他们学习很多知识、道理。 实训结束了感觉虽然辛苦,但很充实。我想这就是java工程师的工作。我也体会到java 工程师成功地完成一个任务的那种兴奋,那种小有成就的感觉是只有置身其中的人才能 体会的。 总之,这次实训为我提供了与众不同的学习方法和学习体会,从书本中面对现实,为我 将来走上社会打下了扎实的基础。作为在校计算机专业的学生,现在我能做的就是吸取知识, 提高自身的综合素质,提高自己的职业技能,自己有了能力,到时候才会是“车到山前必有 路”。我相信在不久的未来,会有属于我自己的一片天空。 我希望计算机专业的同学在以后的学习或工作中以务实的态度给提供更多的机会锻炼自 己,为大家的成才与就业奠定坚实的基础;并希望同学们要做好角色定位,将自己所学的知识, 学熟、学精。 多学习和收集与项目有关的资料,来提高自己的业务水平,同时多请教经验丰富的老师, 使他们好的经验能够对自己起到借鉴作用,在他们的帮助下,能够很快的培养自己的管理技
一、单选题 1.对类:(B) public class Test( //...do something } 下面那个正确地定义了类Test的构造函数。 A)public void Test() () B)publicTest()(} C ) public static Test() (} D) publicTest(); 2.下面哪个函数是public void example()(...)的重载函数。(A) A)public void example( float f)(...) B)public int example() (...) C)public void example2()(...} D)public int example_overLoad ()(...) 3.下面的代码段中,执行之后i和j的值是_C_。 int i = 1; intj; j = i++; A)1, 1 B) 1,2 C) 2, 1 D) 2,2 4.以下for循环的执行次数是_B o for(int x=0,y=0;(y !=0)&&(x<4) ;x++); A)无限次B) 一次也不执行 C)执行4次D)执行3次 5.下面程序的输出结果是—C o public class People( String name; int id; public People( String str, int n )( name = str; id = n; } public String toString(){ return id + " :” + name; } public String print()(
第一章Web开发基础知识(简单描述)表单(续) 表单元素