Java笔试题集锦

Java笔试题集锦

1.MVC的各个部分都有那些技术来实现?怎样实现?

答:MVC是Model-View-Controller的简写。"Model" 代表的是应用的业务逻辑(通过JavaBean,EJB组件实现), "View" 是应用的表示面(由JSP页面产生),"Controller" 是提供应用的处理过程控制(通常是一个Servlet),通过这样的设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现。这些组件能够进行交互和重用。

2.J2EE是什么?

答:Je22是Sun公司提出的多层(multi-diered),分布式(distributed),基于组件(component-base)的企业级应用模型(enterpriese application model).在这种一个应用系统中,可依照功能划分为不同的组件,这些组件又可在不同计算机上,而且处于对应的层次(tier)中。所属层次包含客户层(clietn tier)组件,web层和组件,Business层和组件,企业信息系统(EIS)层。

3.J2EE是技术还是平台还是框架?

答:J2EE本身是一个标准,一个为企业分布式应用的开发提供的标准平台。

J2EE也是一个框架,包含JDBC、JNDI、RMI、JMS、EJB、JTA等技术。

4.STRUTS的应用(如STRUTS架构)

答:Struts是採用Java Servlet/JavaServer Pages技术,开发Web应用程序的开放源代码的framework。 採用Struts能开发出基于MVC(Model-View-Controller)设计模式的应用构架。 Struts有例如以下的主要功能:

一.包括一个controller servlet,能将用户的请求发送到对应的Action对象。

二.JSP*tag库,而且在controller servlet中提供关联支持,帮助开发员创建交互式表单应用。

三.提供了一系列有用对象:XML处理、通过Java reflection APIs自己主动处理JavaBeans属性、国际化的提示和消息。

5.WEB SERVICE名词解释。JSWDL开发包的介绍。JAXP、JAXM的解释。SOAP、UDDI,WSDL解释。

答:Web ServiceWeb Service是基于网络的、分布式的模块化组件,它运行特定的任务,遵守详细的技术规范,这些规范使得Web Service能与其它兼容的组件进行互操作。

JAXP(Java API for XML Parsing) 定义了在Java中使用DOM, SAX, XSLT的通用的接口。这样在你的程序中你仅仅要使用这些通用的接口,当你须要改变详细的实现时候也不须要改动代码。

JAXM(Java API for XML Messaging) 是为SOAP通信提供訪问方法和传输机制的API。

WSDL是一种 XML 格式,用于将网络服务描写叙述为一组端点,这些端点对包括面向文档信息或面向过程信息的消息进行操作。这样的格式首先对操作和消息进行抽象描写叙述,然后将其绑定到详细的网络协议和消息格式上以定义端点。相关的详细端点即组合成为抽象端点(服务)。

SOAP即简单对象訪问协议(Simple Object Access Protocol),它是用于交换XML编码信息的轻量级协议。

UDDI 的目的是为电子商务建立标准;UDDI是一套基于Web的、分布式的、为Web Service提供的、信息注冊中心的实现标准规范,同一时候也包括一组使企业能将自身提供的Web Service注冊,以使别的企业可以发现的訪问协议的实现标准。

6.C/S 与 B/S 差别:

答:有例如以下八个方面的不同:

(1)硬件环境不同:

  C/S 一般建立在专用的网络上, 小范围里的网络环境, 局域网之间再通过专门server提供连接和数据交换服务.

  B/S 建立在广域网之上的, 不必是专门的网络硬件环境,例与电话上网, 租用设备. 信息自己管理. 有比C/S更强的适应范围, 一般仅仅要有操作系统和浏览器即可

(2)对安全要求不同

  C/S 一般面向相对固定的用户群, 对信息安全的控制能力非常强. 一般高度机密的信息系统採用C/S 结构适宜. 能够通过B/S公布部分可公开信息.

  B/S 建立在广域网之上, 对安全的控制能力相对弱, 可能面向不可知的用户。

(3)对程序架构不同

  C/S 程序能够更加注重流程, 能够对权限多层次校验, 对系统执行速度能够较少考虑.

  B/S 对安全以及訪问速度的多重的考虑, 建立在须要更加优化的基础之上. 比C/S有更高的要求 B/S结构的程序架构是发展的趋势, 从MS的.Net系列的BizTalk 2000 Exchange 2000等, 全面支持网络的构件搭建的系统. SUN 和IBM推的JavaBean 构件技术等,使 B/S更加成熟.

(4)软件重用不同

  C/S 程序能够不可避免的总体性考虑, 构件的重用性不如在B/S要求下的构件的重用性好.

  B/S 对的多重结构,要求构件相对独立的功能. 可以相对较好的重用.就入买来的餐桌可以再利用,而不是做在墙上的石头桌子

(5)系统维护不同

  C/S 程序因为总体性, 必须总体考察, 处理出现的问题以及系统升级. 升级难. 可能是再做一个全新的系统

  B/S 构件组成,方面构件个别的更换,实现系统的无缝升级. 系统维护开销减到最小.用户从网上自己下载安装就能够实现升级.

(6)处理问题不同

  C/S 程序能够处理用户面固定, 而且在同样区域, 安全要求高需求, 与操作系统相关. 应该都是同样的系统

  B/S 建立在广域网上, 面向不同的用户群, 分散地域, 这是C/S无法作到的. 与操作系统平台关系最小.

(7)用户接口不同

  C/S 多是建立的Window平台上,表现方法有限,对程序猿普遍要求较高

  B/S 建立在浏览器上, 有更加丰富和生动的表现方式与用户交流. 而且大部分难度减低,减低开发成本.

(8)信息流不同

  C/S 程序通常是典型的*集权的机械式处理, 交互性相对低

  B/S 信息流向可变化, B-B B-C B-G等信息、流向的变化, 更像交易中心。

7.什么是JNDI

答:(Java Naming & Directory Interface)JAVA命名文件夹服务。主要提供的功能是:提供一个文件夹系统,让其他各地的应用程序在其上面留下自己的索引,从而满足高速查找和定位分布式应用程序的功能。

8.什么是JMS

答:(Java Message Service)JAVA消息服务。主要实现各个应用程序之间的通讯。包含点对点和广播

9.什么是JTA

答:(Java Transaction API)JAVA事务服务。提供各种分布式事务服务。应用程序仅仅需调用其提供的接口就可以。

10.开发中都用到了那些设计模式?用在什么场合?

答:每一个模式都描写叙述了一个在我们的环境中不断出现的问题,然后描写叙述了该问题的解决方式的核心。通过这样的方式,你能够无数次地使用那些已有的解决方式,无需在反复同样的工作。主要用到了MVC的设计模式。用来开发JSP/Servlet或者J2EE的相关应用。简单工厂模式等。

11.、j2ee经常使用的设计模式?说明工厂模式。

答:Java中的23种设计模式:

Factory(工厂模式),      Builder(建造模式),       Factory Method(工厂方法模式),

Prototype(原始模型模式),Singleton(单例模式),    Facade(门面模式),

Adapter(适配器模式),    Bridge(桥梁模式),        Composite(合成模式),

Decorator(装饰模式),    Flyweight(享元模式),     Proxy(代理模式),

Command(命令模式),      Interpreter(解释器模式), Visitor(訪问者模式),

Iterator(迭代子模式),   Mediator(调停者模式),    Memento(备忘录模式),

Observer(观察者模式),   State(状态模式),         Strategy(策略模式),

Template Method(模板方法模式), Chain Of Responsibleity(责任链模式)

工厂模式:工厂模式是一种常常被使用到的模式,依据工厂模式实现的类能够依据提供的数据生成一组类中某一个类的实例,通常这一组类有一个公共的抽象父类而且实现了同样的方法,可是这些方法针对不同的数据进行了不同的操作。首先须要定义一个基类,该类的子类通过不同的方法实现了基类中的方法。然后须要定义一个工厂类,工厂类能够依据条件生成不同的子类实例。当得到子类的实例后,开发者能够调用基类中的方法而不必考虑究竟返回的是哪一个子类的实例。

12.UML方面

答:标准建模语言UML。用例图,静态图(包含类图、对象图和包图),行为图,交互图(顺序图,合作图),实现图

13.RMI

RMI 指的是远程方法调用 (Remote Method Invocation)。它是一种机制,可以让在某个 Java 虚拟机上的对象调用还有一个 Java 虚拟机中的对象上的方法。可以用此方法调用的不论什么对象必须实现该远程接口。调用这样一个对象时,其參数为 "marshalled" 并将其从本地虚拟机发送到远程虚拟机(该远程虚拟机的參数为 "unmarshalled")上。该方法终止时,将编组来自远程机的结果并将结果发送到调用方的虚拟机。假设方法调用导致抛出异常,则该异常将指示给调用方。


JAVA 基础

1.怎样获得数组的长度?

数组名.length

2.訪问修饰符“public/private/protected/缺省的修饰符”的使用类?

public :  公共,均可訪问

private:  私有的,同一个java类中能够訪问.子类不能訪问.

protected: 同一个包中的类都可訪问.子类能够訪问.

缺省,friendly :当前类,同一个包,都能够訪问.

作用域           当前类       同一package  子孙类       其它package

public            √              √                  √             √

protected        √              √                  √             ×

friendly          √              √                   ×            ×

private           √              ×                   ×            ×

3.Anonymous Inner Class (匿名内部类) 能否够extends(继承)其他类,能否够implements(实现)interface(接口)?

匿名内部类是没有名字的内部类,不能继承其他类,但一个内部类能够作为一个接口,由还有一个内部类实现.

一、由于匿名内部类没有名字,所以它没有构造函数。由于没有构造函数,所以它必须全然借用父类的构造函数来实例化,换言之:匿名内部类全然把创建对象的任务交给了父类去完毕。

二、在匿名内部类里创建新的方法没有太大意义,但它能够通过覆盖父类的方法达到奇妙效果,如上例所看到的。这是多态性的体现。

三、由于匿名内部类没有名字,所以无法进行向下的强制类型转换,持有对一个匿名内部类对象引用的变量类型一定是它的直接或间接父类类型。

new <类或接口> <类的主体>

匿名类

匿名类是不能有名称的类,所以没办法引用它们。必须在创建时,作为new语句的一部分来声明它们。

这就要採用还有一种形式的new语句,例如以下所看到的:

new <类或接口> <类的主体>

这样的形式的new语句声明一个新的匿名类,它对一个给定的类进行扩展,或者实现一个给定的接口。它还创建那个类的一个新实例,并把它作为语句的结果而返回。要扩展的类和要实现的接口是new语句的操作数,后跟匿名类的主体。

假设匿名类对还有一个类进行扩展,它的主体能够訪问类的成员、覆盖它的方法等等,这和其它不论什么标准的类都是一样的。假设匿名类实现了一个接口,它的主体必须实现接口的方法。

注意匿名类的声明是在编译时进行的,实例化在执行时进行。这意味着for循环中的一个new语句会创建同样匿名类的几个实例,而不是创建几个不同匿名类的一个实例。

从技术上说,匿名类可被视为非静态的内部类,所以它们具有和方法内部声明的非静态内部类一样的权限和限制。

假设要运行的任务须要一个对象,但却不值得创建全新的对象(原因可能是所需的类过于简单,或者是因为它仅仅在一个方法内部使用),匿名类就显得很实用。匿名类尤其适合在Swing应用程序中高速创建事件处理程序。

exp:

return new Contents() {

private int i = 11;

public int value() { return i; }

};

这样的奇怪的语法要表达的意思是:“创建从Contents衍生出来的匿名类的一个对象”。由new表达式返回的句柄会自己主动上溯造型成一个Contents句柄。匿名内部类的语法事实上要表达的是:

class MyContents extends Contents {

private int i = 11;

public int value() { return i; }

}

return new MyContents();

若试图定义内部类,并想使用在匿名内部类外部定义的一个对象,则编译器要求外部对象必须是final属性.

public class Parcel9 {

public Destination

dest(final String dest, final float price) {

return new Destination() {

private int cost;

// Instance initialization for each object:

{

cost = Math.round(price);

if(cost > 100)

System.out.println("Over budget!");

}

private String label = dest;

public String readLabel() { return label; }

};

}

public static void main(String[] args) {

Parcel9 p = new Parcel9();

Destination d = p.dest("Tanzania", 101.395F);

}

}

4.static nested class 和 inner class的不同?

nested class在c++中是嵌套类,inner class在java中是内部类.不同就是在于是否有指向外部的引用上.静态内部类意味着创建一个static内部类的对象,不须要一个外部类对象;不能从一个static内部类的一个对象訪问到一个外部类的对象.

5.&和&&的差别

&是位运算符,表示按位与运算;&&是逻辑运算符,表示逻辑与(and)

6.Collection和Collections的差别

collection是集合类的上级接口,继承与它的接口主要是set和list

当中list必须以特定的顺序容纳元素;而一个set不能包括反复的元素.

映射(Map)一系列"键-值"对.能够返回自己键的一个set,一个包括自己值的list,或者包括自己(键-值)对的一个list.

均可构建自己的重复器.

collections类是针对集合类的一个帮助类.它提供一系列的静态方法对各种集合的搜索,排序,线程安全化等操作.

public class SimpleCollection {

public static void main(String[] args) {

Collection c = new ArrayList();

for(int i = 0; i < 10; i++)

c.add(Integer.toString(i));

Iterator it = c.iterator();

while(it.hasNext())

System.out.println(it.next());

}

}

7.什么时候用assert

assertion(断言)在软件开发中是一种经常使用的调试方式,非常多开发语言中都支持这样的机制。在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;假设该值为false,说明程序已经处于不对的状态下,系统将给出警告或退出。一般来说,assertion用于保证程序最基本、关键的正确性。assertion检查通常在开发和測试时开启。为了提高性能,在软件公布后,assertion检查一般是关闭的.

8.String s = new String("xyz");创建了几个String Object***

两个,一个字符对象,一个字符对象引用对象

9.math.round(11.5)和math.round(-11.5)

前者等于12,后者等于-11.round方法返回与參数最接近的长整数.參数加0.5,求其floor

10. short s1 = 1;s1 = s1+1;是否有错误? short s1 = 1;s1 += 1;是否有错误?

前者s1+1返回一个int型,须要强制类型转换.

后者正确.

11.java种有没有goto?

有,为保留字.可是尚未使用.

12.Overload和Override的差别。Overloaded的方法能否够改变返回值的类型?

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

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

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

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

14.给我一个你最常见到的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..

15.error和exception有什么差别?

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

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

16.List, Set, Map是否继承自Collection接口

答: List,Set是,Map不是

17.abstract class和interface的差别

答:声明方法的存在而不去实现它的类叫虚拟类(abstract class).它用于创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况.不能创建abstract class的实例.可是能够声明一个abstract class变量,将其指向其详细子类的一个实例.不能有抽象构造函数或抽象静态方法.Abstract 类的子类为它们父类中的全部抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其他类能够在类中实现这些方法.

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

接口是一个更纯的抽象类.

18.接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)

答:接口能够继承接口。抽象类能够实现(implements)接口,抽象类可继承实体类,但前提是实体类必须有明白的构造函数

19.abstract的method是否可同一时候是static,是否可同一时候是native,是否可同一时候是synchronized

答:都不能.当中synchronized:(同步.避免在你和别人同一时候訪问一个属性的时候,属性的值发生不同步的问题.)

native:(声明本地方法的keyword,能够通过声明的方法调用本地的动态链接库或者有C、C++等开发的函数。)

20.构造器Constructor是否可被override(构造函数)

答:构造器Constructor不能被继承,因此不能重写Overriding,但能够被重载Overloading

1). 构造器不能是native,final,static,synchronized 的,能够是public,private,或什么都没有。

2). 构造器函数里能够写return呢,但后面什么都不许有(包含null)

3). 构造器不能返回值.

但假设有个"构造器"返值了,它就不是构造器喽,仅仅是个普通方法

4). super();this();这两个方法仅仅能在构造方法里调用.

5). 成员变量声明时候赋值,比构造函数还早.

21.能否够继承String

答:String类是final类故不能够继承

22.try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被运行,什么时候被运行,在return前还是后

答:会运行,在return前运行

23.用最有效率的方法算出2乘以8等於几

答:2 << 3

24.两个对象值同样(x.equals(y) == true),但却可有不同的hash code,这句话对不正确

答:不正确,有同样的hash code

在C++中,每一个类多有地址。

java也一样,只是hash code不是地址,而是一个标识对象用的。(个人觉得)

每一个对象的hash code是不一样的,Object的默认hash code记得是按引用地址的。

对于String例外,是按String内容输出hash code的,这样能够用equals()来比較String的

内容是否相等了,而不是地址

在 Java 应用程序运行期间,在同一对象上多次调用 hashCode 方法时,必须一致地返回同样的整数,前提是对象上 equals 比較中所用的信息没有被改动。从某一应用程序的一次运行到同一应用程序的还有一次运行,该整数无需保持一致。

假设依据 equals(Object) 方法,两个对象是相等的,那么在两个对象中的每一个对象上调用 hashCode 方法都必须生成同样的整数结果。

下面情况不 是必需的:假设依据 equals(java.lang.Object) 方法,两个对象不相等,那么在两个对象中的任一对象上调用 hashCode 方法必然会生成不同的整数结果。可是,程序猿应该知道,为不相等的对象生成不同整数结果能够提高哈希表的性能。

实际上,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。(这通常是通过将该对象的内部地址转换成一个整数来实现的,可是 JavaTM 编程语言不须要这样的实现技巧。)

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

答:是值传递。Java 编程语言仅仅有值传递參数。当一个对象实例作为一个參数被传递到方法中时,參数的值就是对该对象的引用。对象的内容能够在被调用的方法中改变,但对象的引用是永远不会改变的.

26.swtich能否作用在byte上,能否作用在long上,能否作用在String

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

27.ArrayList和Vector的差别,HashMap和Hashtable的差别

答:就ArrayList与Vector主要从二方面来说.

一.同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的

二.数据增长:当须要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一半

就HashMap与HashTable主要从三方面来说。

一.历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现

二.同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的

三.值:仅仅有HashMap能够让你将空值作为一个表的条目的key或value

28.GC是什么? 为什么要有GC

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

29.float型float f=3.4是否正确?

答:不对。精度不准确,应该用强制类型转换,例如以下所看到的:float f=(float)3.4

30.介绍JAVA中的Collection FrameWork(包含怎样写自己的数据结构)?

答:Collection FrameWork例如以下:

Collection

├List

│├LinkedList

│├ArrayList

│└Vector

│ └Stack

└Set

Map

├Hashtable

├HashMap

└WeakHashMap

Collection是最主要的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)

Map提供key到value的映射.

31.抽象类与接口?

答:抽象类与接口都用于抽象,可是抽象类(JAVA中)能够有自己的部分实现,而接口则全然是一个标识(同一时候有多重继承的功能)

JAVA类实现序例化的方法是实现java.io.Serializable接口

Collection框架中实现比較要实现Comparable 接口和 Comparator 接口

32.STRING与STRINGBUFFER的差别。

答:STRING的长度是不可变的,STRINGBUFFER的长度是可变的。假设你对字符串中的内容常常进行操作,特别是内容要改动时,那么使用StringBuffer,假设最后须要String,那么使用StringBuffer的toString()方法

33.谈谈final, finally, finalize的差别

答:final—修饰符(keyword)假设一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,能够保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中仅仅能读取,不可改动。被声明为final的方法也相同仅仅能使用,不能重载

finally—再异常处理时提供 finally 块来运行不论什么清除操作。假设抛出一个异常,那么相匹配的 catch 子句就会运行,然后控制就会进入 finally 块(假设有的话)

finalize—方法名。Java 技术同意使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这种方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此全部的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者运行其它清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的

34.面向对象的特征有哪些方面

答:主要有下面四方面:

1.抽象:

抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解所有问题,而仅仅是选择当中的一部分,临时不用部分细节。抽象包含两个方面,一是过程抽象,二是数据抽象。

2.继承:

继承是一种联结类的层次模型,而且同意和鼓舞类的重用,它提供了一种明白表述共性的方法。对象的一个新类能够从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类能够从它的基类那里继承方法和实例变量,而且类能够改动或添加新的方法使之更适合特殊的须要。

3.封装:

封装是把过程和数据包围起来,对数据的訪问仅仅能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界能够被描绘成一系列全然自治、封装的对象,这些对象通过一个受保护的接口訪问其它对象。

4. 多态性:

多态性是指同意不同类的对象对同一消息作出响应。多态性包括參数化多态性和包括多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,非常好的攻克了应用程序函数同名问题。

35.String是最主要的数据类型吗

答:基本数据类型包含byte、int、char、long、float、double、boolean和short。

java.lang.String类是final类型的,因此不能够继承这个类、不能改动这个类。为了提高效率节省空间,我们应该用StringBuffer类

36.int 和 Integer 有什么差别

答:Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每一个原始类型提供了封装类。原始类型封装类,booleanBoolean,charCharacter,byteByte,shortShort,intInteger,longLong,floatFloat,doubleDouble引用类型和原始类型的行为全然不同,而且它们具有不同的语义。引用类型和原始类型具有不同的特征和使用方法,它们包含:大小和速度问题,这样的类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始类型实例变量的缺省值与它们的类型有关.

37.执行时异常与一般异常有何异同

答:异常表示程序执行过程中可能出现的非正常状态,执行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见执行错误。java编译器要求方法必须声明抛出可能发生的非执行时异常,可是并不要求必须声明抛出未被捕获的执行时异常。

38.说出ArrayList,Vector, LinkedList的存储性能和特性

答:ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便添加和插入元素,它们都同意直接按序号索引元素,可是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector因为使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据须要进行前向或后向遍历,可是插入数据时仅仅须要记录本项的前后项就可以,所以插入速度较快

39.HashMap和Hashtable的差别

答:HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完毕了Map接口,主要差别在于HashMap同意空(null)键值(key),因为非线程安全,效率上可能高于Hashtable。

HashMap同意将null作为一个entry的key或者value,而Hashtable不同意。

HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。由于contains方法easy让人引起误解。

Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。

最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程訪问Hashtable时,不须要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。

Hashtable和HashMap採用的hash/rehash算法都大概一样,所以性能不会有非常大的差异。

40.heap和stack有什么差别****

答:栈是一种线形集合,其加入和删除元素的操作应在同一段完毕。栈依照后进先出的方式进行处理。堆是栈的一个组成元素

41.Java中的异常处理机制的简单原理和应用

答:当JAVA程序违反了JAVA的语义规则时,JAVA虚拟机就会将发生的错误表示为一个异常。违反语义规则包含2种情况。一种是JAVA类库内置的语义检查。比如数组下标越界,会引发IndexOutOfBoundsException;訪问null的对象时会引发NullPointerException。还有一种情况就是JAVA同意程序猿扩展这样的语义检查,程序猿能够创建自己的异常,并*选择在何时用throwkeyword引发异常。全部的异常都是java.lang.Thowable的子类。

42.垃圾回收的长处和原理。并考虑2种回收机制

答:Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序猿最头疼的内存管理的问题迎刃而解,它使得Java程序猿在编敲代码的时候不再须要考虑内存管理。因为有个垃圾回收机制,Java中的对象不再有"作用域"的概念,仅仅有对象的引用才有"作用域"。垃圾回收能够有效的防止内存泄露,有效的使用能够使用的内存。垃圾回收器一般是作为一个单独的低级别的线程执行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清楚和回收,程序猿不能实时的调用垃圾回收器对某个对象或全部对象进行垃圾回收。回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。

43.你所知道的集合类都有哪些?主要方法?

答:最经常使用的集合类是 List 和 Map。 List 的详细实现包含 ArrayList 和 Vector,它们是可变大小的列表,比較适合构建、存储和操作不论什么类型对象的元素列表。 List 适用于按数值索引訪问元素的情形。

Map 提供了一个更通用的元素存储方法。 Map 集合类用于存储元素对(称作"键"和"值"),当中每一个键映射到一个值。

44.描写叙述一下JVM载入class文件的原理机制?

答:JVM中类的装载是由ClassLoader和它的子类来实现的,Java ClassLoader 是一个重要的Java执行时系统组件。它负责在执行时查找和装入类文件的类。

45.排序都有哪几种方法?请列举

答:  排序的方法有:插入排序(直接插入排序、希尔排序),交换排序(冒泡排序、高速排序),选择排序(直接选择排序、堆排序),归并排序,分配排序(箱排序、基数排序)

高速排序的伪代码。

/ /使用高速排序方法对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

46.JAVA语言怎样进行异常处理,keyword:throws,throw,try,catch,finally分别代表什么意义?在try块中能够抛出异常吗?

答:Java通过面向对象的方法进行异常处理,把各种不同的异常进行分类,并提供了良好的接口。在Java中,每一个异常都是一个对象,它是Throwable类或其他子类的实例。当一个方法出现异常后便抛出一个异常对象,该对象中包括有异常信息,调用这个对象的方法能够捕获到这个异常并进行处理。Java的异常处理是通过5个关键词来实现的:try、catch、throw、throws和finally。普通情况下是用try来运行一段程序,假设出现异常,系统会抛出(throws)一个异常,这时候你能够通过它的类型来捕捉(catch)它,或最后(finally)由缺省处理器来处理。

用try来指定一块预防全部"异常"的程序。紧跟在try程序后面,应包括一个catch子句来指定你想要捕捉的"异常"的类型。

throw语句用来明白地抛出一个"异常"。

throws用来标明一个成员函数可能抛出的各种"异常"。

Finally为确保一段代码无论发生什么"异常"都被运行一段代码。

能够在一个成员函数调用的外面写一个try语句,在这个成员函数内部写还有一个try语句保护其它代码。每当遇到一个try语句,"异常"的框架就放到堆栈上面,直到全部的try语句都完毕。假设下一级的try语句没有对某种"异常"进行处理,堆栈就会展开,直到遇到有处理这样的"异常"的try语句。

47.一个".java"源文件里能否够包含多个类(不是内部类)?有什么限制?

答:能够。必须仅仅有一个类名与文件名称同样。

48.java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们各自是哪些类?

答:字节流,字符流。字节流继承于InputStream OutputStream,字符流继承于InputStreamReader OutputStreamWriter。在java.io包中还有更多的流,主要是为了提高性能和使用方便。

49.java中会存在内存泄漏吗,请简单描写叙述。

答:会。自己实现堆载的数据结构时有可能会出现内存泄露

50.垃圾回收器的基本原理是什么?垃圾回收器能够立即回收内存吗?有什么办法主动通知虚拟机进行垃圾回收

答:对于GC来说,当程序猿创建对象时,GC就開始监控这个对象的地址、大小以及使用情况。通常,GC採用有向图的方式记录和管理堆(heap)中的全部对象。通过这样的方式确定哪些对象是"可达的",哪些对象是"不可达的"。当GC确定一些对象为"不可达"时,GC就有责任回收这些内存空间。能够。程序猿能够手动运行System.gc(),通知GC运行,可是Java语言规范并不保证GC一定会运行。

51.静态变量和实例变量的差别?

答:static i = 10; //常量   class A a;  a.i =10;//可变

52.什么是java序列化,怎样实现java序列化?*****

答:序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。能够对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。

序列化的实现:将须要被序列化的类实现Serializable接口,该接口没有须要实现的方法,implements Serializable仅仅是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就能够将參数为obj的对象写出(即保存其状态),要恢复的话则用输入流。

53.能否够从一个static方法内部发出对非static方法的调用?

答:不能够,假设当中包括对象的method();不能保证对象初始化.

54.写clone()方法时,通常都有一行代码,是什么?

答:Clone 有缺省行为,super.clone();他负责产生正确大小的空间,并逐位复制。

55.在JAVA中,怎样跳出当前的多重嵌套循环?

答:用break; return 方法。

56.List、Map、Set三个接口,存取元素时,各有什么特点?

答:List 以特定次序来持有元素,可有反复元素。Set 无法拥有反复元素,内部排序。Map 保存key-value值,value可多值。

57.说出一些经常使用的类,包,接口,请各举5

答:经常使用的类:BufferedReader  BufferedWriter  FileReader  FileWirter  String  Integer

经常使用的包:java.lang  java.awt  java.io  java.util  java.sql

经常使用的接口:Remote  List  Map  Document  NodeList

58.描写叙述使用JDBC连接数据库的过程  

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

String   url   =   "jdbc:obdc:mydb";

Connection   con   =   DriverManager.getConnection(url);

Statement   stmt   =   con.createStatement();

ResultSet   rs   =   stmt.execte("select   *   from   mytable");

59.什么是JNDI?  

java命名文件夹接口

60.Java 的通信编程,编程题(或问答),用JAVA SOCKET编程,读server几个字符,再写入本地显示?

答: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 client come in!IP:"+RemoteIP+RemotePort);

in = new BufferedReader(new

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.println(line.readLine());

in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

System.out.println(in.readLine());

out.close();

in.close();

socket.close();

}catch(IOException e)

{

out.println("Wrong");

}

}

public static void main(String[] args)

{

new Client();

}

};

61. 线程的基本概念、线程的本状态以及状态之间的关系

•新建 (Born) : 新建的线程处于新建状态

•就绪 (Ready) : 在创建线程后,它将处于就绪状态,等待 start() 方法被调用

•执行 (Running) : 线程在開始执行时进入执行状态

•睡眠 (Sleeping) : 线程的运行可通过使用 sleep() 方法来临时中止。在睡眠后,线程将进入就绪状态

•等待 (Waiting) : 假设调用了 wait() 方法,线程将处于等待状态。用于在两个或多个线程并发执行时。

•挂起 (Suspended) : 在暂时停止或中断线程的运行时,线程就处于挂起状态。

•恢复 (Resume) : 在挂起的线程被恢复运行时,能够说它已被恢复。

•堵塞 (Blocked) – 在线程等待一个事件时(比如输入/输出操作),就称其处于堵塞状态。

•死亡 (Dead) – 在 run() 方法已完毕运行或其 stop() 方法被调用之后,线程就处于死亡状态。

串行化的注意事项以及怎样实现串行化答:假设有循环引用是不能够串行化的。对象输出流的WriteObject方法和 对象输入流的ReadObect 方法

62.内部类要点?

静态内部类能够有静态成员,而非静态内部类则不能有静态成员。

静态内部类的非静态成员能够訪问外部类的静态变量,而不可訪问外部类的非静态变量。

非静态内部类的非静态成员能够訪问外部类的非静态变量。

63.java中有几种方法能够实现一个线程?用什么keyword修饰同步方法? stop()和suspend()方法为何不推荐使用?

答:有两种实现方法,各自是继承Thread类与实现Runnable接口

用synchronizedkeyword修饰同步方法

反对使用stop(),是由于它不安全。它会解除由线程获取的全部锁定,并且假设对象处于一种不连贯状态,那么其它线程能在那种状态下检查和改动它们。结果非常难检查出真正的问题所在。suspend()方法easy发生死锁。调用suspend()的时候,目标线程会停下来,但却仍然持有在这之前获得的锁定。此时,其它不论什么线程都不能訪问锁定的资源,除非被"挂起"的线程恢复执行。对不论什么线程来说,假设它们想恢复目标线程,同一时候又试图使用不论什么一个锁定的资源,就会造成死锁。所以不应该使用suspend(),而应在自己的Thread类中置入一个标志,指出线程应该活动还是挂起。若标志指出线程应该挂起,便用wait()命其进入等待状态。若标志指出线程应当恢复,则用一个notify()又一次启动线程。

64.sleep() 和 wait() 有什么差别?

答:sleep是线程类(Thread)的方法,导致此线程暂停运行指定时间,给运行机会给其它线程,可是监控状态依旧保持,到时后会自己主动恢复。调用sleep不会释放对象锁。

wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,仅仅有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入执行状态。

65.同步和异步有何异同,在什么情况下分别使用他们?举例说明。

答:假设数据将在线程间共享。比如正在写的数据以后可能被还有一个线程读到,或者正在读的数据可能已经被还有一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。

当应用程序在对象上调用了一个须要花费非常长时间来运行的方法,而且不希望让程序等待方法的返回时,就应该使用异步编程,在非常多情况下採用异步途径往往更有效率。

66.启动一个线程是用run()还是start()?

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

67.当一个线程进入一个对象的一个synchronized方法后,其他线程是否可进入此对象的其它方法?

答:不能,一个对象的一个synchronized方法仅仅能由一个线程訪问。

68.请说出你所知道的线程同步的方法。

答:wait():使一个线程处于等待状态,而且释放所持有的对象的lock。

sleep():使一个正在执行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。

notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,并且不是按优先级。

Allnotity():唤醒全部处入等待状态的线程,注意并非给全部唤醒线程一个对象的锁,而是让它们竞争。

69.多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么?

答:多线程有两种实现方法,各自是继承Thread类与实现Runnable接口

同步的实现方面有两种,各自是synchronized,wait与notify

70.线程的基本概念、线程的基本状态以及状态之间的关系

答:线程指在程序运行过程中,可以运行程序代码的一个运行单位,每一个程序至少都有一个线程,也就是程序本身。

Java中的线程有四种状态各自是:执行、就绪、挂起、结束

71.简述synchronized和java.util.concurrent.locks.Lock的异同

答:主要同样点:Lock能完毕synchronized所实现的全部功能

主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自己主动释放锁,而Lock一定要求程序猿手工释放,而且必须在finally从句中释放。

jsp笔试

1.jsp有哪些内置对象?作用各自是什么?

答:JSP共同拥有下面9种基本内置组件(可与ASP的6种内部组件相相应):

 request 用户端请求,此请求会包括来自GET/POST请求的參数

response 网页传回用户端的回应

pageContext 网页的属性是在这里管理

session 与请求有关的会话期

application servlet 正在运行的内容

out 用来传送回应的输出

config servlet的构架部件

page JSP网页本身

exception 针对错误网页,未捕捉的例外

2.jsp有哪些动作?作用各自是什么?

答:JSP共同拥有下面6种基本动作

jsp:include:在页面被请求的时候引入一个文件。

jsp:useBean:寻找或者实例化一个JavaBean。

jsp:setProperty:设置JavaBean的属性。

jsp:getProperty:输出某个JavaBean的属性。

jsp:forward:把请求转到一个新的页面。

jsp:plugin:依据浏览器类型为Java插件生成OBJECT或EMBED标记

4.JSP中动态INCLUDE与静态INCLUDE的差别?

答:动态INCLUDE用jsp:include动作实现

<jsp:include page="included.jsp" flush="true" />它总是会检查所含文件里的变化,适合用于包括动态页面,而且能够带參数

静态INCLUDE用include伪码实现,但不会检查所含文件的变化,适用于包括静态页面

<%@ include file="included.htm" %>

5.两种跳转方式各自是什么?有什么差别?

答:有两种,分别为:

<jsp:include page="included.jsp" flush="true">

<jsp:forward page= "nextpage.jsp"/>

前者页面不会转向include所指的页面,仅仅是显示该页的结果,主页面还是原来的页面。运行完后还会回来,相当于函数调用。而且能够带參数.后者全然转向新页面,不会再回来。相当于go to 语句。

6.JSP的内置对象及方法。

答:request表示HttpServletRequest对象。它包括了有关浏览器请求的信息,而且提供了几个用于获取cookie, header, 和session数据的实用的方法。

response表示HttpServletResponse对象,并提供了几个用于设置送回 浏览器的响应的方法(如cookies,头信息等)

out对象是javax.jsp.JspWriter的一个实例,并提供了几个方法使你能用于向浏览器回送输出结果。

pageContext表示一个javax.servlet.jsp.PageContext对象。它是用于方便存取各种范围的名字空间、servlet相关的对象的API,而且包装了通用的servlet相关功能的方法。

session表示一个请求的javax.servlet.http.HttpSession对象。Session能够存贮用户的状态信息

applicaton 表示一个javax.servle.ServletContext对象。这有助于查找有关servlet引擎和servlet环境的信息

config表示一个javax.servlet.ServletConfig对象。该对象用于存取servlet实例的初始化參数。

page表示从该页面产生的一个servlet实例

servlet笔试题目

1.说一说Servlet的生命周期?

答:servlet有良好的生存期的定义,包含载入和实例化、初始化、处理请求以及服务结束。这个生存期由javax.servlet.Servlet接口的init,service和destroy方法表达。 Servlet被server实例化后,容器执行其init方法,请求到达时执行其service方法,service方法自己主动派遣执行与请求相应的doXXX方法(doGet,doPost)等,当server决定将实例销毁的时候调用其destroy方法。

与cgi的差别在于servlet处于server进程中,它通过多线程方式执行其service方法,一个实例能够服务于多个请求,而且事实上例一般不会销毁,而CGI对每一个请求都产生新的进程,服务完毕后就销毁,所以效率上低于servlet。

2.JAVA SERVLET API中forward() 与redirect()的差别?

答:前者仅是容器中控制权的转向,在client浏览器地址栏中不会显示出转向后的地址;后者则是全然的跳转,浏览器将会得到跳转的地址,并又一次发送请求链接。这样,从浏览器的地址栏中能够看到跳转后的链接地址。所以,前者更加高效,在前者能够满足须要时,尽量使用forward()方法,而且,这样也有助于隐藏实际的链接。在有些情况下,比方,须要跳转到一个其他server上的资源,则必须使用sendRedirect()方法。

3.Servlet的基本架构

答:

public class ServletName extends HttpServlet {

public void doPost(HttpServletRequest request, HttpServletResponse response) throws

ServletException, IOException  {

}

public void doGet(HttpServletRequest request, HttpServletResponse response) throws

ServletException, IOException  {

}

}

4.什么情况下调用doGet()和doPost()

答:Jsp页面中的form标签里的method属性为get时调用doGet(),为post时调用doPost()。

5.servlet的生命周期

答:web容器载入servlet,生命周期開始。通过调用servlet的init()方法进行servlet的初始化。通过调用service()方法实现,依据请求的不同调用不同的do***()方法。结束服务,web容器调用servlet的destroy()方法。

6.怎样现实servlet的单线程模式

答:<%@ page isThreadSafe="false"%>

7. 页面间对象传递的方法

答:request,session,application,cookie等

8.四种会话跟踪技术

答:会话作用域ServletsJSP 页面描写叙述

page否是代表与一个页面相关的对象和属性。一个页面由一个编译好的 Java servlet 类(能够带有不论什么的 include 指令,可是没有 include 动作)表示。这既包含 servlet 又包含被编译成 servlet 的 JSP 页面

request是是代表与 Web 客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个 Web 组件(因为 forward 指令和 include 动作的关系)

session是是代表与用于某个 Web 客户机的一个用户体验相关的对象和属性。一个 Web 会话能够也常常会跨越多个客户机请求

application是是代表与整个 Web 应用程序相关的对象和属性。这实质上是跨越整个 Web 应用程序,包含多个页面、请求和会话的一个全局作用域

10.我们在web应用开发过程中常常遇到输出某种编码的字符,如iso8859-1等,怎样输出一个某种编码的字符串?

答:

Public String translate (String str) {

String tempStr = "";

try {

tempStr = new String(str.getBytes("ISO-8859-1"), "GBK");

tempStr = tempStr.trim();

}

catch (Exception e) {

System.err.println(e.getMessage());

}

return tempStr;

}

11.Servlet运行时一般实现哪几个方法?

答:

public void init(ServletConfig config)

public ServletConfig getServletConfig()

public String getServletInfo()

public void service(ServletRequest request,ServletResponse response)

public void destroy()

12.说出数据连接池的工作机制是什么?

答:J2EEserver启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。client程序须要连接时,池驱动程序会返回一个未使用的池连接并将其表记为忙。假设当前没有空暇连接,池驱动程序就新建一定数量的连接,新建连接的数量有配置參数决定。当使用的池连接调用完毕后,池驱动程序将此连接表记为空暇,其它调用就能够使用这个连接。

13.Class.forName的作用?为什么要用?

答:调用该訪问返回一个以字符串指定类名的类的对象。

上一篇:Windows Store 应用获得设备 ID 的几种方案


下一篇:SQLSERVER误删除了Windows登录用户验证方式使用Windows身份验证的解决方法