最常考的Java后台面试题(一)Java基础

总览

参考内容:Java面试小抄

什么是面向对象?

面向对象是和面向过程相对的。为了说明这俩的不同,我们举一个例子“如何在学校里找对象?

  • 面向过程:与目标相遇 --> 判断是否符合标准 --> 符合就加微信,不符合回到第一步 --> ……
  • 面向对象:寻找系统、打分系统、约会系统、表白系统……

从这个例子中可以大概知道二者的区别:面向过程的重点是把步骤一步一步组成逻辑,而面向对象则是将整个过程通用的部分提取出来并模块化。
因此,面向过程一个事一个做法,好处是消耗低,但难以复用;面向对象是找出通用做法,在提高了消耗的代价下获得了易于复用、维护和扩展的特性。

面向对象的封装、继承、多态指的是什么?

这三个的意思都是直白的。
首先,封装就是将类中的细节给包装起来,只留下接口以供使用。举例来说,用遥控器打开空调,室内变冷了,但是我们不需要知道是怎么变冷的。具体来说,类中由private修饰的就是需要隐藏起来的细节,而类中public的方法就是这个类的接口。在之后使用这个类的时候就可以通过public方法进行输入和输出。
继承就是字面意思,子类在父类的基础上构建,也就是说子类继承了父类。比如说,🐱是动物的继承,女朋友是人类的继承。Java中的继承方式为extends。

public class A {   
	xxx;
} 
public class B extends A{
	xxx;
}

需要注意的是,子类拥有父类非private的属性和方法,可以增加特有的方法,也可以重写父类的方法。
继承部分还需要说三个关键词:构造器、protected、向上转型。
构造器其实就是类的初始化部分。构造器名同类名一致。在Java程序中,new后面的那个部分就是构造器。比如

  • List<Integer> list = new ArrayList<>();

里面的ArrayList<>()就是构造器,完成了初始化操作。
但在继承部分单独提构造器的原因是,子类不能继承父类的构造器,只能通过super()方法去调用。如果没写super语句,编译的时候默认加上。
继承虽然使得复用变得简单,但是继承自父类的子类与父类是强耦合关系,父类变了子类也会变。所以要谨慎使用继承。
protected是private和public中间的限制,public是都可以访问,private是类内才可以访问,而protected指使用该类的对象依旧不可以访问,但是继承这个类的子类可以访问。
向上转型,是子类继承父类,并创建对象的过程。 语法为“父类 对象名 = new 子类构造器”。比如说“动物 a = new 猫”,这种情况下a虽然是动物,但a如果调用动物中的叫,调用的就是猫叫。即,A的对象可访问B从A中继承来的和B“重写”A的方法。
最后到多态。多态就是多种状态了,具体指的是同一行为(方法)的不同状态。举例来说就是,黑白打印机和彩色打印机都调用打印方法都打印“hello”,但是“hello”分别是黑白的和彩色的两种状态。

  • 继承 + 重写 + 向上转型 —> 多态

多态是结果。继承是多态的其中一种原因。加上重写和向上转型的设定,使得存在多态的现象。用刚刚打印机的例子继续说明,彩色打印机继承自黑白打印机,并重写了打印出来的字的颜色,而用打印机 a = new 彩色打印机构造出来的a可以使用打印机的打印功能,但是字的颜色变成了彩色,也就导致了多态的产生。

Java为什么可以“Write Once, Run any Where”?

C或C++等,在程序编写之后,需要编译成二进制码才可以在平台上运行。但是不同平台上的对二进制码的识别不同,所以这些程序在一个平台编译之后不可以在另一个平台上运行。
但是Java将编写的程序编程成为字节码。Java的源程序的后缀是.java,然后编译程序将程序编译为.class的字节码文件。如果平台想运行.class,必须使用JVM(Java虚拟机),而JVM再将字节码转换为二进制从而运行程序。不同平台上的JVM是不同的。
之所以叫做字节码,是因为初步编译的程序是十六进制,而JVM一次读取两个十六进制,也就是以字节为单位读取。一个字节指的是8位的二进制,那么2的8次方有256;对于十六进制来说,两位的十六进制,即16的平方是256。
举例来说,我写了一份中文的文件,C++就是,我如果想发给俄罗斯和夏威夷,我就要把这个文件翻译成两国对应的语言,但显然翻译之后的俄罗斯文件给夏威夷的话他们是看不懂的;而Java的情况是,我写了一份的中文的文件,然后自己把它翻译成英文,然后派懂英文的当地翻译生活在当地,这样当地翻译就会把英文文件翻译成对应国家的语言。也就是所谓的“一次编写,处处运行”。这里的处处运行指的是.class文件可以处处运行,处处的前提是这个地方已经装了JVM。
编译指的是文件通过编译器一次成为平台可以理解的机器码,是静态的、效率高的、可移植性差的;解释指的是文件需要解释器一行一行的转换成机器码再运行,是动态的、效率低的、可移植性好的。因为.java需要先编译成为.class,所以有编译;又因为.class需要JVM解释成机器码再运行,所以有解释。这也是为什么说Java“编译与解释并存”。

JVM、JRE和JDK的关系是什么?

JVM、JRE和JDK的关系

引用数据类型和基本数据类型的关系?

Java中只有两种数据类型,基本数据类型和引用数据类型
JAVA数据类型
上图中基本数据类型后面的括号内容表示该类型占用的内存大小,单位是字节(byte)。
相同点。两种数据类型都是为了创建变量,都可以在创建变量后赋值;同时,两种数据类型本身都是一个地址。
不同点。数据在堆中开辟并保存后,基本数据类型直接指向该数据,地址所在处保存了数据;引用数据类型再次指向地址,地址所在处是一系列基本数据类型的地址,存在“二级跳”。

四个访问修饰符的区别?

  • public: 最大,都可见;
  • protected: 其他包内不可见,其他包内的子孙类需要说明才知道可不可见;
  • default (即什么也不写,有时也叫做friendly): 其他包内不可见;
  • private: 最小,只有当前类中可见。

final、finally、finalize的区别?

从英语语法上,三者分别是形容词、副词和动词,也就是说翻译过来可以称作最后的、最终和最后定下来。

  • final:关键字,修饰变量、方法、类。修饰完就不可以改了。
  • finally:作为异常处理的一部分,只能出现在try/catch语句中,表示这段语句最终一定要被执行。
  • finalize:方法,属于Object类,该方法使得垃圾收集器将对象清除之前做必要的清理工作。

this关键字?

总的来说,this关键字是为了在构造函数中避免混淆提升效率的一个关键字,主要作用是给出指向,不能使用在普通方法中。

  • this.属性名
class Student {
   
    int rollno;
    String name;
    float fee;

    Student(int rollno, String name, float fee) {
   
        this.rollno = rollno;
        this.name = name;
        this.fee = fee;
    }
}

在上面的程序中,this.后面的是类中定义的属性rollno、name、

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值