java程序员面试宝典(1)

1.      变量及其作用范围

尽管定义在{}代码块里面的变量是不为外面所见的,但代码块中不可以定义与外部变量名一样的变量,如:

           publicstatic void main(String[] args){

                    intI = 0;

                    {

                             IntI;//会产生编译错误

                    }

           }

Java变量可以分为:静态变量、成员变量和局部变量3种。静态变量指的是在类中用static修饰的变量,它的生存周期是由类来决定的。成员变量则是在类中没有用static修饰的变量,它的生存周期由对象决定。局部变量则是定义在方法里的变量、方法的参数或代码块里定义的变量,它的作用范围用大括号{}来界定。

2.      Java变量分哪两大类数据类型:Java的变量分为基本数据类型和引用数据类型。对象一般是通过new语句创建出来的,保存在堆空间中。

3.      如何理解java中的装箱和拆箱:从java5.0开始,有一种自动装箱和拆箱的功能,就可以不必显示的进行类型转换,系统会自动的按照需要进行数据类型的转换。基本数据类型对应的包装类均在java.lang包中。Java的装箱和拆箱指的是基本数据类型和包装类型的自动相互转换,这个自动转换过程是在编译阶段。

4.      Java引用和C++指针区别:(1)类型:引用,它的值是地址的数据元素,java封装了地址,可以转成字符串查看,长度可以不关心。而c++指针是一个装地址的变量,长度一般是计算机字长。(2)所占内存:引用声明时没有实体,不占空间。C++指针如果声明后会用到才会赋值,如果用不到不会分配内存。(3)类型转换:引用可以类型转换,可能不成功运行抛出异常。C++指针只是个内存地址,指向哪里。(4)初始值:引用初始值为java关键字null。C++指针是int,不初始化它的值就是不固定的,这很危险。(5)计算:引用不可以计算。C++指针是int,可以计算,如++或--,故经常用指针代替数组下标。(6)控制:引用不可以计算,故它只能在自己程序中,可以被控制。C++指针是内存地址,可以被计算,所以它有可能指向一个不属于自己程序使用的内存地址,对自己程序来说不容易控制。(7)内存泄露:引用不会产生内存泄露。C++指针容易产生内存泄露,所以程序员要小心使用及时回收。(8)作为参数:java方法参数只是传值。C++用指针参数相当于地址传递。总的来说,java引用更方便安全一些,但没C++指针那么灵活。

5.      请简述java中的main()方法:main()方法是java程序执行入口,它是一个定义在类中的、公开的、静态的、无返回的、参数作为一个字符串数组的方法,它的参数args与执行参数一一对应。

6.      Java中equal和==的区别是什么:“==”运用在基本数据类型的时候,通过比较它们实际的值来判定是否相同;而用于比较引用类型的时候,则比较两个引用的地址是否相等,也就是是否指向同一个对象。Equal方法是java.lang.Object的方法,也就是所有的java类都会有的方法。它可以被程序员覆盖重写,通过自定义的方式来判定两个对象是否相等(java.lang.String类是一个特殊的类,它不可以被继承,它的equal()方法用来比较字符串的字符序列是否完全相等。)

7.      Java三元运算符:后两个表达式的返回类型要统一。

8.      Java中的注释:有三种,行注释、块注释、文档注释。再算上Annotation就是4种,它与其他注释本质的区别就在于它会进入到编译层,并对程序结果产生影响。(如@Override该注释声明该方法是用于覆盖父类中的方法等。)

9.      类和对象有什么区别:java的类通过class关键字进行定义,它代表了一种抽象的集合,在它的里面可以定义各种属性和方法,它们代表了每个类实例的特定的数据和动作。Java虚拟机对类只加载一次,对它的静态成员也只加载一次。

对象,指的是某一个特定抽象的实例,它属于某一种类型,也就是对象是通过类来创建的。它必须从属于某一个类,通过new关键字进行创建,它代表一个特定类型的实例,对象可以被多次创建。简言之,类是一种抽象,而对象是类的实现。

10.  java中如何使用继承来重用代码:java采用的是单继承制,使用extends关键字。通过继承以后,子类就拥有了父类除去私有成员以外的所有成员,从而达到代码重用。在继承过程中,可以通过方法的覆盖来实现多态,让子类拥有自己独特的方法实现方式。(java程序中所有类都继承自java.lang.Object类,它有9个方法,所以所有java类都包含这9个方法)

11.  java中静态成员的特点:(1)在类加载的时候,就进行创建和初始化或执行代码。(2)对于一个类来说只有一份。(3)类的所有实例都可以访问到它们。

12.  简述java派生类中的构造方法如何为父类传递参数:(注:super()的使用必须放在子类构造方法的第一行。如果调用的是父类的默认的无参数构造方法,则可以不必显示地使用super())。

简述下内部类的实质是什么(java通过内部类加上接口,可以很好的实现多继承的效果。)?定义在类内部的类就叫做内部类。(1)静态内部类:它相当于外部类的静态成员一样,使用static修饰的内部类;在外部类加载的时候,静态内部类也随之加载。静态内部类相对于外部类来说,仅仅是包含关系,缩小了命名空间,完整类名中多了一个外部类名称,本质上是两个独立的类,JVM也不知道他们有两个有包含关系。(2)成员内部类:无static修饰。它相当于外部类普通成员一样,隶属于外部类的具体对象,在定义它的时候,需要先创建外部类对象,再创建它的实例。(3)局部内部类:定义在一个方法体中,它往往仅能作为方法短暂的使用,只能访问方法中final修饰的局部变量任意访问外部类对象的成员变量。(4)匿名内部类:定义在方法体中,工作本质与局部内部类类似。(class文件是按照匿名内部类排列顺序来进行的。)

package com;

public class Test {

       static int a = 0;

       int b = 0;

       static classInner1{

              public static void print(){

                     System.out.println("这是静态内部类");

              }

       }

       class Inner2{

              public voidprint(){

                     System.out.println("这是成员内部类");

              }

       }

       public void adc(){

              int aa = 0;

              final int bb =1;

              class MyLocal{

                     public voidprint(){

                            System.out.println("这是局部内部类"+bb+a+b);

                     }

              }

              new Inner2(){ //注意类名Inner2必须是定义过的。

                     public voidprint(){

                            System.out.println("这是匿名内部类"+bb+a+b);

                     }

              }.print();

              new MyLocal().print();

       }

       public static void main(String[] args) {

              Test test = new Test();

              Test.Inner1.print();

              Test.Inner2 i = test.new Inner2();

              i.print();

              test.adc();

       }

}

注意这边局部与匿名内部类命名

13.  float和double的取值范围各是多少:float型3.4E+10^(-38)~3.4E+10^(38)。Double型1.7E+10^(-308)~1.7E+10^(308)。

14.  实型与整型的相互转换:double d2 =12;d2+123,字面量123在相加之前有一个隐式转换成double型,切记。

15.  Java中使用反斜杠“\”表示转义字符。

16.  Stringa = “a”;String b = “b”;String c = “c”; String d = “d”;String abcd = a+b+c+d;上述代码一共创建了7String对象。Java中如果有大量拼接字符串的需要,应该使用StringBuffer和StringBuilder类,它们可以避免不必要的String对象的产生,提高程序性能StringBuffer线程是安全的。StringBuild性能更好,因为不是线程安全的。

17.  如何输出反转过后的字符串:(1)利用字符串存储字符数据的原理,取出它的char数组,重排。如:s.charAt(i)。(2)生成StringBuffer对象,直接使用StringBuffer的reverse()方法。如:StringBufferbuff = new StringBuffer(字符串);

18.  如何使用指定的字符集创造String对象:如String c = new String(a.getBytes(),”UTF-8”);

19.  Int[]arr = new int[]{1,3,5};定义一个int数组变量。其类名可以如此获取:arr.getClass().getName();

20.  如何拷贝数组数据:深度拷贝:int[] arr = new int[]{1,3,5};int[] arr2 =new int[3];System.arraycopy(arr,0,arr2,0,arr.length);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值