牛客笔试题整理(1)

1.final、finally和finalize的区别

  • final用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
  • finally是异常处理语句结构的一部分,表示总是执行。
  • finalize()是Object中的方法,当垃圾回收器将要回收对象所占内存之前被调用,即当一个对象被虚拟机宣告死亡时会先调用它finalize()方法,让此对象处理它生前的最后事情。不过,finalize()只会在对象内存回收前被调用一次,而且必须要重写,并且不保证能执行完。

2.Java和C++的区别

  • Java是解释型语言,所谓的解释型语言,就是源码会先经过一次编译,成为中间码,中间码再被解释器解释成机器码。对于Java而言,中间码就是字节码(.class),而解释器在JVM中内置了。
  • C++是编译型语言,所谓编译型语言,就是源码一次编译,直接在编译的过程中链接了,形成了机器码。
  • C++比Java执行速度快,但是Java可以利用JVM跨平台
  • Java是纯面向对象的语言,所有代码(包括函数、变量)都必须在类中定义。而C++中还有面向过程的东西,比如是全局变量和全局函数。
  • C++中有指针,Java中没有,但是有引用。
  • C++支持多继承,Java中类都是单继承的。但是继承都有传递性,同时Java中的接口是多继承,类对接口的实现也是多实现。
  • C++中,开发需要自己去管理内存,但是Java中JVM有自己的GC机制,虽然有自己的GC机制,但是也会出现OOM和内存泄漏的问题。C++中有析构函数,Java中Object的finalize方法
  • C++运算符可以重载,但是Java中不可以。同时C++中支持强制自动转型,Java中不行,会出现ClassCastException(类型不匹配)。

3.(错)子类可以继承父类的构造方法

在java中,子类构造器会默认调用super()(无论构造器中是否写有super()),用于初始化父类成员,同时当父类中存在有参构造器时,必须提供无参构造器子类构造器中并不会自动继承有参构造器,仍然默认调用super(),使用无参构造器。因此,一个类想要被继承必须提供无参构造器。

4.面向对象的基本原则

  • s( Single-Resposibility Principle ): 单一职责原则
  • o( Open-Closed principle ): 开放封闭原则
  • l( Liskov-Substituion Principle ): Liskov置换原则
  • i( Interface-Segregation Principle ): 接口隔离原则
  • d( Dependecy-Inversion Principle ): 依赖倒置原则

一个单词:立方体(solid),很好记!!!

5.(错)在java的多态调用中,new的是哪一个类就是调用的哪个类的方法。

public class Father {
    public void say(){
        System.out.println("father");
    }
    public static void action(){
        System.out.println("爸爸打儿子!");
    }
}

public class Son extends Father{
    public void say() {
        System.out.println("son");
    }
  	public static void action(){
        System.out.println("打打!");
    }
   
  	public static void main(String[] args) {
        Father f=new Son();
        f.say();
        f.action();
    }
}

以上代码的执行结果为:

son
爸爸打儿子!

可以看到:
普通方法,运用的是动态单分配,是根据new的类型确定对象,从而确定调用的方法
静态方法,运用的是静态多分派,即根据静态类型确定对象,因此不是根据new的类型确定调用的方法

6.(错)try块后必须有catch块

try的形式有三种:
try-catch
try-finally
try-catch-finally
但catch和finally语句不能同时省略!

7.接口与抽象类的区别

抽象类

  1. 抽象类中可以有构造方法
  2. 抽象类中可以存在普通属性,方法,静态属性和方法
  3. 抽象类中可以存在抽象方法
  4. 如果一个类中有一个抽象方法,那么当前类一定是抽象类;抽象类中不一定有抽象方法
  5. 抽象类中的抽象方法,需要有子类实现,如果子类不实现,则子类也需要定义为抽象的

接口

  1. 接口中只有方法的声明,没有方法体。
  2. 在接口中只有常量,因为定义的变量,在编译的时候都会默认加上public static final
  3. 在接口中的方法,永远都被public来修饰
  4. 接口中没有构造方法,也不能实例化接口的对象。
  5. 接口可以实现多继承
  6. 接口中定义的方法都需要有实现类来实现,如果实现类不能实现接口中的所有方法则实现类定义为抽象类

8.(错)Java程序中的类名称必须与存放该类的文件名相同

只有声明为public才要与类名相同 ,默认权限则可以不同。

9.String对象的两种创建方式

  1. String str1 = “aaa”; 是在常量池中获取对象(“aaa” 属于字符串字面量,因此编译时期会在常量池中创建一个字符串对象),
  2. String str2 = new String(“aaa”) ; 一共会创建两个字符串对象一个在堆中,一个在常量池中(前提是常量池中还没有 “aaa” 字符串对象)

10.什么是序列化

序列化:将 Java 对象转换成字节流的过程。
反序列化:将字节流转换成 Java 对象的过程。

当 Java 对象需要在网络上传输 或者 持久化存储到文件中时,就需要对 Java 对象进行序列化处理。

序列化的实现:类实现 Serializable 接口,这个接口没有需要实现的方法。实现 Serializable 接口是为了告诉 jvm 这个类的对象可以被序列化。

注意事项:

  • 某个类可以被序列化,则其子类也可以被序列化
  • 声明为 static 和 transient 的成员变量,不能被序列化。static 成员变量是描述类级别的属性,transient 表示临时数据
  • 反序列化读取序列化对象的顺序要保持一致
发布了60 篇原创文章 · 获赞 6 · 访问量 1222

猜你喜欢

转载自blog.csdn.net/DLC990319/article/details/104926734