Java面试基础题(一)

2020-05-02  本文已影响0人  在error边缘疯狂试探

什么是跨平台性?原理是什么?

程序的运行过程?

switch 是否能作用在 byte 上,是否能作用在 long 上,是否能作用在 String 上

用最有效率的方法计算 2 乘以 8

Math.round(11.5) 等于多少?Math.round(-11.5)等于多少?

float f=3.4;是否正确?

short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1;有错吗?

访问修饰符 public,private,protected,以及不写(默认)时的区别

final 有什么用?

super关键字的用法

this与super的区别

static的独特之处

static应用场景

面向对象和面向过程的区别

面向对象的特征有哪些方面

面向对象五大基本原则是什么

抽象类和接口的对比

Tips:Java8中接口中引入默认方法和静态方法,以此来减少抽象类和接口之间的差异。现在,我们可以为接口提供默认实现的方法了,并且不用强制子类来实现它。接口和抽象类各有优缺点,在接口和抽象类的选择上,必须遵守这样一个原则:行为模型应该总是通过接口而不是抽象类定义,所以通常是优先选用接口,尽量少用抽象类。选择抽象类的时候通常是如下情况:需要定义子类的行为,又要为子类提供通用的功能。

普通类和抽象类有哪些区别?

Tips:若抽象类中没有抽象方法,则这个抽象类不能实例化!

抽象类能使用 final 修饰吗?

创建一个对象用什么关键字?对象实例与对象引用有何不同?

在一个静态方法内调用一个非静态成员为什么是非法的?

内部类的分类有哪些?

我们为什么要使用内部类呢?

局部内部类和匿名内部类访问局部变量的时候,为什么变量必须要加上final呢?它内部原理是什么呢?
先看这段代码:public class Outer { void outMethod(){ final int a =10; class Inner { void innerMethod(){ System.out.println(a); } } } }
以上例子,为什么要加final呢?是因为生命周期不一致, 局部变量直接存储在栈中,当方法执行结束后,非final的局部变量就被销毁。而局部内部类对局部变量的引用依然存在,如果局部内部类要调用局部变量时,就会出错。

构造器(constructor)是否可被重写(override)

重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分?

== 和 equals 的区别是什么

Tips:String中的equals方法是被重写过的,因为object的equals方法是比较的对象的内存地址,而String的equals方法比较的是对象的值。当创建String类型的对象时,虚拟机会在常量池中查找有没有已经存在的值和要创建的值相同的对象,如果有就把它赋给当前引用。如果没有就在常量池中重新创建一个String对象。

Java对象的创建方式有哪些?

什么是Java序列化,如何实现java序列化?

【详细解释:】

概念

序列化:把Java对象转换为字节序列的过程。
  反序列化:把字节序列恢复为Java对象的过程。

用途

对象的序列化主要有两种用途:
  1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;
  2) 在网络上传送对象的字节序列。

对象序列化

序列化API

java.io.ObjectOutputStream代表对象输出流,它的writeObject(Object obj)方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。只有实现了Serializable和Externalizable接口的类的对象才能被序列化。

java.io.ObjectInputStream代表对象输入流,它的readObject()方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。

代码示例:

 import java.io.*;
 import java.util.Date; 
 public class ObjectSaver { 
    public static void main(String[] args) throws Exception { 
       /*其中的  D:\\objectFile.obj 表示存放序列化对象的文件*/
     //序列化对象
      ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("D:\\objectFile.obj")); 
        Customer customer = new Customer("王麻子", 24); 
         out.writeObject("你好!");    //写入字面值常量
         out.writeObject(new Date());    //写入匿名Date对象
         out.writeObject(customer);    //写入customer对象
         out.close(); 
     //反序列化对象
     ObjectInputStream in = new ObjectInputStream(new FileInputStream("D:\\objectFile.obj")); 
     System.out.println("obj1 " + (String) in.readObject());    //读取字面值常量        System.out.println("obj2 " + (Date) in.readObject());    //读取匿名Date对象
       Customer obj3 = (Customer) in.readObject();    //读取customer对象
      System.out.println("obj3 " + obj3); 
       in.close();
   } 
}
 class Customer implements Serializable { 
     private String name; 
     private int age; 
     public Customer(String name, int age) { 
       this.name = name; 
       this.age = age; 
 } 
    public String toString() { 
         return "name=" + name + ", age=" + age;
  } 
 }

执行结果:

obj1 你好!
obj2 Sum May 20 19:12:03 CST 2020
obj3 name=王麻子,age=14

Tips:读取对象的顺序与写入时的顺序要一致,对象的默认序列化机制写入的内容是:对象的类,类签名,以及非瞬态和非静态字段的值。

上一篇下一篇

猜你喜欢

热点阅读