JAVA试题—基础篇,不断更新!!!

1, 数组中有没有length()这个方法?String中有没有 length()这个方法?

答:数组中是没有length()这个方法的,数组有有一个与之同名的,但不是方法,


而是属性,用来表示数组的长度。


    String中有length()这个方法,作用为获得字符串的长度。


    初级程序员在这里容易入坑


2,类的实例化是什么意思?

类是指:描述一种事物的定义,是个抽象的概念
实例指:该种事物的一个具体的个体,是具体的东西

打个比方:
“人”是一个类。“张三”是人类的一个具体例子

在编程时也是同样的道理,你先自己定义一个“类”,当你需要用时,用“类”的定义来创造一个具体的例子。

用类的定义来创建一个实例,就叫做类的实例化。
3,

Servlet简介及其生命周期详解

一:Servlet是什么

        Servlet是运行在Web服务器上的Java程序,作为处理来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。JSP在web服务器上要先转换成servlet,然后才能在JVM运行,并把结果拼接成浏览器可识别的文件(如html)传回浏览器显示。

    二:Servlet的应用场景

        单纯地对客户端的请求做处理时,如果我们用纯JSP文件(即:只有Java语句)来处理的话,还需要先转换为servlet才能运行。与其这样,我们可以直接定义servlet文件来处理来自页面的请求。

    三:Servlet的生命周期

          Servlet的生命周期主要有三个阶段:初始化——服务——销毁。

          初始化:主要包括 加载、配置、创建实例 三部分。
                   加载:在客户端首次请求该Servlet时,或着在web.xml配置该servlet属性 <load-on-startup>1</load-on-startup>则随着web服务器启动而加载
                   配置:为每个Servlet设置信息产生一个ServletConfig对象;

                   创建:调用Servlet接口的init()方法,并将产生的ServletConfig对象当作参数传入。在Servlet的生命周期中,仅执行一次init()方法。它在web服务器装入Servlet时执行,负责初始化Servlet对象。同一个类型的Servlet对象在web服务器中以单例的形式存在。                  

init()方法是servlet生命的起点。一旦加载了某个servlet,服务器将立即调用它的init()方法。

           服务:每一次请求来到容器时,会产生HttpServletRequest与HttpServlceResponse对象,并作为参数传给Service()。Service()负责响应客户的请求。每当一个客户请求一个HttpServlet对象,该对象的Service()方法就要被调用,而且传递给这个方法一个“请求”(ServletRequest)对象和一个“响应”(ServletResponse)对象作为参数。然后该方法自动进行匹配(根据request类型),调用doGet()或doPost()方法来处理请求。

HttpServlet是GenericServlet的子类。 
GenericServlet是个抽象类,必须给出子类才能实例化。它给 出了设计servlet的一些骨架,定义了servlet生命周期,还有一些得到名字、配置、初始化参数的方法,其设计的是和应用层协议无关的,也就是说 你有可能用非http协议实现它。 
HttpServlet是子类,当然就具有GenericServlet的一切特性,还添加了doGet, doPost, doDelete, doPut, doTrace等方法对应处理http协议里的命令的请求响应过程。 
一般没有特殊需要,自己写的Servlet都扩展HttpServlet 。


简介

        Servlet生命周期,即阐述Servlet从产生到毁灭的整个过程。 
        在Servlet产生到消亡的过程中,有三个生命周期函数,初始化方法init(),处理客户请求的方法service(),终止方法destroy()。

init方法

        在一个Servlet的生命周期中,init方法只会被执行一次,之后无论用户执行多少次请求,都不会在调用该方法。 
        关于init方法的执行时机,有两种方式可选,一般的是在服务器启动后第一个用户请求改Servlet是调用,你也可以设置该Servlet在服务器启动后自动执行。 
init方法负责简单的创建或者加载一些数据,这些数据将用于该Servlet的整个生命周期中。

service方法

        当一个客户请求改Servlet时,实际的处理工作全部有service方法来完成,service方法用来处理客户端的请求,并生成格式化数据返回给客户端。 
        每一次请求服务器都会开启一个新的线程并执行一次service方法,service根据客户端的请求类型,调用doGet、doPost等方法。 
        service是由web容器来调用的,我们无需对service具体内容做任何处理,service会自动的根据客户端的请求类型去调用doGet、doPost等方法,所以我们只需要做好doGet、doPost方法的实现就可以了。

destroy方法

        该方法在整个生命周期中,也是只会被调用一次,在Servlet对象被销毁是调用,在servlet中,我们可以做一些资源的释放等操作,执行destory方法之后的servlet对象,会等待jvm虚拟机的垃圾回收机制择时回收。

doGet、doPost方法

        实际的业务处理流程,service根据客户端的请求类型来自动匹配需要执行那个方法。

总结

        servlet生命周期是学习servlet中至关重要的一部分,理解好servlet生命周期,有助于后期对servlet更加深入的学习。


4,

.thread类的基本方法有哪些?


start();//启动线程

getId();//获得线程ID

getName();//获得线程名字

getPriority();//获得优先权

isAlive();//判断线程是否活动

isDaemon();//判断是否守护线程

getState();//获得线程状态

sleep(long mill);//休眠线程

join();//等待线程结束

yield();//放弃cpu使用权利

interrupt();//中断线程

currentThread();//获得正在执行的线程对象


5.double与Double的区别?

(1)Double 是类,double是基本数据类型。

(2)Double类型是double的包装类,也就是对象化了。在JDK1.5以后,二者可以直接相互赋值,称为自动拆箱和自动装箱。

(3)double是保留字,而Double不是。


6.String和StringBuffer选择的区别:

      StringBuffer类和String类一样,也用来代表字符串,只是由于StringBuffer的内部实现方式与String不同,所以StringBuffer在进行字符串处理时,不生成新对象,在内存使用上要优于String类。因此,在实际使用时,如果经常需要对一个字符串进行修改,例如插入、删除等操作,使用StringBuffer要更加适合一些。
在StringBuffer类中存在很多和String类一样的方法,这些方法在功能上和String类中的功能是完全一样的。但是有一个显著的区别在于,对于StringBuffer对象的每次修改都会改变对象自身,这点是和String类最大的区别。
另外,由于StringBuffer是线程安全的,所以在多线程程序中也可以很方便地进行使用,但是程序的执行效率相对来说就要稍微慢一些。
    另有博客Java中的String,StringBuilder,StringBuffer三者的区别》进行详细的讲解



7,简述ArrayList、Vector、LinkedList的存储性能和特性。
    ArrayList 和Vector他们底层的实现都是一样的,都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢。
    Vector中的方法由于添加了synchronized修饰,因此Vector是线程安全的容器,但性能上较ArrayList差,因此已经是Java中的遗留容器。
    LinkedList使用双向链表实现存储(将内存中零散的内存单元通过附加的引用关联起来,形成一个可以按序号索引的线性结构,这种链式存储方式与数组的连续存储方式相比,内存的利用率更高),按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。            
    Vector属于遗留容器(Java早期的版本中提供的容器,除此之外,Hashtable、Dictionary、BitSet、Stack、Properties都是遗留容器),已经不推荐使用,但是由于ArrayList和LinkedListed都是非线程安全的,如果遇到多个线程操作同一个容器的场景,则可以通过工具类Collections中的synchronizedList方法将其转换成线程安全的容器后再使用(这是对装潢模式的应用,将已有对象传入另一个类的构造器中创建新的对象来增强实现)。


8.Collection和Collections的区别?

  Collection是集合类的一个顶级接口,其直接接口有List与Set.

  而Collections则是集合类的一个工具类/帮助类,其中提供了一系列静态方法,用于对集合中元素进行排序、搜索以及线程安全等各种操作。


9.多线程有几种实现方法,都是什么?哪一种方式比较优秀?同步有几种实现方法,都是什么?

   多线程的实现方法有:继承Thread类,实现Runable接口。

   同步的实现方法有:wait(),synchronized(),notify(),sleep(),Allnotity()。


10,什么是线程池?为什么要使用它?

       线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。如果某个线程在托管代码中空闲(如正在等待某个事件),则线程池将插入另一个辅助线程来使所有处理器保持繁忙。如果所有线程池线程都始终保持繁忙,但队列中包含挂起的工作,则线程池将在一段时间后创建另一个辅助线程但线程的数目永远不会超过最大值。超过最大值的线程可以排队,但他们要等到其他线程完成后才启动。

      应用程序可以有多个线程,这些线程在休眠状态中需要耗费大量时间来等待事件发生。其他线程可能进入睡眠状态,并且仅定期被唤醒以轮循更改或更新状态信息,然后再次进入休眠状态。为了简化对这些线程的管理,.NET框架为每个进程提供了一个线程池,一个线程池有若干个等待操作状态,当一个等待操作完成时,线程池中的辅助线程会执行回调函数。线程池中的线程由系统管理,程序员不需要费力于线程管理,可以集中精力处理应用程序任务。


11,JAVA中的集合

    详见博客《Java中Set,List,Map的区别》


12,Java的接口和抽象类

    详见博客《Java的接口和抽象类


13,JAVA中的重写和重载!

    

重载 overloading
1) 
方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数/类型。重载是一个类中多态性的一种表现。
2) Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。调用方法时通过传递给它们的不同参数个数和参数类型给它们的不同参数个数和参数类型给它们的不同参数个数和参数类型来决定具体使用哪个方法这就是多态性。
3) 重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准。


例子
package c04.answer;//这是包名
//这是这个程序的第一种编程方法,在main方法中先创建一个Dog类实例,然后在Dog
类的构造方法中利用this关键字调用不同的bark方法。不同的重载方法bark是根据其参
数类型的不同而区分的。
 
//注意:除构造器以外,编译器禁止在其他任何地方中调用构造器。
package c04.answer;
 
public class Dog {
     Dog()
     {
            this.bark();
     }
     void bark()//bark()方法是重载方法
     {
            System.out.println("no barking!");
            this.bark("female", 3.4);
     }
     void bark(String m,double l)//注意:重载的方法的返回值都是一样的,
     {
            System.out.println("a barking dog!");
            this.bark(5, "China");
     }
     void bark(int a,String n)//不能以返回值区分重载方法,而只能以“参数类型”和“类名”来区分
     {
            System.out.println("a howling dog");
     }
    
     public static void main(String[] args)
     {
            Dog dog = new Dog();
            //dog.bark();
            //dog.bark("male", "yellow");
            //dog.bark(5, "China");
           
           
重写overriding
1) 父类与子类之间的多态性,对父类的函数进行重新定义。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)Java中,子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。方法重写又称方法覆盖。

2) 若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。如需父类中原有的方法,可使用super关键字,该关键字引用了当前类的父类。

3) 子类函数的访问修饰权限不能少于父类的;

例子
public class Base
{
    void test(int i)
    {
        System.out.print(i);
    }
    void test(byte b)
    {
        System.out.print(b);
    }
}
public class TestOverriding extends Base
{
    void test(int i)
    {
        i++;
        System.out.println(i);
    }
      public static void main(String[]agrs)
    {
        Base b=new TestOverriding();
        b.test(0)
        b.test((byte)0)
    }
}
这时的输出结果是
1     0,这是运行时动态绑定的结果。

总结:重载和重写(覆盖)

方法的重写
Overriding和重载OverloadingJava多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,

将调用子类中的定义,对它而
言,父类中的定义如同被屏蔽了,而且如果子类的方法名和参数类型和个数都和父类相同,那么子类的返回值类型必须和父类的相同;如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载Overloaded的方法

是可以改变返回值的类型。也就是说,重载的返回
值类型可以相同也可以不同。


附录:动态绑定即调用对象方法的机制

1) 编译器检查对象声明的类型和方法名,从而获取所有候选方法。试着把上例Base类的test注释掉,这时再编译就无法通过。

2) 重载决策:编译器检查方法调用的参数类型,从上述候选方法选出唯一的那一个
(其间会有隐含类型转化)。如果编译器找到多于一个或者没找到,此时编译器就会报错。试着把上例Base类的test(byte b)注释掉,这时运行结果是1 1

3) 
若方法类型为priavte static final java采用静态编译,编译器会准确知道该调用哪个方法。

4) 
当程序运行并且使用动态绑定来调用一个方法时,那么虚拟机必须调用对象的实际类型相匹配的方法版本。在例子中,b所指向的实际类型是TestOverriding,所以b.test(0)调用子类的test。但是,子类并没有重写test(byte b),所以b.test((byte)0)调用的是父类
test(byte b)。如果把父类的(byte b)注释掉,则通过第二步隐含类型转化为int,最终调用的是子类的test(int i)

14,关于关于静态页面和动态页面两者区别的简单直接的描述

1、静态页面就是设计者把页面上所有东西都设定好、做死了,然后放上去,不管是谁在任何时候看到的页面内容都是一样的,一成不变(除非手动修改页面内容)。静态html页面文件,可以直接用本地的浏览器打开。比如:file:///Users/Phil/Documents/DevOps/HBuilderProjects/testJSP/index.html。
2、动态页面的内容一般都是依靠服务器端的程序来生成的,不同人、不同时候访问页面,显示的内容都可能不同。网页设计者在写好服务器端的页面程序后,不需要手工控制,页面内容会按照页面程序的安排自动更改变换。


15,final、finally、finalize区别

 Final用于修饰类、成员变量和成员方法。final修饰的类,不能被继承(StringStringBuilderStringBufferMath,不可变类),其中所有的方法都不能被重写,所以不能同时用abstractfinal修饰类(abstract修饰的类是抽象类,抽象类是用于被子类继承的,和final起相反的作用);Final修饰的方法不能被重写,但是子类可以用父类中final修饰的方法;Final修饰的成员变量是不可变的,如果成员变量是基本数据类型,初始化之后成员变量的值不能被改变,如果成员变量是引用类型,那么它只能指向初始化时指向的那个对象,不能再指向别的对象,但是对象当中的内容是允许改变的。

JAVA试题—基础篇,不断更新!!!

  Final修饰的形参,不能在方法中对形参赋值

JAVA试题—基础篇,不断更新!!!

Final修饰的局部变量和成员变量情况一样,一旦赋值,不可改变。

JAVA试题—基础篇,不断更新!!!

   方法内声明的类或者方法内的匿名内部类,访问该方法内定义的变量,该变量必须要用final修饰。当内部类访问局部变量时,会扩大局部变量的作用域,如果局部变量不用 final 修饰,我们就可以在内部类中随意修改该局部变量值,而且是在该局部变量的作用域范围之外可以看到这些修改后的值,会出现安全问题。

JAVA试题—基础篇,不断更新!!!JAVA试题—基础篇,不断更新!!!

参考:http://www.cnblogs.com/hapjin/p/5744478.html

    Finally通常和try catch搭配使用,保证不管有没有发生异常,资源都能够被释放(释放连接、关闭IO流)。

    Finalize是object类中的一个方法,子类可以重写finalize()方法实现对资源的回收。垃圾回收只负责回收内存,并不负责资源的回收,资源回收要由程序员完成,Java虚拟机在垃圾回收之前会先调用垃圾对象的finalize方法用于使对象释放资源(如关闭连接、关闭文件),之后才进行垃圾回收,这个方法一般不会显示的调用,在垃圾回收时垃圾回收器会主动调用。



1, 数组中有没有length()这个方法?String中有没有 length()这个方法?

答:数组中是没有length()这个方法的,数组有有一个与之同名的,但不是方法,


而是属性,用来表示数组的长度。


    String中有length()这个方法,作用为获得字符串的长度。


    初级程序员在这里容易入坑


2,类的实例化是什么意思?

类是指:描述一种事物的定义,是个抽象的概念
实例指:该种事物的一个具体的个体,是具体的东西

打个比方:
“人”是一个类。“张三”是人类的一个具体例子

在编程时也是同样的道理,你先自己定义一个“类”,当你需要用时,用“类”的定义来创造一个具体的例子。

用类的定义来创建一个实例,就叫做类的实例化。
3,

Servlet简介及其生命周期详解

一:Servlet是什么

        Servlet是运行在Web服务器上的Java程序,作为处理来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。JSP在web服务器上要先转换成servlet,然后才能在JVM运行,并把结果拼接成浏览器可识别的文件(如html)传回浏览器显示。

    二:Servlet的应用场景

        单纯地对客户端的请求做处理时,如果我们用纯JSP文件(即:只有Java语句)来处理的话,还需要先转换为servlet才能运行。与其这样,我们可以直接定义servlet文件来处理来自页面的请求。

    三:Servlet的生命周期

          Servlet的生命周期主要有三个阶段:初始化——服务——销毁。

          初始化:主要包括 加载、配置、创建实例 三部分。
                   加载:在客户端首次请求该Servlet时,或着在web.xml配置该servlet属性 <load-on-startup>1</load-on-startup>则随着web服务器启动而加载
                   配置:为每个Servlet设置信息产生一个ServletConfig对象;

                   创建:调用Servlet接口的init()方法,并将产生的ServletConfig对象当作参数传入。在Servlet的生命周期中,仅执行一次init()方法。它在web服务器装入Servlet时执行,负责初始化Servlet对象。同一个类型的Servlet对象在web服务器中以单例的形式存在。                  

init()方法是servlet生命的起点。一旦加载了某个servlet,服务器将立即调用它的init()方法。

           服务:每一次请求来到容器时,会产生HttpServletRequest与HttpServlceResponse对象,并作为参数传给Service()。Service()负责响应客户的请求。每当一个客户请求一个HttpServlet对象,该对象的Service()方法就要被调用,而且传递给这个方法一个“请求”(ServletRequest)对象和一个“响应”(ServletResponse)对象作为参数。然后该方法自动进行匹配(根据request类型),调用doGet()或doPost()方法来处理请求。

HttpServlet是GenericServlet的子类。 
GenericServlet是个抽象类,必须给出子类才能实例化。它给 出了设计servlet的一些骨架,定义了servlet生命周期,还有一些得到名字、配置、初始化参数的方法,其设计的是和应用层协议无关的,也就是说 你有可能用非http协议实现它。 
HttpServlet是子类,当然就具有GenericServlet的一切特性,还添加了doGet, doPost, doDelete, doPut, doTrace等方法对应处理http协议里的命令的请求响应过程。 
一般没有特殊需要,自己写的Servlet都扩展HttpServlet 。


简介

        Servlet生命周期,即阐述Servlet从产生到毁灭的整个过程。 
        在Servlet产生到消亡的过程中,有三个生命周期函数,初始化方法init(),处理客户请求的方法service(),终止方法destroy()。

init方法

        在一个Servlet的生命周期中,init方法只会被执行一次,之后无论用户执行多少次请求,都不会在调用该方法。 
        关于init方法的执行时机,有两种方式可选,一般的是在服务器启动后第一个用户请求改Servlet是调用,你也可以设置该Servlet在服务器启动后自动执行。 
init方法负责简单的创建或者加载一些数据,这些数据将用于该Servlet的整个生命周期中。

service方法

        当一个客户请求改Servlet时,实际的处理工作全部有service方法来完成,service方法用来处理客户端的请求,并生成格式化数据返回给客户端。 
        每一次请求服务器都会开启一个新的线程并执行一次service方法,service根据客户端的请求类型,调用doGet、doPost等方法。 
        service是由web容器来调用的,我们无需对service具体内容做任何处理,service会自动的根据客户端的请求类型去调用doGet、doPost等方法,所以我们只需要做好doGet、doPost方法的实现就可以了。

destroy方法

        该方法在整个生命周期中,也是只会被调用一次,在Servlet对象被销毁是调用,在servlet中,我们可以做一些资源的释放等操作,执行destory方法之后的servlet对象,会等待jvm虚拟机的垃圾回收机制择时回收。

doGet、doPost方法

        实际的业务处理流程,service根据客户端的请求类型来自动匹配需要执行那个方法。

总结

        servlet生命周期是学习servlet中至关重要的一部分,理解好servlet生命周期,有助于后期对servlet更加深入的学习。


4,

.thread类的基本方法有哪些?


start();//启动线程

getId();//获得线程ID

getName();//获得线程名字

getPriority();//获得优先权

isAlive();//判断线程是否活动

isDaemon();//判断是否守护线程

getState();//获得线程状态

sleep(long mill);//休眠线程

join();//等待线程结束

yield();//放弃cpu使用权利

interrupt();//中断线程

currentThread();//获得正在执行的线程对象


5.double与Double的区别?

(1)Double 是类,double是基本数据类型。

(2)Double类型是double的包装类,也就是对象化了。在JDK1.5以后,二者可以直接相互赋值,称为自动拆箱和自动装箱。

(3)double是保留字,而Double不是。


6.String和StringBuffer选择的区别:

      StringBuffer类和String类一样,也用来代表字符串,只是由于StringBuffer的内部实现方式与String不同,所以StringBuffer在进行字符串处理时,不生成新对象,在内存使用上要优于String类。因此,在实际使用时,如果经常需要对一个字符串进行修改,例如插入、删除等操作,使用StringBuffer要更加适合一些。
在StringBuffer类中存在很多和String类一样的方法,这些方法在功能上和String类中的功能是完全一样的。但是有一个显著的区别在于,对于StringBuffer对象的每次修改都会改变对象自身,这点是和String类最大的区别。
另外,由于StringBuffer是线程安全的,所以在多线程程序中也可以很方便地进行使用,但是程序的执行效率相对来说就要稍微慢一些。
    另有博客Java中的String,StringBuilder,StringBuffer三者的区别》进行详细的讲解



7,简述ArrayList、Vector、LinkedList的存储性能和特性。
    ArrayList 和Vector他们底层的实现都是一样的,都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢。
    Vector中的方法由于添加了synchronized修饰,因此Vector是线程安全的容器,但性能上较ArrayList差,因此已经是Java中的遗留容器。
    LinkedList使用双向链表实现存储(将内存中零散的内存单元通过附加的引用关联起来,形成一个可以按序号索引的线性结构,这种链式存储方式与数组的连续存储方式相比,内存的利用率更高),按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。            
    Vector属于遗留容器(Java早期的版本中提供的容器,除此之外,Hashtable、Dictionary、BitSet、Stack、Properties都是遗留容器),已经不推荐使用,但是由于ArrayList和LinkedListed都是非线程安全的,如果遇到多个线程操作同一个容器的场景,则可以通过工具类Collections中的synchronizedList方法将其转换成线程安全的容器后再使用(这是对装潢模式的应用,将已有对象传入另一个类的构造器中创建新的对象来增强实现)。


8.Collection和Collections的区别?

  Collection是集合类的一个顶级接口,其直接接口有List与Set.

  而Collections则是集合类的一个工具类/帮助类,其中提供了一系列静态方法,用于对集合中元素进行排序、搜索以及线程安全等各种操作。


9.多线程有几种实现方法,都是什么?哪一种方式比较优秀?同步有几种实现方法,都是什么?

   多线程的实现方法有:继承Thread类,实现Runable接口。

   同步的实现方法有:wait(),synchronized(),notify(),sleep(),Allnotity()。


10,什么是线程池?为什么要使用它?

       线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。如果某个线程在托管代码中空闲(如正在等待某个事件),则线程池将插入另一个辅助线程来使所有处理器保持繁忙。如果所有线程池线程都始终保持繁忙,但队列中包含挂起的工作,则线程池将在一段时间后创建另一个辅助线程但线程的数目永远不会超过最大值。超过最大值的线程可以排队,但他们要等到其他线程完成后才启动。

      应用程序可以有多个线程,这些线程在休眠状态中需要耗费大量时间来等待事件发生。其他线程可能进入睡眠状态,并且仅定期被唤醒以轮循更改或更新状态信息,然后再次进入休眠状态。为了简化对这些线程的管理,.NET框架为每个进程提供了一个线程池,一个线程池有若干个等待操作状态,当一个等待操作完成时,线程池中的辅助线程会执行回调函数。线程池中的线程由系统管理,程序员不需要费力于线程管理,可以集中精力处理应用程序任务。


11,JAVA中的集合

    详见博客《Java中Set,List,Map的区别》


12,Java的接口和抽象类

    详见博客《Java的接口和抽象类


13,JAVA中的重写和重载!

    

重载 overloading
1) 
方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数/类型。重载是一个类中多态性的一种表现。
2) Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。调用方法时通过传递给它们的不同参数个数和参数类型给它们的不同参数个数和参数类型给它们的不同参数个数和参数类型来决定具体使用哪个方法这就是多态性。
3) 重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准。


例子
package c04.answer;//这是包名
//这是这个程序的第一种编程方法,在main方法中先创建一个Dog类实例,然后在Dog
类的构造方法中利用this关键字调用不同的bark方法。不同的重载方法bark是根据其参
数类型的不同而区分的。
 
//注意:除构造器以外,编译器禁止在其他任何地方中调用构造器。
package c04.answer;
 
public class Dog {
     Dog()
     {
            this.bark();
     }
     void bark()//bark()方法是重载方法
     {
            System.out.println("no barking!");
            this.bark("female", 3.4);
     }
     void bark(String m,double l)//注意:重载的方法的返回值都是一样的,
     {
            System.out.println("a barking dog!");
            this.bark(5, "China");
     }
     void bark(int a,String n)//不能以返回值区分重载方法,而只能以“参数类型”和“类名”来区分
     {
            System.out.println("a howling dog");
     }
    
     public static void main(String[] args)
     {
            Dog dog = new Dog();
            //dog.bark();
            //dog.bark("male", "yellow");
            //dog.bark(5, "China");
           
           
重写overriding
1) 父类与子类之间的多态性,对父类的函数进行重新定义。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)Java中,子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。方法重写又称方法覆盖。

2) 若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。如需父类中原有的方法,可使用super关键字,该关键字引用了当前类的父类。

3) 子类函数的访问修饰权限不能少于父类的;

例子
public class Base
{
    void test(int i)
    {
        System.out.print(i);
    }
    void test(byte b)
    {
        System.out.print(b);
    }
}
public class TestOverriding extends Base
{
    void test(int i)
    {
        i++;
        System.out.println(i);
    }
      public static void main(String[]agrs)
    {
        Base b=new TestOverriding();
        b.test(0)
        b.test((byte)0)
    }
}
这时的输出结果是
1     0,这是运行时动态绑定的结果。

总结:重载和重写(覆盖)

方法的重写
Overriding和重载OverloadingJava多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,

将调用子类中的定义,对它而
言,父类中的定义如同被屏蔽了,而且如果子类的方法名和参数类型和个数都和父类相同,那么子类的返回值类型必须和父类的相同;如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载Overloaded的方法

是可以改变返回值的类型。也就是说,重载的返回
值类型可以相同也可以不同。


附录:动态绑定即调用对象方法的机制

1) 编译器检查对象声明的类型和方法名,从而获取所有候选方法。试着把上例Base类的test注释掉,这时再编译就无法通过。

2) 重载决策:编译器检查方法调用的参数类型,从上述候选方法选出唯一的那一个
(其间会有隐含类型转化)。如果编译器找到多于一个或者没找到,此时编译器就会报错。试着把上例Base类的test(byte b)注释掉,这时运行结果是1 1

3) 
若方法类型为priavte static final java采用静态编译,编译器会准确知道该调用哪个方法。

4) 
当程序运行并且使用动态绑定来调用一个方法时,那么虚拟机必须调用对象的实际类型相匹配的方法版本。在例子中,b所指向的实际类型是TestOverriding,所以b.test(0)调用子类的test。但是,子类并没有重写test(byte b),所以b.test((byte)0)调用的是父类
test(byte b)。如果把父类的(byte b)注释掉,则通过第二步隐含类型转化为int,最终调用的是子类的test(int i)

14,关于关于静态页面和动态页面两者区别的简单直接的描述

1、静态页面就是设计者把页面上所有东西都设定好、做死了,然后放上去,不管是谁在任何时候看到的页面内容都是一样的,一成不变(除非手动修改页面内容)。静态html页面文件,可以直接用本地的浏览器打开。比如:file:///Users/Phil/Documents/DevOps/HBuilderProjects/testJSP/index.html。
2、动态页面的内容一般都是依靠服务器端的程序来生成的,不同人、不同时候访问页面,显示的内容都可能不同。网页设计者在写好服务器端的页面程序后,不需要手工控制,页面内容会按照页面程序的安排自动更改变换。


15,final、finally、finalize区别

 Final用于修饰类、成员变量和成员方法。final修饰的类,不能被继承(StringStringBuilderStringBufferMath,不可变类),其中所有的方法都不能被重写,所以不能同时用abstractfinal修饰类(abstract修饰的类是抽象类,抽象类是用于被子类继承的,和final起相反的作用);Final修饰的方法不能被重写,但是子类可以用父类中final修饰的方法;Final修饰的成员变量是不可变的,如果成员变量是基本数据类型,初始化之后成员变量的值不能被改变,如果成员变量是引用类型,那么它只能指向初始化时指向的那个对象,不能再指向别的对象,但是对象当中的内容是允许改变的。

JAVA试题—基础篇,不断更新!!!

  Final修饰的形参,不能在方法中对形参赋值

JAVA试题—基础篇,不断更新!!!

Final修饰的局部变量和成员变量情况一样,一旦赋值,不可改变。

JAVA试题—基础篇,不断更新!!!

   方法内声明的类或者方法内的匿名内部类,访问该方法内定义的变量,该变量必须要用final修饰。当内部类访问局部变量时,会扩大局部变量的作用域,如果局部变量不用 final 修饰,我们就可以在内部类中随意修改该局部变量值,而且是在该局部变量的作用域范围之外可以看到这些修改后的值,会出现安全问题。

JAVA试题—基础篇,不断更新!!!JAVA试题—基础篇,不断更新!!!

参考:http://www.cnblogs.com/hapjin/p/5744478.html

    Finally通常和try catch搭配使用,保证不管有没有发生异常,资源都能够被释放(释放连接、关闭IO流)。

    Finalize是object类中的一个方法,子类可以重写finalize()方法实现对资源的回收。垃圾回收只负责回收内存,并不负责资源的回收,资源回收要由程序员完成,Java虚拟机在垃圾回收之前会先调用垃圾对象的finalize方法用于使对象释放资源(如关闭连接、关闭文件),之后才进行垃圾回收,这个方法一般不会显示的调用,在垃圾回收时垃圾回收器会主动调用。