java

简答题:
static方法就是没有this的方法。在static方法内部不能调用非静态方法,反过来是可以的。而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。这实际上正是static方法的主要用途
1面向对象的特征:抽象,继承,封装,多态性
2基本数据类型:byte,char,short,int,lang,float,double,boolean
3String和StringBuffer的区别?前者的字符串不可改变,后者可以修改。
4说出ArrayList,Vector, LinkedList的存储性能和特性?ArrayList和Vector都采用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。
5EJB是基于哪些技术实现的?SessionBean,EntityBean,Message Driven Bean,基于JNDI,RMI,JAT等技术实现。SessionBean是非持久性对象,
EntityBean是持久性对象
6HashMap和Hashtable的区别?Hashtable和HashMap对象可以让你把一个key和一个value结合起来,key和value必须是对象,所以原始数据类型必须转化为对象后才能进行存储,为了将一个特定类的对象作为key,这个类必须必须提供hashCode(),equals()方法。
区别:hashMap允许存储null(空) key,是非线程安全的,多线程访问它是,它必须提供同步方法;hashTable不允许存储null,是线程安全的,不用提供同步方法。
7final, finally, finalize的区别?final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。finally是异常处理语句结构的一部分,表示总是执行。finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。
8sleep() 和 wait() 有什么区别?sleep()是线程类(Thread)的方法,调用此方法时,可以使线程暂时进入暂停状态,等到其他线程执行完毕后会自动恢复,不会放弃对象锁。而wait()是Object类的方法,会使本线程放弃对象锁,必须通过notify()方法才能唤醒它。
9Overload和Override的区别?二者是多态性的不同表现,重载Overloa是一个类中多态性的表现(定义多个同名方法,它们具有不同的参数个数或者参数类型);重写Override是类之间多态性的表现。
10forward 和redirect的区别?forward是服务器请求资源,服务器直接访问目标URL地址,并把响应内容发给浏览器,地址栏中的地址不会变;redirect是服务端根据逻辑,发出一个状态吗,告诉浏览器重定向哪个URL地址
11什么时候用assert?assertion是一种调试方式,它一般是程序中的一条语句,对一个boolean表达式进行检查,一个正确的程序必须保证这个表达式的值为true。
12short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错? 
short s1 = 1; s1 = s1 + 1; (s1+1运算结果是int型,需要强制转换类型)
short s1 = 1; s1 += 1;(可以正确编译),这两个表达式都被称为赋值表达式。(x = x + i)表达式使用的是简单赋值操作符(=),而(x += i)表达式使用的是复合赋值操作符。Java语言规范中讲到,复合赋值(E1 op=E2)等价于简单赋值(E1=(T)((E1) op (E2))),其中T是E1的类型,除非E1只被计算一次。 换句话说,复合赋值表达式自动地将所执行计算的结果转型为其左侧变量的类型。
13给我一个你最常见到的runtime exception? BufferOverflowException,BufferUnderflowException,EmptyStackException,IllegalArgumentException, IndexOutOfBoundsException, MissingResourceException。
14接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?
接口可以继承接口。抽象类可以实现(implements)接口,抽象类是否可继承实体类,但前提是实体类必须有明确的构造函数。

现在,你应该了解了资料给的那句语焉不详的“实体类必须有明确的构造函数”的含义:

1.没写构造器的,那是拥有默认无参公有构造函数的,子类可以什么都不写,让默认构造器去调用它。这是最初那两行代码的情况。

2.写了子类可访问的无参构造器的,也是一样,子类里可以什么都不写,用默认机制调用。

3.写了 有参构造器却没写无参构造器的,父类里没有子类可访问的无参构造器,子类必须在子类构造器里的第一句写明,调用父类有参构造器,并把参数传进去。

4.声明为final的以及所有构造器都不在子类访问权限之内的类无法继承

 

其实只要是在类的继承中,无论抽象还是实体,都需要符合这个规则的。

15abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?都不能
16Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
Set里的元素是不能重复的,那么用iterator()方法来区分重复与否。equals()是判读两个Set是否相等。
17构造器Constructor是否可被override? 构造器不能被继承,所以不能重写,但可以重载
18 switch 和 case 语句的参数应该是 int、 short、 char 或者 byte。
19请说出你所知道的线程同步的方法。
wait():使一个线程处于等待状态,并且释放所持有的对象的lock。
sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。
notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。
Allnotity():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。
20多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么? 
多线程有两种实现方法,分别是继承Thread类与实现Runnable接口 
同步的实现方面有两种,分别是synchronized,wait与notify
21什么情况下调用doGet()和doPost()?
Jsp页面中的form标签里的method属性为get时调用doGet(),为post时调用doPost()。
21servlet的生命周期
web容器加载servlet,生命周期开始。通过调用servlet的init()方法进行servlet的初始化。通过调用service()方法实现,根据请求的不同调用不同的do***()方法。结束服务,web容器调用servlet的destroy()方法。
22页面间传递对象的方法:session,request,cookie,application
23JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么?JSP本质上市Servlet的简易表现,JSP侧重于视图,Servlet侧重于控制逻辑。
24四种会话跟踪技术
page 当前页面有效 
request  浏览器对服务器的一次请求有效,服务器返回请求后失效 
session 在服务器规定会话最长时间范围内有效,对浏览器串口和其子窗口。 
application 就是对整个正在运行的项目有效了。 
25简述逻辑操作(&,|,^)与条件操作(&&,||)的区别。
区别主要答两点:a.条件操作只能操作布尔型的,而逻辑操作不仅可以操作布尔型,而且可以操作数值型
b.逻辑操作不会产生短路
26简述synchronized和java.util.concurrent.locks.Lock的异同 ?
主要相同点:Lock能完成synchronized所实现的所有功能
主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放。
27EJB的几种类型
会话(Session)Bean ,实体(Entity)Bean 消息驱动的(Message Driven)Bean
会话Bean又可分为有状态(Stateful)和无状态(Stateless)两种
28Servlet执行时一般实现哪几个方法?
public void init(ServletConfig config)
public ServletConfig getServletConfig()
public String getServletInfo()
public void service(ServletRequest request,ServletResponse response)
public void destroy()
29排序都有哪几种方法?请列举。用JAVA实现一个快速排序。
排序的方法有:插入排序(直接插入排序、希尔排序),交换排序(冒泡排序、快速排序),选择排序(直接选择排序、堆排序)
30请对以下在J2EE中常用的名词进行解释(或简单描述)
web容器:给处于其中的应用程序组件(JSP,SERVLET)提供一个环境,我们把遵守以上标准的WEB服务器就叫做J2EE中的WEB容器。
EJB容器:Enterprise java bean 容器。例如邮件服务、事务管理。
JNDI:(Java Naming & Directory Interface)JAVA命名目录服务。主要提供的功能是:提供一个目录系统,让其它各地的应用程序在其上面留下自己的索引,从而满足快速查找和定位分布式应用程序的功能。
JMS:(Java Message Service)JAVA消息服务。主要实现各个应用程序之间的通讯。包括点对点和广播。
JTA:(Java Transaction API)JAVA事务服务。提供各种分布式事务服务。应用程序只需调用其提供的接口即可。
JAF:(Java Action FrameWork)JAVA安全认证框架。提供一些安全控制方面的框架。让开发者通过各种部署和自定义实现自己的个性安全控制策略。
RMI/IIOP:(Remote Method Invocation /internet对象请求中介协议)他们主要用于通过远程调用服务。例如,远程有一台计算机上运行一个程序,它提供股票分析服务,我们可以在本地计算机上实现对其直接调用。当然这是要通过一定的规范才能在异构的系统之间进行通信。RMI是JAVA特有的
31throw语句用来明确地抛出一个“异常”。throws用来标明一个成员函数可能抛出的各种“异常”。
32MVC的各个部分都有那些技术来实现?如何实现? 
MVC是Model-View-Controller的简写。"Model" 代表的是应用的业务逻辑(通过JavaBean,EJB组件实现), "View" 是应用的表示面(由JSP页面产生),"Controller" 是提供应用的处理过程控制(一般是一个Servlet),通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现。这些组件可以进行交互和重用。
33java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?
字节流,字符流。字节流继承于InputStream OutputStream,字符流继承于InputStreamReader OutputStreamWriter。在java.io包中还有许多其他的流,主要是为了提高性能和使用方便。
34什么是java序列化,如何实现java序列化?
序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。
序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的
35List、Map、Set三个接口,存取元素时,各有什么特点?
List 以特定次序来持有元素,可有重复元素。Set 无法拥有重复元素,内部排序。Map 保存key-value值,value可多值。
36jsp有哪些动作?作用分别是什么? 
JSP共有以下6种基本动作 jsp:include:在页面被请求的时候引入一个文件。 jsp:useBean:寻找或者实例化一个JavaBean。 jsp:setProperty:设置JavaBean的属性。 jsp:getProperty:输出某个JavaBean的属性。 jsp:forward:把请求转到一个新的页面。 jsp:plugin:根据浏览器类型为Java插件生成OBJECT或EMBED标记。
37
public class ByteDemo {
2     public static void main(String[] args) {
3         byte b1=2;
4         byte b2=3;
5         b1=(byte)(b1+b2);  // 语句1   加法,转int
6         b1+=b2;            //语句2    赋值,不转int
7     }
8 }
复制代码

  b1+=b2;是否和语句b1=b1+b2完全等价?

    答案是否定的,上面程序中的语句1和语句2给出了证明。语句1中byte类型参数与运算时要先转换为int型,因此要进行强制类型转换。而语句2中,自动进行类型转换(我的理解:我们可以把“b11+=b2;”看做是对“b1=(byte)(b1+b2);”的优化!)


 1 public class Test5 {
 2     public static void main(String [] args){
 3         int i=2;
 4         System.out.println(i++);   //2
 5         System.out.println(i);      //3
 6         int a=i++ + ++i;    //3+5=8
 7         System.out.println(a);
 8         System.out.println(i);  //5
 9         for(int j=0;j<1000;j++){
10             i=i++;
11         }
12         System.out.println(i);   //5
13     }
14 }
复制代码

  程序分析:

  为什么经过1000次循环后,i=i++;的结果仍然是5?

  (老师讲解)++的运算符优先级高于=(赋值)运算符,i++的运算结果为5,进入寄存器,这时寄存器中存放的值为5。然后i的值变为6,继续执行赋值语句,赋值时,把寄存器中的值赋5值给i,因此i的值是5和6之间来回切换的!

  (我的理解)++的运算符优先级高于=(赋值)运算符,因此这个表达式的执行顺序如下:①运算i++这个表达式的结果为----> i的值自加1(i++先参与运算,再自加1),即i的值变为6----> ③将i++这个表达式的值,即第①部的结果赋值给变量i("="表达式是将右边表达式的值赋值与左边的变量,因此是将5赋于i,而不是将6赋于i)。整个循环过程i的值在56之间来回切换。

字符串是常量,一旦被创建,他们的值就不能改变


1 String a="a";
2 String b="b";
3 String c="ab";
4 String d="ab";
5 String e=a+b;

  程序中用来存放数据的内存分为四块
  
1、全局区(静态区)(static)
  2、文字常量区 :常量字符串就是放在这块区域,即是我们常说起的常量池。
  3、栈区(stack):存放函数的参数值,局部变量的值等。
  4、堆区(heap) : 存放对象

  当我们定义字符串
  String a = "a";
  a在栈区,“a”是字符串常量,在常量池中
  String b = "b";
  b在栈区,“b”在常量池
  String c="ab";
  c在栈区,“ab”在常量池
  String d="ab";
  d在栈区,这个时候常量池里已经有"ab",所以直接使用已经有的那个“ab”
  所以这个时候c和d都指向的常量池里面的同一个“ab”
  String e=a+b;
  e在栈区,a+b实际上产生了一个新的String对象,既然是String对象,所以结果“ab”放在堆区中,即e指向的是堆里的“ab”
  这样的情况下,c==d为true,c==e为false

  另外,如果定义的是字符串对象
  String str1 = new String("ab");
  str1在栈区,创建的“ab”字符串对象在堆区
  String str2 = new String("ab");
  str2在栈区,又创建的一个新的“ab”对象也在堆区,不过和刚才的“ab”不是同一个。
  相当于堆区中有两个字符串对象,不过正好内容都是“ab”而已。

Java 接口和Java 抽象类对比

  1 )Java 接口和 Java 抽象类最大的一个区别,就在于 Java 抽象类可以提供某些方法的部分实现,而 Java 接口不可以,这大概就是 Java 抽象类唯一的优点吧,但这个优点非常有用。如果向一个抽象类里加入一个新的具体方法时,那么它所有的子类都一下子都得到了这个新方法,而 Java 接口做不到这一点,如果向一个 Java 接口里加入一个新方法,所有实现这个接口的类就无法成功通过编译了,因为你必须让每一个类都再实现这个方法才行,这显然是Java 接口的缺点。

  2 )一个抽象类的实现只能由这个抽象类的子类给出,也就是说,这个实现处在抽象类所定义出的继承的等级结构中,而由于 Java 语言的单继承性,所以抽象类作为类型定义工具的效能大打折扣。在这一点上,Java 接口的优势就出来了,任何一个实现了一个 Java 接口所规定的方法的类都可以具有这个接口的类型,而一个类可以实现任意多个 Java 接口,从而这个类就有了多种类型。

  3 )从第 2 点不难看出,Java 接口是定义混合类型的理想工具,混合类表明一个类不仅仅具有某个主类型的行为,而且具有其他的次要行为。

  4 )结合 1、2 点中抽象类和Java 接口的各自优势,具经典的设计模式就出来了:声明类型的工作仍然由Java 接口承担,但是同时给出一个Java 抽象类,且实现了这个接口,而其他同属于这个抽象类型的具体类可以选择实现这个 Java 接口,也可以选择继承这个抽象类,也就是说在层次结构中,Java 接口在最上面,然后紧跟着抽象类,哈,这下两个的最大优点都能发挥到极至了。这个模式就是“缺省适配模式”。

  在Java 语言 API 中用了这种模式,而且全都遵循一定的命名规范:Abstract  +接口名。 Java 接口和Java抽象类的存在就是为了用于具体类的实现和继承的,如果你准备写一个具体类去继承另一个具体类的话,那你的设计就有很大问题了。Java 抽象类就是为了继承而存在的,它的抽象方法就是为了强制子类必须去实现的。


方法、代码块 

  注1. 一个方法中定义的局部变量是不能被声明为静态的。因为静态修饰符 static是一个与类而非类实例相关的概念,而方法是一个局部概念,它们附属于类实例,其生命周期不同于类实例,更不同于类,而方法内部变量会随着方法的推出而被撤销,因此一个方法体中声明的局部变量是不能被 static 修饰的。即使方法被声明为静态的,其内部变量也不能被声明为静态的。一个被 static 修饰符修饰的静态方法,除了可以访问中其内部定义的变量外,则只能访问被static 修饰符修饰的静态变量。如果需要访问非静态类的属性,则必须先实例化一个类实例,再通过该类实例引用非静态类的属性。但是,一个非静态的方法可以访问一个静态变量。

  注2. 对静态方法和非静态方法的调用方式不同,对非静态方法的调用时在运行期决定的,而对静态方法的调用则发生在编译期。一个非静态方法可以调用一个静态方法,但是不允许一个静态方法直接调用非静态方法,除非通过类实例调用。

  注3. 一个静态方法不能重写为一个非静态方法,只能被重写为一个静态方法,但是可以被重载为一个非静态的方法,重写的含义是始终只有一个定义,只是原来的含义完全被后来的含义所取代,即形式不能变,而重载的含义是指同一个样的东西在不同的地方具有不同的含义。

  注4. 静态代码块不是一个方法,实际上只是一个 static修饰符,后跟一个方法主体(一对大括号内的一组语句) 。静态代码块主要用于初始化,该代码块中的代码仅被执行一次,即在构造函数执行前执行,而且只执行一次,如果继承的父类里有静态代码块,先执行父类的,但是子类的静态代码块还是要先于父类的构造函数。如果一个类中存在多个静态代码块,那么其运行次序取决于在类中定义的次序。

  注5. 非静态代码块不是一个方法,实际上只是一个方法主体( 一对大括号内的一组语句)。每当创建类实例时,非静态代码块获得执行,其运行在父类构造器之后,所在类构造器之前。如果一个类中存在多个非静态代码块,那么其运行顺序取决于在类中定义的次序。


&与&&的区别:&&还具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式,例如,对于if(str!=null&&!str.equals(“”))表达式,当str为null时,后面的表达式不会执行,所以不会出现NullPointerException如果将&&改为&,则会抛出NullPointerException异常。If(x==33&++y>0)y会增长,If(x==33&&++y>0)不会增长

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

  2<<3,因为将一个数左移n位,就相当于乘以了2的n次方,那么,一个数乘以8只要将其左移3位即可,而位运算cpu直接支持的,效率最高,所以,2乘以8等於几的最效率的方法是2<<3。


 使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。

public class Test {
2     public static void main(String[] args) {
3         final StringBuffer a=new StringBuffer("Hello");
4         //a=new StringBuffer("hello");//编译错误
5         a.append(",world");
6         System.out.println(a.toString());//Hello,world
7     }
8 }

Integer和int的区别

  1)int是java提供的8中原始数据类型之一,java为每个呀un是数据类型提供了封装类,Integer是java为int提供的封装类(封装类=数据+操作)。

  2)int的默认值为0,而Integer的默认值为null,即Integer可以区分出为赋值和值为0的区别,int无法表达出为赋值的情况。例如:想要表达出没有参加考试和考试成绩为0的区别,只能使用Integer。在JSP中Integer的默认值为null,所以用EL表达式在文本框中显示时,值为空表字符串,而int默认值为0,所以用EL表达式在文本框中显示时,结果为0,所以,int不适合作为WEB层的表单数据的类型。

访问权限:public、private、protected和默认

                   当前类        同一package       子孙类       其他package

    public            Y                   Y                   Y                 Y

    protected      Y                   Y                   Y                 N

    friendly         Y                   Y                   N                 N

    private         Y                   N                   N                 N

  注:friendly并不是java的关键字,只有当变量前面没有写明任何访问权限修饰符时,就默认以friendly作为访问权限。

拷贝对象返回的是一个新对象,而不是一个引用。二是拷贝对象与用 new操作符返回的新对象的区别就是这个拷贝已经包含了一些原来对象的信息,而不是对象的初始信息。


  面向对象编程语言有封装、继承、抽象、多态4个主要的特征。

  1)封装:封装是保证软件部件具有优良的模块性的基础,封装的目标就是要实现软件部件的“高内聚、低耦合”,防止程序相互依赖而带来的变动影响。在面向对象的编程语言中,对象是封装的基本单位。面向对象的封装就是把描述一个对象的属性和行为的代码封装到一个“模块”中,即一个类中。只要把变量和访问这个变量的方法放在一起,将一个类中的成员变量全部定义为私有的,只有这个类的方法可以访问,这就基本上实现了对象的封装。

  2)抽象:抽象就是找出一些事物的相似和共性之处,然后将这些事物归为一个类,这个类只考虑这些事物的相似和共性之处,并且会忽略与当前主题和目标无关的哪些部分,将注意力集中在与当前目标有关的方面。

  3)继承:继承是子类自动共享父类数据和方法的机制,这是类之间的一种关系,提高了软件的重用性和可扩展性。

4)多态:多态是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行时才确定,即一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在程序运行期间才能决定。因为在程序运行时才能确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,、重载Overloading是一个类中多态性的一种表现。

控制反转传统模式中是类和类之间直接调用,所以有很强的耦合度,程序之间的依赖关系比较强,后期维护时牵扯的比较多。
IOC,用配置文件(XML)来描述类与类之间的关系,由容器来管理,降低了程序间的耦合度,程序的修改可以通过简单的配置文件修改来实现

aop(面向切面编程)可以 通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一 添加功能的一种技术。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值