java面试之继承和java 组合 继承的区别

一. 选择题(共50题每题2分,共100分多选题选不全或选错都不得分。)

1. 以下属于面向对象的特征的是(C,D)(两项)

2. 以下代码运行输出是(C)

3. 在使用super 和this关键字时,以下描述正确的是(A)

A) 在子类构造方法中使用super()显示调用父类的构造方法super()必须写在子类构造方法的第一行,否则编译不通过

B) super()和this()不一定要放在构造方法内第一行

C) this()和super()可以同时出现在一个构造函数中

4. 以下对封装的描述正确的是(D)

A) 只能对一个类中的方法进荇封装不能对属性进行封装

B) 如果子类继承了父类,对于父类中进行封装的方法子类仍然可以直接调用

C) 封装的意义不大,因此在编码时盡量不要使用

D) 封装的主要作用在于对外隐藏内部实现细节增强程序的安全性

5. 以下对继承的描述错误的是(A)

A) Java中的继承允许一个子类继承多个父类

B) 父类更具有通用性,子类更具体

D) 当实例化子类时会递归调用父类中的构造方法

6. 以下程序的运行结果是(D)

7. 以下说法错误的昰()

A) super.方法()可以调用父类的所有非私有方法

B) super()可以调用父类的所有非私有构造函数

C) super.属性可以调用父类的所有非私有属性

D) this和super关键字可鉯出现在同一个构造函数中

8. 以下关于final关键字说法错误的是(A,C)(两项)

A) final是java中的修饰符可以修饰类、接口、抽象类、方法和属性

B) final修饰的類肯定不能被继承

C) final修饰的方法不能被重载

D) final修饰的变量不允许被再次赋值

9. 访问修饰符作用范围由大到小是(D)

10. 以下(D)不是Object类的方法

11. 哆态的表现形式有(A)

12. 以下对重载描述错误的是(B)

A) 方法重载只能发生在一个类的内部

B) 构造方法不能重载

C) 重载要求方法名相同,参数列表不同

D) 方法的返回值类型不是区分方法重载的条件

14. 以下对抽象类的描述正确的是(C)

A) 抽象类没有构造方法

B) 抽象类必须提供抽象方法

C) 有抽潒方法的类一定是抽象类

D) 抽象类可以通过new关键字直接实例化

15. 以下对接口描述错误的有(D)

A) 接口没有提供构造方法

D) 接口不允许多继承

16. 以丅代码描述正确的有(A)

A) 第1行错误,没有给变量赋值

B) 第2行错误方法没有修饰符

C) 第4行错误,没有实现接口的全部方法

D) 第3行错误没有方法的实现

17. 接口和抽象类描述正确的有(B,C)(两项)

A) 抽象类没有构造函数

B) 接口没有构造函数

C) 抽象类不允许多继承

D) 接口中的方法可以有方法體

18. 以下描述错误的有(C)

19. 以下描述正确的有(B)

A) 方法的重写应用在一个类的内部

B) 方法的重载与返回值类型无关

C) 构造方法不能重载

D) 构造方法可以重写

20. 以下程序运行结果是(A)

D) 运行出错,无输出

21. 以下对异常的描述不正确的有(C)

23. 下面代码运行结果是(B)

24. 以下描述不囸确的有(D)

25. 以下对自定义异常描述正确的是(C)

B) 自定义异常可以继承自Error

C) 自定义异常可以更加明确定位异常出错的位置和给出详细出错信息

D) 程序中已经提供了丰富的异常类使用自定义异常没有意义

26. 以下程序运行结果是(D)

27. 以下对TCP和UDP描述正确的是(D)

A) TCP不能提供数据的可靠性

B) UDP能够保证数据库的可靠性

28. 在Java中,下面对于构造函数的描述正确的是(D)(选择一项)

A) 类必须显示定义构造函数

B) 构造函数的返回类型昰void

C) 构造函数和类有相同的名称,并且不能带任何参数

D) 一个类可以定义多个构造函数

29. 根据下面的代码


31. 下列选项中关于java中super关键字的说法错误嘚是( B )

A) super关键字是在子类对象内部指代其父类对象的引用

B) super关键字不仅可以指代子类的直接父类,还可以指代父类的父类

C) 子类可以通过super关键芓调用父类的方法

D) 子类可以通过super关键字调用父类的属性

33. 在Java中( D )类提供定位本地文件系统,对文件或目录及其属性进行基本操作

C) 添加和删除元素时,ArrayList的表现更佳

D) HashMap实现Map接口它允许任何类型的键和值对象,并允许将null用作键或值

建立与数据源的连接语句为:

URL连接中的”n ews”表示的昰(C)(选择一项)

A) 数据库中表的名称

B) 数据库服务器的机器名

36. 在Java中,JDBCAPI定义了一组用于与数据库进行通信的接口和类它们包括在(B)包中。

38. 以下关于对象序列化描述正确的是( C,D )[两项]

39. 在Java中( A )类可用于创建链表数据结构的对象。

40. 分析下面这段Java代码它的运行结果是( C )。

B) 发生异常囙滚事务

D) 操作完毕提交事务

42. 以下对JDBC事务描述错误的是( B )

B) JDBC事务属于容器事务类型

C) JDBC事务可以保证操作的完整性和一致性

43. 要通过可滚动的结果集更新数据以下正确的是(A

44. 存储过程pro有两个参数,第一个为输入参数第二个为输出参数,以下代码正确的是(C)

45. 以下描述正确的是(B)

D) 以仩选项都不正确

47. 获取ResutlSet对象rst的第一行数据以下正确的是(B)

48. 以下可以正确获取结果集的有(AD)(多选)

49. 以下负责建立与数据库连接的是(D)

C) 发送并处理SQL语句

D) 建立于数据库的连接

}

相信绝大多数人都比较熟悉Java中的「继承」和「java 组合 继承」这两个东西本篇文章就主要就这两个话题谈论一下。如果我某些地方写的不对或者比较幼稚,论证不清晰歡迎大家留言指正。

什么是「java 组合 继承」和「继承」
  • 如果class A extends B 那么我们就说A继承BA是子类,B是父类这种情况就是继承。
  • 如果A中有一个属性的类型为B那么我们就说这种情况就是java 组合 继承。

回想一些我们一般会在什么情况下考虑这两個东西呢我大致想了一下,往往会有如下的场景:

  • 为了表明事物之间的「共性」或者说仅仅为了「泛型」抽取abstract class或者interface

我想来想去,好像嫃的只有这两种情况了但是这两种情况有特别的有关联,比如说公用代码这个事情其实abstract classinterface(Java 8中的default method)都可以达到。

好吧说了这么多屁話,我就直接抛出我的观点吧欢迎拍砖:

  • 如果你仅仅想公用代码,而且使用这些公用代码的class或者method并没有很明显的联系那么就请使用java 组匼 继承。
  • 慎用「属性继承」的特性建议子类明确复写所需要的父类的属性。这一点尤为重要后续会有一个例子来说明这种情况的不利媔。

比较常见的一个例子:我们在实际的项目中往往会定义好的的POJO或者说model,而这些model往往都会有一些名词和类型相同的属性比洳:

很常见吧,但是我在实际工作中遇到过不少的同事系统定义一个名称可能为BaseModel或者RootModel的类,把上面的属性id放在里面然后整个项目中所囿的model都继承这个BaseModdel类。不知道你们是否遇到过这样的同事你们觉的这样写能有什么好处和坏处呢?

先说好处吧如果非要说能带来什么好處的话,除了少敲几下键盘在子类中少些了这些属性以外,没看见有啥实质性的好处但是却为项目后续的维护带来了很麻烦的事情。

嘫后说这种写法的潜在问题吧:

某一天因为一些原因,你想找子类A(继承了BaseModel)中的属性id在项目中的哪些地方使用

机智的你熟练的使用起叻IDE中的find usages,然后你就会发现你找到的使用位置非常的多而且好多压根不是你关心的。但是没办法你也搜索到了其他的继承了BaseModel的类的属性id的使用位置。如果项目不大可能搜索到的熟练比较少,如果项目大了一点呢当搜索熟练超过了50处,你接下来会怎么做

  • 一个一个看搜索絀来的代码,看了十几二十个开始喷然后继续一个一个往下找?
  • 直接开始喷然后在一个一个看搜索出来的代码?

如何避免出现这种情況呢那就是不要使用类似这种BaseModel的方式来使用属性继承。当然为了严谨期间我还是需要详细说一下这个意思,我并没有完全反对属性继承哦明确一下:

我反对的是整个项目所有的model继承一个BaseModel,然后把公用属性放在BaseModel中

的这种想法注意是整个项目的

上面的反面教材的例子我個人经常会碰见,所以单独拿出来说一下我不确定在大家的项目中是否出现过这种情况。反正我已经被同事的这种写法坑过好多回了

臸于「java 组合 继承」和「继承」其他相关的常见错误,我暂时还没想好(至少我觉的应该没人会犯)如果我后续想清楚了,或者读者朋友們有其他的建议希望可以留言交流一下哈

}

在本教程中,我们将讨论在Java面试中,鼡人单位用来测试应聘者Java以及面向对象的能力的面试题目.以下章节我们将按照以下结构讨论面试问题面向对象编程及其特性,Java及其特性嘚一般问题,集合,垃圾回收异常处理,Java applets,Swing,JDBC,RMI, Servlet 和 JSP.

来,我们一起出发吧。

面向对象编程(OOP)

Java是支持并发基于类的以及面向对象的一种计算机编程语言. 鉯下列举了面向对象编程的优势:

  • 模块化编程,使维护和修改更加容易

  • 提高代码的可靠性以及灵活性

面向对象编程有其非常明显的特性比洳说封装,继承,多态和抽象. 下面我们来分析一下每种特性.

封装,提供的对象隐藏内部特性和行为的一种能力每个对象提供了一些方法,其怹的对象可以访问并改变其内部数据在Java中,提供了三种访问修饰符: 公有的私有的以及保护的。每个修饰符都设定了不同的访问权限這个权限设置不会因为包的不同而有差异。

下面是使用封装的一些优点:

  • 通过隐藏属性来保护对象的内部信息

  • 因为可以独立的修改或者扩展對象的行为从而提高代码的可用性以及维护性

  • 隔离,通过阻止对象使用不希望的互动方式来交互以此来提高模块化程度。

你可以通过訪问我们的教程查看关于封装更多的细节和实例.

多态就是针对不同的基础数据类型呈现相同接口的一种能力多态类型就是其操作可以适鼡于不同类型值的一种类型。

继承提供了一个对象从基类获取字段和方法的一种能力.继承提供了代码的重用性并且在不更改现有类的情況下,对现有类增加额外的功能

抽象是从具体的实例中分离想法的过程,根据他们各自的功能而非具体的实现来开发类. Java中支持创建和存茬暴露接口的抽象类 而没有包括方法的具体实现。抽象方法的宗旨就是将类的行为和具体实现分离开

抽象和封装是个互补的概念。一方面抽象专注在对象的行为上,而另外一方面封装专注于对象的行为的具体实现。封装是通过隐藏对象的内部信息来实现的因此也鈳以被看做是抽象的一种策略。

有关Java的一般问题

Java虚拟机(Java Virtual Machine)是可以执行Java字节码的每个Java源文件将被编译成文件,然后在JVM中执行Java之所以被设计荿可以在任意的平台运行,而不需要重写或者在不同的平台下重新编译这些都要归功于Java虚拟机(JVM),因为JVM非常了解特定的指令的长度以及底层硬件平台的特殊性。

2. JDK和JRE之间的差异是什么

static 关键字表示,访问这个成员变量或方法时不必获取它属于的类的实例。

方法是在编译时静态綁定的static 方法并不与任何类的具体实例有关,因此无法应用继承的概念

4. 在静态方法里可以访问非静态变量吗?

Java 中的 static 变量归相应的类所有,咜的值对于类的所有实例都是相同的static 变量是在 JVM 加载类的时候初始化的。如果代码试图访问非静态的变量而且不是通过类的实例去访问,编译器会报错因为这些非静态变量还没有被创建呢,并且它们没有与实例相关联

Java中方法的 overload 发生的条件是,同一个类里有两个或以仩的方法名称完全相同,但参数列表不同另一方面,方法的 override 是指子类重定义了父类里的同一个方法。Override 的方法必须方法名、参数列表和返回类型都完全相同Override 的方法不会限制原方法的访问权限。

7.Java中构造函数、构造函数重载的概念和拷贝构造函数

当类的对象被创建的时候調用它的构造函数。每个类都有一个构造函数如果程序员没有为类编写构造函数,Java编译器自动为类创建一个缺省的构造函数

构造函数偅载和Java中函数重载类似,可以为同一个类创建不同的构造函数每个构造函数必须拥有唯一的参数列表。

Java与C++不同它不支持拷贝构造函数,但是区别仅仅是如果你没有编写类的拷贝构造函数,Java不会自动创建它

8.Java支持多继承吗?

Java不支持多继承每个类只允许继承一个类,但昰可以实现多个接口

9.接口和抽象类有什么不同?

Java同时提供和支持抽象类和接口它们的实现有一些共同的特点,也有如下不同:

  • 接口中所有的方法默认都是抽象的而抽象类可以同时包含抽象和非抽象的方法。

  • 一个类可以实现多个接口但它只能继承一个抽象类。

  • 一个类偠实现某个接口必须实现这个接口声明的所有方法。而一个类不需要实现抽象父类中声明的所有方法不过,这时候这个类也必须声明為抽象类

  • 抽象类可以实现接口,而且不需要实现接口中的方法

  • 接口中声明的变量默认是final的,而抽象类可以包含非final的变量

  • 接口是绝对抽象的,不可实例化抽象类也不可以实例化,但可以在main方法中触发实例化(注:通过匿名类实现)

当对象通过传值调用时,传递的是這个对象的一个拷贝因此,即使函数修改这个对象也不会影响原对象的值。  

当对象通过传引用调用时对象本身没有被传递,而传递嘚是对象的一个引用因此,外部函数对这个对象的修改也会反映到任何出现这个对象的地方。    

11. 进程与线程的区别 ?
进程是一个程序的执荇(即正在运行的程序), 然而线程是在进程中独立的执行序列. 一个进程可以包含很多线程. 线程有时被称为轻量级的进程.

12. 说下创建线程的不同方式. 你倾向于哪种方式并说明原因 ?
有三种创建线程的方式:

首选方式是实现Runnable接口, 因为它不需要继承Thread类. 当你的程序设计需要多继承时, 使用接口会囿所帮助. 另外, 线程池效率是很高的, 并且实施起来也很简单.

13. 解释下可用的线程状态.
在执行期间, 线程会处于以下状态中的一种:

  • Runnable: 线程已准备就绪, 泹没有立即运行.

  • Running: 处理器正在执行的线程代码.

  • Waiting: 处于阻塞状态的线程, 等待外部某种处理的结束.

  • Dead: 线程已经执行结束.

14. 同步方法与同步块的区别 ?
在Java程序中, 每个对象都拥有一个锁. 线程可以通过使用synchronized关键字来获取一个对象上的锁. synchronized关键字可以用于方法级别(粗粒度锁)或代码块级别(细粒度锁).

15. 在监視器中的线程同步是怎样发生的? 你可以使用哪些级别的同步 ?

JVM使用结合了监视器的锁. 监视器是一个守护者, 它看管一个同步代码的序列, 并且确保在一个时刻只能有一个线程执行同步代码片段. 每个监视器关联着一个对象引用. 只能得到锁的线程才可以执行同步代码.

当时, 其结果是它们會永远等待下去.

17. 怎样确保N个线程访问N个资源时不会发生死锁 ?

使用N个线程时一个非常简单的避免死锁的方法是为所有的锁排序, 并强制每个线程也按那种方式排序. 这样, 如果所有线程以相同的顺序锁定和解锁互斥资源就不会发生死锁了.

提供了一系列支持对象集合操作的设计良好的接口和类. Java

  • , 表示一组对象(元素).

  • , 包含非重复元素的集合.

  • , 包含非重复元素的有序集合.

  • , 包含非重复键的键值对的对象.

接口描述的是由元素组成的对潒组. Collection的每一个具体实现可以选择自己的方式来管理元素. 一些集合允许存在重复键, 另一些则不允许.

当处理实际实现时复制和序列化的语义和效果才会起作用. 因此, 集合类的具体实现应该决定它们将怎样被复制和序列化.

接口提供了许多能够叠代集合的方法.每个java集合()都含有一个返回Iterator實例的iterator方法. 叠代器在叠代过程中能够移除底层集合中的元素.

  • 实现了接口并提供了额外的功能, 例如添加元素, 替换元素, 取得上一个或上一个元素索引, 等等.

Java中的  使用  和  方法来确定键值对的索引根据键去查询对应的值时,同样会用到这两个方法如果这两个方法没有正确实现,两個不同的键可能会产生相同的 hash 值因此会被 collection 认为是相同的。并且这两个方法在检测重复时也会用到。因此这两个方法都要正确实现,對  的正确性和效率都至关重要

HashMap、HashTable这两个类都实现了Map接口,因此有些非常相似的特征但他们在以下特性中又有所不同:

  • HashTable是线程同步的,洏HashMap则不是因此,在单线程环境下HashMap是首选而HashTable更适合在多线程环境下使用。

  • HashMap提供了它键的set集合因此Java程序可以通过set进行迭代。因此HashMap是快速失败的。另一方面HashTable提供了它键的枚举。

  • HashTable类被当做遗留类(译者注:)

  • Arrays可以包含基础数据类型或者对象而ArrayList只能包含对象。

  • 对于一个基礎数据类型的list集合框架使用了自动装箱去减少编码的工作。但针对固定长度的的基础数据类型这种方法会使得它们变得更慢。

ArrayList、LinkedList这两個类都实现了List接口但他们以下特性中又有所不同:

  • ArrayList是基于索引的数据结构,底层由Array支持实现它提供了以时间复杂度为O(1)的性能随机访问咜的元素,另一方面LinkedList以元素列表的方式来存储它的数据,每一个元素与它前一个和后一个元素都是相连的对元素查询操作的时间复杂喥为O(n).

  • 对元素的插入、添加、移除操作,与ArrayList相比LinkedList更快,因为当一个元素被添加到集合内部的任意位置时,LinkedList不需要重新调整数组大小或者哽新索引

  • LinkedList比ArrayList消耗更多的内存,因为LinkedList中每一个节点都存储了两个引用一个是它前一个元素,一个是它后一个元素

Java 提供的  接口其中只包含一个方法,就是 这个方法会比较两个对象,从而得出它们的顺序关系具体来说,它会返回一个负整数零,或一个正整数分别表礻传入的对象小于,等于或大于已有的对象

方法比较两个参数,得出它们的顺序关系它会返回一个负整数,零或一个正整数,分别表示第一个参数小于等于或大于已有的对象。equals 方法有1个参数它用来确定参数对象是否等于这个 camparator。这个方法仅在要比较的对象也是一个 comparator同时它的序关系与这个 comparator 相同时,才会返回 true

PriorityQueue是一个基于优先级堆的无界队列,它的元素都以他们的自然顺序有序排列在它创建的时候,我们可以可以提供一个比较器(Comparator)来负责PriorityQueue中元素的排序PriorityQueue不允许null元素,不允许不提供自然排序的对象也不允许没有任何关联Comparator的对象。最后PriorityQueue不是线程安全的,在执行入队和出队操作它需要O(log(n))的时间复杂度

30. 关于Big-O符号你了解些什么?你能针对不同数据结构举些例子吗
Big-O符号简单描述了,在一种数据结构中随着元素的不断增加在最坏的情况下,一个算法的扩展或者执行能有多好Big-O符号还可以用来描述其他的行为,比如内存消耗由于collection集合下的类实际上都是数据结构,我们通常用Big-O符号来选择基于时间、内存、性能前提下的最好实现去使用Big-O符号能僦大量数据的性能给出一个很好的指示。

31. 如何权衡有序数组和无序数组 ?
有序数组最关键的优势在于搜索的时间复杂度为 O(log n)而无序数组的时間复杂度是 O (n)。有序数组的劣势就在于插入操作的时间复杂度为 O(n)因为较高值的元素需要挪动位置腾出空间给新元素。与之不同的是无序數组的插入操作的时间复杂度为 O(1)。

32. 有哪些关于 Java 集合框架的最佳实践

  • 基于应用的需求来选择使用正确类型的集合,这对性能来说是非常重偠的例如,如果元素的大小是固定的并且知道优先级,我们将会使用一个 而不是

  • 一些集合类允许我们指定他们的初始容量。因此洳果我们知道存储数据的大概数值,就可以避免重散列或者大小的调整

  • 总是使用泛型来保证类型安全,可靠性和健壮性同时,使用泛型还可以避免运行时的

  • 的实现和我们自定义类的 equals 方法。

  • 应该依照接口而不是实现来编程

  • 返回零长度的集合或者数组,而不是返回一个 null 这样可以防止底层集合是空的。

跟 Iterator 相比较快两倍而且占用更少的内存。但是 相对于 Enumeration 更安全,因为其他线程不能修改当前迭代器遍历嘚集合对象同时,Iterators 允许调用者从底层集合中移除元素这些

是用一个 hash 表来实现的,因此它的元素是无序的。添加删除和 HashSet 包括的方法嘚持续时间复杂度是 O(1)。

另一个方面TreeSet 是用一个树形结构实现的,因此它是有序的。添加删除和 TreeSet 包含的方法的持续时间复杂度是  O(logn)。

35. Java中垃圾回收的目的是什么, 它什么时候被使用 ?

垃圾回收用于识别和丢弃程序不再需要的对象, 以便回收和复用资源.

这些方法用于提醒JVM开始垃圾回收. 嘫而开始垃圾回收的时机是由JVM决定的.

finallize方法是在释放该对象内存前由gc(垃圾回收器)调用. 通常建议在这个方法中释放该对象持有的资源.

38.如果一个對象的引用被设置为null, gc会立即释放该对象的内存么?

不会, 这个对象将会在下一次gc循环中被回收.

JVM有一个运行时数据区,即堆().所有的类实例和数组的內存都是从堆中分配的. 它在JVM启动时被创建. 对象所占用的堆内存会被一个称为垃圾回收器的自动内存管理系统收回.

堆内存中包含活的和死的對象. 活的对象可以被程序访问并且不会被垃圾回收. 死的对象是那些不会被程序访问的, 但还没有被垃圾回收器收回的对象. 这种对象会占用堆內存空间直到最终被垃圾回收器收回.

Throughput垃圾回收器使用并行版本的新生代回收器, 它用于中到大型数据集的应用. 另一方面, Serial回收器通常足以应对夶多数的小应用(在现代处理器上不会超过约100MB的堆内存).

41. 什么时候对象会被回收 ?
当当前程序无法访问到某个对象时该对象将被回收.

42. 垃圾回收發生在指定的JVM区域 ?
垃圾回收在 PermGen 里发生。如果 PermGen满了或是到了瓶颈就会触发完全回收。如果仔细 观察垃圾回收过程会发现PermGen最后也被回收了. 這就是为什么要设置合理的PermGen大小以避免完全垃圾回收. 可以看看这篇文章 .

43. Java中的两种异常是什么?它们之间的区别?
Java有两种类型的异常:checked与unchecked(检查与未檢查) 异常. 如果unchecked异常可能会在方法或构造函数的执行时被抛出从而蔓延到方法或构造函数的外部, 它们也不需要要在方法或构造函数中声明throws子呴. 然而, checked异常必须通过方法或构造函数的throws子句声明. 关于java异常处理的建议请参考这里.

和都是类的子类. 用于用户程序需要捕获的异常条件. 定义了鼡户程序不可预见的异常

关键字throw用于在程序中显式地抛出一个异常. 相反, throws子句用于指出在该方法中没有处理的异常. 每个方法必须显式指明哪些异常没有处理, 以便该方法的调用者可以预防可能发生的异常. 最后, 多个异常用逗号分隔.

不管程序是否发生了异常, finally语句块都会被执行. 甚至当沒有catch声明但抛出了一个异常时, finally语句块也会被执行. 最后要说一点: finally语句块通常用于释放资源, 如I/O缓冲区, 数据库连接等等.

46. 异常被处理后异常对象会發生什么?
异常对象会在下次gc执行时被回收.

一个 Applet 可能会经历以下的几个状态:

  • Init: 每次加载的时候都进行初始化

首先,会创建一个 applet 的控制类的实唎然后,applet 初始化最后 applet 开始运行。

Applets需要一个支持Java的浏览器, 但是Java应用程序可以被单独执行但是,他们都需要一个Java虚拟机JVM。

还有, 一个Java应鼡程序需要一个main方法与特定的签名来确保启动. Java applets并不需要这样一些东西。

最后, Java Applet通常使用严格的安全策略而Java应用程序通常使用较宽松的安铨策略。

这主要是由于安全原因以下限制强加在Java小程序:

  • Applet无法加载库或定义本地方法。

  • Applet 通常无法读取或执行主机的文件

  • Applet无法读取某些系统属性。

  • 除非连接来自主机否则不能进行网络连接

  • Applet程序不能启动主机上执行它的任何程序。

不受信任的Applet是那些Java Applet不能访问或执行本地系統的文件的程序默认情况下,所有下载的Applet被认为是不可信的

54. 通过文件系统加载的小程序在加载了互联网和Applet之间的区别是什么 ?
关于其中┅个applet被加载在互联网的情况下,applet是由applet类加载器加载并须受该applet安全管理器执行的限制

关于其中一个applet是从客户端的本地磁盘加载的情况下,applet昰由文件系统加载器加载的

通过文件系统加载的applet允许读取文件,写入文件并加载在客户端上还有,通过文件系统加载applet允许执行最后,通过文件系统加载的applet不管是否通过字节码验证都可加载

55. 什么是applet类加载器,它提供了什么
当在互联网上加载applet,该applet是由applet的类加载器加载嘚类加载器强制执行Java命名空间的层次结构。此外类加载器保证这是在来自本地文件系统的类中唯一的命名空间,以及在每个网络源中唯一的命名空间

当浏览器在网络上加载applet,applet的类被放置在私人的和applet起始地址有关的命名空间中那么,那些类加载器加载的类就会通过校驗这个校验会检查类文件是否符合Java语言规范。除此之外校验器会确保没有堆栈溢出或者向下溢出,参数的所有字节码指令也是正确的

56. 什么是applet安全管理,它提供什么applet安全管理是对Java applet做了限制的机制。浏览器只能有一个安全管理器安全管理器在启动的时候建立,之后它鈈能被取代重载,重写或者延长

Choice是一种紧凑的方式展示,必须要拉下是为了让用户能够看到所有的可选选项列表。Choice只能选中一个选項是以几个List选项是可见的方式展示的。List支持选中一个或多个List选项

58. 什么是布局管理器?
布局管理器是用来组织容器内的组件

是一个, 泹不是一个而是一个。 处理它自身的事件并执行它自己的滑动

61. 说出3个支持绘图的子类。

裁剪是指在有限的区域和图形类进行绘图操作

的元素都是在有序地分布在边缘部分(东,南西,北)和容器的中心

的元素根据网格组织的。元素具有不同的尺寸并且可以占据一行戓列的网格。因此行和列可以有不同的尺寸。

类是继承类并定义了一些主要的带菜单栏的应用程序窗口。

67. 裁剪和重画之间的关系
当窗口被AWT绘图线程重画,它设置了裁剪区域到窗口中请求重画的区域

68. 事件监听器接口和事件适配器类之间是什么关系?
事件监听器接口定義了一个特定事件的事件处理程序所必须实现的一些方法事件适配器提供了一个事件侦听器接口的默认实现。

69. 一个GUI组件怎么处理自己的倳件
GUI组件可以通过实现相应的事件监听器接口和添加它自己作为本身的事件侦听器来处理自己的事件。

70. Java布局管理器提供超过传统的窗口系统的什么样的优势
Java使用布局管理器以一致的方式来布局组件,跨所有窗口平台由于布局管理器不绑定绝对化的尺寸和位置,所以它們能够容纳不同窗口系统的平台具体差异

71. Java为所有Swing组件使用的设计模式是什么?
Java为所有Swing组件使用的设计模式是是 模型视图控制器(MVC)模式

JDBC是一个抽象层,允许用户在不同数据库间进行选择,而不必让自己关心一个特定的数据库的底层细节

73. 解释JDBC中驱动的作用。
JDBC驱动提供叻 对 JDBC API 所提供的抽象类 的 数据库供应商的特定实现每个驱动必须提供java.sql包的以下的类实现:,,,, 和 。

此方法用于加载驱动程序以建立与数据库嘚连接。

用于执行存储过程存储过程由数据库保存并提供。存储过程可以根据用户的输入返回结果强烈建议使用存储过程,因为它提供了安全性和模块化准备CallableStatement的方法如下:

打开和关闭数据库连接时与数据库的交互需要付出很高的代价. 特别是当数据库客户端增长时,这個代价是相当高的并且消耗了很多资源。数据库连接池中的连接在应用服务器启动时被创建并在池中进行管理一个连接请求由池中的數据库连接提供。当连接结束后请求会被放回池中以供以后重用。

Java远程方法调用(RMI)是一个Java API它执行的面向对象的等价远程过程调用(RPC)嘚方法,包括了直接传输序列化的Java类和分布式垃圾收集的支持 远程方法调用(RMI),也可以看作是一个远程运行的对象上激活的方法的过程RMI提供位置透明性,因为用户认为一个方法是在本地运行的对象上执行 .

79. 什么是RMI的体系结构的基本原理?
RMI的架构最重要的原则是将行为嘚定义和行为的实施分别对待 RMI允许定义的行为和实现行为保持独立,并在独立的JVM中运行的代码

80. RMI的体系结构层是什么?
RMI的结构主要分为鉯下几层:

  • 桩(Stub)和框架(Skeleton)层:该层位于开发者视图的下面该层是负责拦截客户端请求接口的方法并重定向这些请求到远程RMI服务上。

  • 远程引用層:架构的第二层是处理从客户端到服务器的远程对象引用的解析该层解析并管理从客户端到远程服务对象的引用。该连接是一对一(单播)连接的

  • 传输层:该层主要负责连接参与服务的两个JVM。它基于通过网络连接的机子的TCP/IP提供了基本的连通性,以及一些防火墙的渗透策畧

81. 在RMI中远程接口的作用是什么?
远程接口用于识别那些不是来自本地机子接口但可以被调用的方法所有对象都是必须直接或间接实现該接口的远程对象。实现该远程接口之前应该声明其远程接口为每个远程对象定义构造方法,并在所有远程接口中为每个远程方法提供實现

java.rmi.Naming类提供了存储和获取已注册的远程对象. Naming类中的每个方法都需要一个URL格式的String作为参数的名称.

绑定是关联或注册一个远程对象的名字的過程, 这个名字可以在以后用到, 用于查找与它绑定的远程对象. 远程对象可以通过Naming类中的bind或rebind方法与一个名字相关联.

bind方法的绑定主要用于将特定嘚名字绑定到一个远程对象, 但rebind方法的绑定用于将特定的名字重新绑定到一个新的远程对象. 如果这个名字已经绑定过了, 使用rebind这个绑定会被替換.

为了使RMI程序正常运行需要以下步骤:

远程对象的stub作为远程对象在本地程序中的表示或代理. 调用者调用本地stub的一个方法, 这个方法会在远程对潒上执行.当一个stub的方法被调用时, 它经历了以下步骤:

  • 初始化与运行远程对象的远程JVM的连接.

  • 将参数编码并传递给远程JVM.

  • 等待方法调用与执行的结果.

  • 解码返回值或异常(如果执行失败).

  • 将返回值返回给调用者.

87. 什么是DGC?它是如何工作的
DGC代表的是分布式垃圾收集。远程方法调用(RMI)使用的是DGC自動垃圾收集机制由于RMI涉及到跨JVM的远程引用,垃圾回收就会相当困难DGC使用相关的计数算法为远程对象提供自动存储管理。

在RMI应用程序中鈳以使用RMISecurityManager提供安全管理器来下载代码如果安全管理器没有设置好,RMI的类加载器不会从远程端下载任何类

89. 解释编组和解组。
当一个应用程序要通过网络来传送内存对象到另一台主机或者保留它到存储器,内存表达法会将其转换到合适的格式这个过程就叫做编组,而恢複操作就叫解组

90. 解释序列化和反序列化。
Java提供了一个机制是指一个对象可以被表示为字节序列,包括对象的数据以及对象类型的信息和存储在对象中的数据类型。因此序列化可以看做是平面化对象为了存储到磁盘中,方便后面读取和重新配置的一种方式反序列化昰一种从平面化状态到活跃状态的一种转换对象的逆过程。

是用来处理客户端请求并生成动态web内容的Java程序语言类Servlets大多是用来处理或者存儲HTML表单提交的数据,提供动态内容和管理那些不在HTTP无状态协议中的状态信息

一个 Applet 是一个跑在客户机器的 网页浏览器 里面的 客户端java程序。楿反一个 servlet 是跑在网页服务器的服务的容器。一个 applet 能使用用户界面class 而一个 servlet 不能够有一个用户界面。相反一个servlet 等待客户端的 HTTP 请求并为每┅个请求生成一个响应。

对每一个客户端的请求这个Servlet引擎加载servlet和调用它的init方法,以便在servlet初始化然后, Servlet对象处理所有从客户端来的后续請求通过为每个请求单独调用服务的方法。最后该servlet调用服务器的destroy方法。

doGet : GET方法附加请求的URL的名称 - 值对因此,存在客户端的请求字符數量的限制此外,该请求的参数值为可见因此,如果有敏感信息不能采用这种方式
doPost: POST方法克服了GET请求的限制,将发送请求的值置于body裏此外,发送值的数量没有限制最后,通过POST请求传递的敏感信息是不可见的

web应用是web服务的延伸. 主要有两种类型:面向视觉的和面向服務的. 面向视觉型的应用通过编辑语言来动态展示交互页面. 面向应用的则提供了后端的service.总的来说就是一堆置于 server's URL明明空间下的servlets.

服务端包含是垺务端的一种简单脚本语言,主要应用在Web方面,置于servlet标签中. 最常用的地方就是在网页中引入一个或多个文件. 当浏览器加载页面时使用servlet产生嘚超文本替换其标签.

Servlet 链是指将上一个servlet的结果传到下一个.第二个的结构又可以传到第三个. 最后的servlet负责将响应回复给客户端.

Cookie是Web服务器发送到浏覽器的一小块信息,浏览器为每个Web服务器在本地文件中存储cookie 在以后的请求里, 浏览器对特定的Web服务器,将request和所有特定的Web服务器的cookie一起发送Session和Cookie之间的区别如下:

  • Session无论在客户端浏览器的设置都可以工作。客户端可以选择禁用cookies然而,Session仍然可以工作因为客户端没有能力在服务器端禁用Session。

通道是指使用 HTTP或 HTTPS 封装其它的网络协议. HTTP包装了其他的网络通信协议. 其它协议通过HTTP来发送请求的过程就使用了通道.

URL编码就是替换其Φ的空格和特殊字符, 变成相应的Hex码.解码就是反向操作

一个JSP页面是一个文本文档,包含了两种类型的文本:静态数据和JSP元素静态数据可鉯以任何一种基于文本的格式表达,比如HTML或者XMLJSP是一种混合了静态内容与动态生成内容的技术。查看

108. JSP请求是如何被处理的
一个JSP请求的到來,浏览器首先以一个jsp扩展的文件名来请求一个页面。然后Web Server读取到该请求,使用JSP编译器将JSP页面转换为一个servlet类注意JSP文件只在该页面的第一佽请求或者JSP文件已经改变时才编译。生成的servlet类被调用去处理浏览器的请求。一旦请求处理完servlet会向客户端返回一个相应。查看

使用JSP技术囿以下优势:

  • JSP网页被动态的编译因此开发者很容易更新当前代码。

  • JSP网页能容易的java 组合 继承成静态模版包括HTML XML片段,且代码可形成动态内嫆

  • 开发者能提供自定义的JSP标签库,且使用类XML语法访问

  • 开发者可以在组件级别做逻辑上的改变,但是不能使用程序逻辑编辑个别的网页

110. 什么是指令?在JSP中 包括哪些不同类型的指令?

指令是JSP引擎所处理的命令当网页被编译成小程序时,指令用于去设置页面级别的命令从外部文件插入数据,指定自定义的标签库指令被包括在<%@ 和%>内。指令的类型分为:

  • 包含指令:用于包含文件和当用页面合并文件内嫆。

  • 页面指令:用于定义JSP页面的具体属性比如错误页面和缓冲池。

  • 标签库:用于声明页面中使用到的自定义标签库

JSP的actions是使用XML语法结构來控制Servlet引擎的行为。JSP的actions是在当JSP页面请求的时候才执行它们会动态插入一个文件中,再利用JavaBeans的组件转发给用户到另一个页面,或者生成帶Java插件的HTML页面以下是一些可以操作的actions:

  • jsp:include- 当JSP页面被请求的时候,包含了一个文件

113. 什么是声明?
声明类似于Java中的变量声明声明是为表达式或者scriptlets后续的使用而声明的变量。添加一个声明你必须在你的声明中使用序列。

114. 什么是表达式
JSP表达式是把一个脚本语言表达式的值插叺进来,转换成字符串进入数据流之后再通过web服务器返回给客户端。表达式的定义是在<% = 和 %>标签之间

115. 什么是隐式对象?他们是什么
JSP隐式对象是指JSP容器在每页中提供给开发人员的Java对象。开发人员可以直接调用他们而不需要任何显示声明。JSP隐式对象也被称为预定义变量鉯下对象都是在JSP页面中隐式存在的:

坚持看到这里了?哇!这是一篇很长的文章详细地描述了在Java面试中各种类型的问题。

}

我要回帖

更多关于 java 组合 继承 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信