java面试题以及知识点小结

来源:互联网 发布:linux pl文件 编辑:程序博客网 时间:2024/06/04 01:14

这是我在网上看到的面试题,结合自己的情况归纳一下吧.不定期更新,太太简单的几乎就不会写在上面了


  1. 在Java中创建对象的不同方法有哪些?
    • 通过new关键字
    • 通过newInstance()方法
    • 通过clone()方法
    • 通过反序列化
    • 通过工厂方法等
  2. 构造函数有返回值?
    • 是的,构造函 数返回当前类的实例(不能指定返回值类型,但它会返回一个值)。
  3. 可以覆盖静态方法吗?
    • 这是不可以的,静态方法不能被覆盖。可以通过运行时多态来证明不能覆盖
  4. 为什么不能覆盖静态方法?
    • 因为静态方法是绑定类,而实例方法绑定对,静态属于类区域,实例属于堆区域。
  5. 可以重写java main方法吗?
    • 这是不可以的,因为main是一个静态方法。
      java方法重载和方法重写之间的区别:
  6. super关键字的用法如下:
    • super可以用来引用直接父类的实例变量。
    • super可以用来调用直接父类方法。
    • super()可以用于调用直接父类构造函数。
  7. 是否可继承final方法?
    • 是的,final方法是继承的,但是不能覆盖它。
  8. 初始化顺序:
    1.先父类,后子类
    2.先属性,后构造函数
    3.先静态,后非静态
    4.先静态属性,后静态代码块
    5.同一类型(非数据类型,指以上),按代码先后顺序
  9. 若调用start,则先执行主线程的,后执行子线程的
    若调用run,相当于函数调用,顺序执行
  10. 什么是java序列化,如何实现java序列化?
    • Java对象的序列化指将一个java对象写入OI流中,与此对应的是,对象的反序列化则从IO流中恢复该java对象。
    • 如果要让某个对象支持序列化机制,则必须让它的类是可序列化的,为了让某个类是可序列化的,该类必须实现Serializable接口或Externalizable接口
  11. 创建线程的方法哪种更好?
    1. 创建一个类继承Thread类,继承run方法,再调用start方法
    2. 创建一个类实现runable接口,实现run方法,在继承Thread调用start开启线程
      • 方试二更好,有接口,可以多实现,约束
  12. String 是最基本的数据类型吗?
    • 答:不是。Java中的基本数据类型只有8个:byte、short、int、long、float、double、char、boolean;除了基本类型(primitive type),剩下的都是引用类型(reference type),Java 5以后引入的枚举类型也算是一种比较特殊的引用类型。
  13. short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1;有错吗?
    • 答:对于short s1 = 1; s1 = s1 + 1;由于1是int类型,因此s1+1运算结果也是int 型,需要强制转换类型才能赋值给short型。而short s1 = 1; s1 += 1;可以正确编译,因为s1+= 1;相当于s1 = (short)(s1 + 1);其中有隐含的强制类型转换。
  14. &和&&的区别?
    • 答:&运算符有两种用法:(1)按位与;(2)逻辑与。&&运算符是短路与运算。逻辑与跟短路与的差别是非常巨大的,虽然二者都要求运算符左右两端的布尔值都是true整个表达式的值才是true。&&之所以称为短路运算是因为,如果&&左边的表达式的值是false,右边的表达式会被直接短路掉,不会进行运算。很多时候我们可能都需要用&&而不是&,例如在验证用户登录时判定用户名不是null而且不是空字符串,应当写为:username != null &&!username.equals(“”),二者的顺序不能交换,更不能用&运算符,因为第一个条件如果不成立,根本不能进行字符串的equals比较,否则会产生NullPointerException异常。注意:逻辑或运算符(|)和短路或运算符(||)的差别也是如此。
  15. Math.round(11.5) 等于多少?Math.round(-11.5)等于多少?
    • 答:Math.round(11.5)的返回值是12,Math.round(-11.5)的返回值是-11。四舍五入的原理是在参数上加0.5然后进行下取整。
  16. String和StringBuilder、StringBuffer的区别?

    • 答:Java平台提供了两种类型的字符串:String和StringBuffer/StringBuilder,它们可以储存和操作字符串。其中String是只读字符串,也就意味着String引用的字符串内容是不能被改变的。而StringBuffer/StringBuilder类表示的字符串对象可以直接进行修改。StringBuilder是Java 5中引入的,它和StringBuffer的方法完全相同,区别在于它是在单线程环境下使用的,因为它的所有方面都没有被synchronized修饰,因此它的效率也比StringBuffer要高。
    class StringEqualTest {    public static void main(String[] args) {        String s1 = "Programming";        String s2 = new String("Programming");        String s3 = "Program";        String s4 = "ming";        String s5 = "Program" + "ming";        String s6 = s3 + s4;        System.out.println(s1 == s2);        //false        System.out.println(s1 == s5);       //true        System.out.println(s1 == s6);       //false        System.out.println(s1 == s6.intern());       //true        System.out.println(s2 == s2.intern());   //false        }    }
18.  抽象类(abstract class)和接口(interface)有什么异同? * 答:抽象类和接口都不能够实例化,但可以定义抽象类和接口类型的引用。一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法全部进行实现,否则该类仍然需要被声明为抽象类。接口比抽象类更加抽象,因为抽象类中可以定义构造器,可以有抽象方法和具体方法,而接口中不能定义构造器而且其中的方法全部都是抽象方法。抽象类中的成员可以是private、默认、protected、public的,而接口中的成员全都是public的。抽象类中可以定义成员变量,而接口中定义的成员变量实际上都是常量。有抽象方法的类必须被声明为抽象类,而抽象类未必要有抽象方法。

19. 接口是否可继承(extends)接口?抽象类是否可实现(implements)接口?抽象类是否可继承具体类(concrete class)?
* 答:接口可以继承接口,而且支持多重继承。抽象类可以实现(implements)接口,抽象类可继承具体类也可以继承抽象类。
20. Java 中的final关键字有哪些用法?
* 答:(1)修饰类:表示该类不能被继承;(2)修饰方法:表示方法不能被重写;(3)修饰变量:表示变量只能一次赋值以后值不能被修改(常量)。
21.

class A {      static {        System.out.print("1");    }    public A() {        System.out.print("2");        }    }    class B extends A{    static {        System.out.print("a");    }    public B() {        System.out.print("b");        }    }    public class Hello {    public static void main(String[] args) {        A ab = new B();        ab = new B();        }    }

答:执行结果:1a2b2b。创建对象时构造器的调用顺序是:先初始化静态成员,然后调用父类构造器,再初始化非静态成员,最后调用自身构造器。

22.  forward和redirect的区别* forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。

redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以session,request参数都可以获取。
23. 什么是线程?
* 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速。比如,如果一个线程完成一个任务要100毫秒,那么用十个线程完成改任务只需10毫秒。Java在语言层面对多线程提供了卓越的支持,它也是一个很好的卖点。
24. 线程和进程有什么区别?
* 线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任务。不同的进程使用不同的内存空间,而所有的线程共享一片相同的内存空间。别把它和栈内存搞混,每个线程都拥有单独的栈内存用来存储本地数据。
25. 用Runnable还是Thread?
* 这个问题是上题的后续,大家都知道我们可以通过继承Thread类或者调用Runnable接口来实现线程,问题是,那个方法更好呢?什么情况下使用它?这个问题很容易回答,如果你知道Java不支持类的多重继承,但允许你调用多个接口。所以如果你要继承其他类,当然是调用Runnable接口好了。
26. Thread 类中的start() 和 run() 方法有什么区别?
* 这个问题经常被问到,但还是能从此区分出面试者对Java线程模型的理解程度。start()方法被用来启动新创建的线程,而且start()内部调用了run()方法,这和直接调用run()方法的效果不一样。当你调用run()方法的时候,只会是在原来的线程中调用,没有新的线程启动,start()方法才会启动新线程。
27. java类之间的四种关系(这还是面试阿里的面试题)
* 依赖<关联<聚合<组合
28.

原创粉丝点击