Java面试题1:Java基础篇

  • 1、什么是面向对象?面向对象和面向过程的区别?
  • 答:
    面向对象是一种万物皆对象的编程思想,任何物体都可以归为一类事物,而一个个个体都是一类事物的实例。面向对象的编程是以对象为中心,以消息为驱动的。
    区别:
    ①编程思路不同:面向过程以实现功能的函数开发为主,面向对象是首先抽象出类、属性及其方法,然后通过实例化、执行方法来完成功能。
    ②封装性:都具有封装性,但是面向过程是封装的是功能,而面向对象封装的是数据和功能。
    ③面向对象有继承性和多态性,而面向过程没有。
    —————————————————————————————————
  • 2、面向对象的三大特性?解释?
  • 答:
    ①封装:把数据和操作数据的方法封装起来,对数据的访问和操作只能通过定义好的接口。
    ②继承:从已有类得到继承信息创建新类的过程。提供继承信息的类称为父类、超类、基类等,得到继承信息的类被叫做子类、派生类。
    ③多态:多态分为编译时多态(方法重载)和运行时多态(方法重写)。
    这里需要注意以下几点:
    (1)重写和重载的区别:
    Java面试题1:Java基础篇_第1张图片
    (2)⼦类拥有⽗类对象所有的属性和⽅法(包括私有属性和私有⽅法),但是⽗类中的私有属性和⽅法⼦类是⽆法
    访问,只是拥有。因为在⼀个⼦类被创建的时候,⾸先会在内存中创建⼀个⽗类对象,然后在⽗类对象外部放上⼦
    类独有的属性,两者合起来形成⼀个⼦类的对象; ⼦类可以拥有⾃⼰属性和⽅法; ⼦类可以⽤⾃⼰的
    ⽅式实现⽗类的⽅法。(重写)
    ——————————————————————————————————
  • 3、JDK,JRE,JVM三者之间的关系为:
  • 答:
    JDK(Java Development Kit):是 Java 开发⼯具包,是整个 Java 的核⼼,包括了 Java 运⾏环境 JRE、Java ⼯具
    和 Java 基础类库。
    JRE( Java Runtime Environment):是 Java 的运⾏环境,包含 JVM 标准实现及 Java 核⼼类库。
    JVM(Java Virtual Machine):是 Java 虚拟机,是整个 Java 实现跨平台的最核⼼的部分,能够运⾏以 Java 语⾔写作的软件程序。所有的 Java 程序会⾸先被编译为 .class 的类⽂件,这种类⽂件可以在虚拟机上执⾏
    ——————————————————————————————————
  • 4、Java 中是否可以重写⼀个 private 或者 static ⽅法?
  • 答:
    Java 中 static ⽅法不能被覆盖,因为⽅法覆盖是基于运⾏时动态绑定的,⽽ static ⽅法是编译时静态绑定的。
    static ⽅法跟类的任何实例都不相关,所以概念上不适⽤。
    Java 中也不可以覆盖 private 的⽅法,因为 private 修饰的变量和⽅法只能在当前类中使⽤, 如果是其他的类继承当前类是不能访问到 private 变量或⽅法的,当然也不能覆盖。
    静态⽅法补充:静态的⽅法可以被继承,但是不能重写。如果⽗类和⼦类中存在同样名称和参数的静态⽅
    法,那么该⼦类的⽅法会把原来继承过来的⽗类的⽅法隐藏,⽽不是重写。通俗的讲就是⽗类的⽅法和⼦类的⽅法是两个没有关系的⽅法,具体调⽤哪⼀个⽅法是看是哪个对象的引⽤;这种⽗⼦类⽅法也不在存在多态的性质。
    ————————————————————————————————————
  • 5、构造器是否可以被重写?
  • 答:
    ⽗类的私有属性和构造⽅法并不能被继承,所以 Constructor 也就不能被Override(重写),但是可以 Overload(重载),所以你可以看到⼀个类中有多个构造函数的情况。
    ——————————————————————————————————————
  • 6、构造方法有哪些特性?
  • 答:
    (1)名字与类名相同;
    (2)没有返回值,但不能⽤ void 声明构造函数;
    (3)成类的对象时⾃动执⾏,⽆需调⽤。
    ——————————————————————————————————————
  • 7、在 Java 中定义⼀个不做事且没有参数的构造⽅法有什么作⽤?
  • 答:
    Java 程序在执⾏⼦类的构造⽅法之前,如果没有⽤ super() 来调⽤⽗类特定的构造⽅法,则会调⽤⽗类中“没有参
    数的构造⽅法”。
    因此,如果⽗类中只定义了有参数的构造⽅法,⽽在⼦类的构造⽅法中⼜没有⽤ super() 来调⽤⽗类中特定的构造
    ⽅法,则编译时将发⽣错误,因为 Java 程序在⽗类中找不到没有参数的构造⽅法可供执⾏。解决办法是:在⽗类
    ⾥加上⼀个不做事且没有参数的构造⽅法。
    ———————————————————————————————————————
  • 8、Java中创建对象的几种方式?
  • 答:
    1、使⽤ new 关键字;
    2、使⽤ Class 类的 newInstance ⽅法,该⽅法调⽤⽆参的构造器创建对象(反射):
    Class.forName.newInstance(); 3、使⽤ clone() ⽅法;
    4、反序列化,⽐如调⽤ ObjectInputStream 类的 readObject() ⽅法。
    ————————————————————————————————————————
  • 9、抽象类和接口有什么区别?
  • 答:
    (1)抽象类中可以定义构造函数,接口不能定义构造函数。
    (2)抽象类中可以有抽象方法和具体方法,但是接口中只能有抽象方法。
    (3)抽象类中的成员权限可以是public、默认、protected(注意抽象类中抽象方法就是为了可以重写,所以不能被private修饰),而接口中的成员只可以是public,方法默认:public abstract、成员变量默认为:public static final)
    (4)抽象类中可以包含静态方法,而接口中不可以。
    JDK8中有所改变:
    JDK1.8中,允许在接口中包含带有具体实现的方法,使用default修饰,这类方法就是默认方法。
    抽象类中可以包含静态⽅法,在 JDK1.8 之前接⼝中不能包含静态⽅法,JDK1.8 以后可以包含。之前不能包含
    是因为,接⼝不可以实现⽅法,只可以定义⽅法,所以不能使⽤静态⽅法(因为静态⽅法必须实现)。现在可以包
    含了,只能直接⽤接⼝调⽤静态⽅法。JDK1.8 仍然不可以包含静态代码块。
    ——————————————————————————————————————————
  • 10、静态变量和实例变量的区别?
  • 答:
    静态变量:是被 static 修饰的变量,也称为类变量,它属于类,因此不管创建多少个对象,静态变量在内存中有且
    仅有⼀个拷⻉;静态变量可以实现让多个对象共享内存。
    实例变量:属于某⼀实例,需要先创建对象,然后通过对象才能访问到它
    ——————————————————————————————————————————
  • 11、short s1 = 1;s1 = s1 + 1;有什么错?那么 short s1 = 1; s1 += 1;呢?有没有错误?
  • 答:
    对于 short s1 = 1; s1 = s1 + 1; 来说,在 s1 + 1 运算时会⾃动提升表达式的类型为 int ,那么将 int 型值赋值给
    short 型变量,s1 会出现类型转换错误。
    对于 short s1 = 1; s1 += 1; 来说,+= 是 Java 语⾔规定的运算符,Java 编译器会对它进⾏特殊处理,因此可以正确
    编译。
    ——————————————————————————————————————————
  • 12、Integer和int的区别?

  • (1)int 是 Java 的⼋种基本数据类型之⼀,⽽ Integer 是 Java 为 int 类型提供的封装类;
    (2)int 型变量的默认值是 0,Integer 变量的默认值是 null,这⼀点说明 Integer 可以区分出未赋值和值为 0 的
    区分;
    (3)Integer 变量必须实例化后才可以使⽤,⽽ int 不需要。
    详细说说两者之间的对比:
    Java面试题1:Java基础篇_第2张图片
    —————————————————————————————————————————
  • 13、Object 的常⽤⽅法有哪些?
  • 答:
    Java面试题1:Java基础篇_第3张图片
    ——————————————————————————————————————————
  • 14、final、finally、finalize的区别?
  • 答:
    final:⽤于声明属性、⽅法和类,分别表示属性不可变、⽅法不可覆盖、被其修饰的类不可继承;
    finally:异常处理语句结构的⼀部分,表示总是执⾏;
    finallize:Object类的⼀个⽅法,在垃圾回收时会调⽤被回收对象的finalize。
    ——————————————————————————————————————————
  • 15、==和equals的区别
  • 答:
    https://blog.csdn.net/why_youjjww/article/details/106352996?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163093356916780269844589%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=163093356916780269844589&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_click~default-2-106352996.first_rank_v2_pc_rank_v29&utm_term=%3D%3D%E5%92%8Cequals%E7%9A%84%E5%8C%BA%E5%88%AB&spm=1018.2226.3001.4187
    ——————————————————————————————————————————
  • 16、两个对象的 hashCode() 相同,则 equals() 也⼀定为 true 吗?
  • 答:
    两个对象的 hashCode() 相同,equals() 不⼀定为 true。因为在散列表中,hashCode() 相等即两个键值对的哈希
    值相等,然⽽哈希值相等,并不⼀定能得出键值对相等【散列冲突】。
    ——————————————————————————————————————————
  • 17、为什么重写 equals() 就⼀定要重写 hashCode() ⽅法?
  • 答:
    Java面试题1:Java基础篇_第4张图片
    ——————————————————————————————————————————————
  • 18、&和&&的区别?
  • 答:
    Java 中 && 和 & 都是表示与的逻辑运算符,都表示逻辑运输符 and,当两边的表达式都为 true 的时候,整个运算
    结果才为 true,否则为 false。
    &&:有短路功能,当第⼀个表达式的值为 false 的时候,则不再计算第⼆个表达式;
    &:不管第⼀个表达式结果是否为 true,第⼆个都会执⾏。除此之外,& 还可以⽤作位运算符:当 & 两边的表达式
    不是 Boolean 类型的时候,& 表示按位操作。
    ——————————————————————————————————————————————
  • 19、Java中的参数传递是传值还是传引用。
  • 答:
    Java 的参数是以值传递的形式传⼊⽅法中,⽽不是引⽤传递。
    当传递⽅法参数类型为基本数据类型(数字以及布尔值)时,⼀个⽅法是不可能修改⼀个基本数据类型的参数。
    当传递⽅法参数类型为引⽤数据类型时,⼀个⽅法将修改⼀个引⽤数据类型的参数所指向对象的值。即使 Java 函
    数在传递引⽤数据类型时,也只是拷⻉了引⽤的值罢了,之所以能修改引⽤数据是因为它们同时指向了⼀个对象,
    但这仍然是按值调⽤⽽不是引⽤调⽤。
    ——————————————————————————————————————————————
  • 20、Java中的Math.round(-1.5)等于多少?
  • 答:
    等于 -1,因为在数轴上取值时,中间值(0.5)向右取整,所以正 0.5 是往上取整,负 0.5 是直接舍弃
    ———————————————————————————————————————————————
  • 21、两个⼆进制数的异或结果是什么?
  • 答:
    两个⼆进制数异或结果是这两个⼆进制数差的绝对值。表达式如下:a^b = |a-b|。
    两个⼆进制 a 与 b 异或,即 a 和 b 两个数按位进⾏运算。如果对应的位相同,则为 0(相当于对应的算术相减),
    如果不同即为 1(相当于对应的算术相加)。由于⼆进制每个位只有两种状态,要么是 0,要么是 1,则按位异或
    操作可表达为按位相减取值相对值,再按位累加。
    ————————————————————————————————————————————————
  • 22、深克隆和浅克隆的区别?
  • 答:
    Java面试题1:Java基础篇_第5张图片
    ————————————————————————————————————————————————
  • 23、什么是Java的序列化,如何实序列化。
  • 答:
  • 对象序列化是⼀个⽤于将对象状态转换为字节流的过程,可以将其保存到磁盘⽂件中或通过⽹络发送到任何其他程
    序。从字节流创建对象的相反的过程称为反序列化。⽽创建的字节流是与平台⽆关的,在⼀个平台上序列化的对象
    可以在不同的平台上反序列化。序列化是为了解决在对象流进⾏读写操作时所引发的问题。
    序列化的实现:将需要被序列化的类实现 Serializable 接⼝,该接⼝没有需要实现的⽅法,只是⽤于标注该对象是
    可被序列化的,然后使⽤⼀个输出流(如:FileOutputStream)来构造⼀个 ObjectOutputStream 对象,接着使
    ⽤ ObjectOutputStream 对象的 writeObject(Object obj) ⽅法可以将参数为 obj 的对象写出,要恢复的话则使⽤
    输⼊流。
    什么情况下需要序列化?
    在这里插入图片描述

你可能感兴趣的:(Java,java,面试,c#)