夏晨Season

永远不要放弃你那颗追梦之心 up up~。

java面试题(持续更新中)

1、写出内部类的特点

Java中的内部类共分为四种:

静态内部类:只可以访问外部类的静态成员和静态方法,包括了私有的静态成员和方法生成静态内部类对象的方式为:
OuterClass.InnerClass inner = new OuterClass.InnerClass();
  成员内部类:它可以访问它的外部类的所有成员变量和方法,不管是静态的还是非静态的都可以。
在外部类里面创建成员内部类的实例:this.new Innerclass();
在外部类之外创建内部类的实例:(new Outerclass()).new Innerclass();
在内部类里访问外部类的成员:Outerclass.this.member
  局部内部类:像局部变量一样,不能被public, protected, private和static修饰。只能访问方法中定义的final类型的局部变量。
局部内部类在方法中定义,所以只能在方法中使用,即只能在方法当中生成局部内部类的实例并且调用其方法。
  匿名内部类:匿名内部类就是没有名字的局部内部类,不使用关键字class, extends, implements, 没有构造方法。
生成的.class文件中,匿名类会生成OuterClass$1.class文件,数字根据是第几个匿名类而类推。

2、写出&和&&的区别,并计算出3&4的结果。

&和&&都可以做逻辑运算,运算的两边都必须为真才返回真,不同的是&&运算左边时如果为false则后面就不判断了,而&运算会把表达式运算完。
&也叫位与,是按二进制进行与计算,它的计算规则是:
&&也叫逻辑与,是按逻辑计算,它的计算规则是一假必假。
3&4是按位运算,3的二进制表示为011,4的二进制为100,所以结果为0;如果是3&&4的话则是按逻辑运算,3,4都不为0所以结果为真,即为1.

3、break、continue、他们的作用分别是什么?

break是跳出的意思,应用于多重循环中跳出当前循环。
continue是继续的意思,应用于逻辑结构中继续。

4、什么是强制类型转换?int i=0;double s=1;int res = i+s;有没有错?

从高精度数据类型转成低精度数据类型的形式叫强制类型转换。
有错,s是double类型,而i是int类型,res也是int类型,所以需要强制转换。

5、final、finally、finalize的区别是什么?

final是修饰符,用于修饰变量,方法,被他修饰的变量不可以改变值,被他修饰的方法不能被继承
finlly是捕捉异常语句的一部分,代表无论会不会报异常,都会执行finally语句块里面的代码。
finalize是java中的序列化关键字。

6、使用final关键字修饰的变量是引用不能变还是引用的对象不能变?如何 改变final修饰的变量的值?

引用不能变,引用对象的内容可以变。
① 当final修饰的成员变量在定义的时候就初始化了值,那么java反射机制

就已经不能动态修改它的值了。
② 当final修饰的成员变量在定义的时候并没有初始化值的话,那么就还能

通过java反射机制来动态修改它的值

7、==和equals方法的区别

操作符专门用来比较两个变量的值是否相等,也就是比较变量所对应的内

存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是

否相等,只能用==操作符。
equals 方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人

的长相是否相同,它比较的两个对象是独立的。

8、静态变量和实例变量的区别

在语法上的区别:
静态变量就是在前面加static的关键字,而实例变量则不加。
在程序运行时的区别:
实例变量属于某个对象的属性,必须创建实例对象,其中的实例变

量才会被分配空间,才能使用这个实例变量。
静态变量不属于某个实例对象,而是属于类,所以也称为类变量,

只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配

空间,静态变量就可以被使用了。
总之,实例变量必须创建对象后才可以通过这个对象来使用,静态

变量则可以直接使用类名来引用。

9、为什么不可以从static方法内部发出对非static方法的调用?

因为非static方法要与对象关连在一起,必须创建一个对象后,才可以在该

对象上进行方法调用,而static方法不需要创建对象,可以直接调用。

10、基本数据类型以及他们的封装类有哪些区别,为什么有了基本数据类型还 要有对应的封装类?

基本类型与封装类的最大区别是,封装类是引用类型,就是基本类型和引用

类型的区别。
基本类型在内存中是存储在栈中,引用类型的引用存储在栈中,而值是存储

在堆中。

因为封装的数据类型就是一个对象,可以拥有属性和方法,有了这些属性和

方法我们就可以用它们来处理数据

11、请谈谈你对override和Overload的理解

Overload是重载的意思,Override是覆盖的意思,也就是重写。

重载的特性,方法名相同,传入方法的参数列表不同(包括个数和类型).
重写的特性,方法名相同,参数均相同,必须发生在子类.

重载Overload表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同)。

重写Override表示子类中的方法可以与父类中的某个方法的名称和参数完全相同,通过子类创建的实例对象调用这个方法时,将调用子类中的定义方法,这相当于把父类中定义的那个完全相同的方法给覆盖了,这也是面向对象编程的多态性的一种表现。子类覆盖父类的方法时,只能比父类抛出更少的异常,或者是抛出父类抛出的异常的子异常,因为子类可以解决父类的一些问题,不能比父类有更多的问题。子类方法的访问权限只能比父类的更大,不能更小。如果父类的方法是private类型,那么,子类则不存在覆盖的限制,相当于子类中增加了一个全新的方法。

12、如何实现多态?

重载和重写
再说说重载和重写(我在上面的题目里已经说过了)

13、请谈谈接口(interface)和抽象类(abstract)的区别

下面比较一下两者的语法区别:

  1. .抽象类可以有构造方法,接口中不能有构造方法。
  2. 抽象类中可以有普通成员变量,接口中没有普通成员变量
  3. 抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
  4. 抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然
    eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。
  5. 抽象类中可以包含静态方法,接口中不能包含静态方法
  6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。
  7. 一个类可以实现多个接口,但只能继承一个抽象类。

14、请描述克隆方法的特点

clone 有缺省行为,super.clone();因为首先要把父类中的成员复制到位,然后才是复制自己的成员。

15、请谈谈对面向对象的特征的理解

答案的段落分明,层次分明,条理清楚都非常重要,从这些表面的东西也可以看出一个人的习惯、办事风格、条理

16、StringBuffer和StringBuilder的区别?

答:StringBuffer是线程安全的(synchronized),而 StringBuilder不是,所以StringBuilder效率更高,锁的获取和释放会带来开销

17、length和length()的区别?

答:length是属性,一般集合类对象拥有的属性,取得集合的大小,数组长度。
length()是方法,一般字符串类对象有该方法,也是取得字符串长度。

java中的length属性是针对数组说的,比如说你声明了一个数组,想知道这个数组的长度则用到了length这个属性。
java中的length()方法是针对字符串String说的,如果想看这个字符串的长度则用到length()这个方法。

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

code会被执行。

在return的中间,为什么呢?主函数调用子函数并得到结果的过程,好比主函数准备一个空罐子,当子函数要返回结果时,先把结果放在罐子里,然后再将程序逻辑返回到主函数。所谓返回,就是子函数说,我不运行了,你主函数继续运行吧,这没什么结果可言,结果是在说这话之前放进罐子里的。

19、Java中的异常处理机制的原理和应用

答:当JAVA程序违反了JAVA的语义规则时,JAVA虚拟机就会将发生的错误表示为一个异常。违反语义规则包括2种情况。一种是

JAVA类库内置的语义检查。例如数组下标越界,会引发IndexOutOfBoundsException;访问null的对象时会引发NullPointerException。

另一种情况就是JAVA允许程序员扩展这种语义检查,程序员可以创建自己的异常,并自由选择在何时用throw关键字引发异常。所有的异常都是java.lang.Thowable的子类。

20、throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?

一般情况下是用try来执行一段程序,如果出现异常,系统会抛出(throws)一个异常,这时候你可以通过它的类型来捕捉(catch)它,或最后(finally)由缺省处理器来处理。

try:指定一块预防所有“异常”的程序。

catch:紧跟在try程序后面,应包含一个catch子句来指定你想要捕捉的“异常”的类型。

throw:用来明确地抛出一个“异常”。

throws:标明一个成员函数可能抛出的各种“异常”。

Finally:不管发生什么“异常”都被执行一段代码。

可以
throw和throws都是抛出异常的

版权声明
本文仅代表作者观点。
本文系作者授权发表,未经许可,不得转载。

点赞

发表评论