前言:注册了博客之后,感觉自己没有写什么东西,把自己之前复习过的面试题重新写一遍
参考资料::我没有三颗心脏的博客:https://www.jianshu.com/p/883260941da8
JAVA程序员面试宝典
JAVA WEB程序设计
程序员面试宝典
(1)JAVA语言有那些有点,其特点是什么
一.JAVA是面向对象的语言,面向对象的语言就拥有封装,继承,多态的特点
1.封装是指把某些对象的实习对象隐藏起来,通过公共的方法将其暴露出来。
2.继承是指一个类继承了一个类之后,该类(子类)可以使用父类的非private修饰的变量,或者是非final,非private,非static修饰的方法,其父类的公共属性子类可以将其使用。
3.多态是指一个行为具有不同的表现形态和表现形式的能力,多态的实现机制需要继承,重写(覆盖),向上转型,多态又分为编译时多态,又分为运行时多态,编译时多态是通过重载实现,运行时多态是通过重写(覆盖)实现的
二.JAVA是一门平台无关性的语言。注意这里,并不是JVM是平台无关性,而是JAVA语言是平台无关性的。因为JAVA语言被编译之后都被翻译成class文件(即字节码文件),在不同的平台,不同的JVM,如windows的JVM,LINUX的JVM会将这个字节码翻译成机器码,并能在该系统上运行,JAVA程序编译的顺序是:JAVA源程序→JVM→操作系统,→硬件平台
三.JAVA提供了很多内置的类库,提供了对WEB应用开发的支持,具有较好的安全性和健壮性,去除了C++语言中难以理解,容易混淆的特性。
注意:JAVA是由C++语言改进并重新设计而来的。
(2)JAVA与C/C++有什么不同
1.JAVA与C++相比,没有了指针的概念,不使用指针来直接访问内存,程序更加安全。
2.JAVA与C++的继承,C++中支持多继承,而JAVA只支持单继承(接口可以多继承,类是单继承)。
3.JAVA有自动内存管理机制,不需要程序员手动释放无用内存(JVM的GC会帮助程序员自动释放无用内存,system.gc()也不会一定让JVM执行GC,只是程序员告诉JVM要去执行GC,但执行不执行还是得看JVM的决定。)
(3)关于public static void main(String[] args)
1.main是程序的入口方法,是JVM识别的特殊方法名,所以当程序执行时,第一个执行的就是main方法,执行一个类的方法,要实例化这个类,然后通过这个类的对象来调用这个方法,但是main是程序的入口方法,此时还没有实例化对象,因此在编写main()方法时就要求不需要实例化对象就可以调用这个方法,所以main方法要被定义为public static()
2.final,synchronized也可以用来修饰main方法,但是main()方法的返回值必须为void,不能用abstract修饰符修饰,因为abstract修饰的方法为抽象方法,没有方法体。
3.关于main()方法的个数,每个类都可以定义main()方法,但是只有与文件名相同的是用public 修饰的类的main()方法才能作为整个程序的入口方法。
例子:
class T{
public static void main(String[] args){
System.out.println(“T main”)
}
}
public class T{
public static void main(String[] args){
System.out.println(“Test main”)
}
}
输出结果为Test main
(4)JAVA程序初始化的顺序
记住以下的原则:
1.静态变量优先于非静态对象的初始化,静态对象只初始化一次,(这里深入说一些,为什么静态对象优先于实例对象的加载,因为在类的加载过程中,在链接的那一步骤的准备中,已经给静态变量分配内存空间,同时在初始化阶段初始化了静态变量和静态代码块。)
2.父类优先于子类的初始化
3.按照成员变量的定义顺序进行初始化。
总结执行顺序如下:
父类的静态变量,父类的静态代码块,子类静态变量,子类静态代码块,父类非静态变量,父类非静态代码块,父类构造函数,子类非静态变量,子类非静态代码块,子类构造函数。
(5)一个JAVA文件是否可以定义多个类
1.一个java文件中当然可以定义多个类,但是public修饰的类只能有一个,并且该的类名字要和文件名相同,如果这个文件没有public的类,那么文件名随便是一个类的名字即可,javac指令编译这个.java文件时,它会给每一个类生成一个对应的…class文件。
(6)关于JAVA的构造函数
1.构造函数必须与类的名字相同,并且不能有返回值,返回值也不能为void
2.每个类可以有多个构造函数,如果程序员没有声明构造函数,则系统默认生成一个无参的构造函数,该构造函数不会执行任何代码,如果程序员显示的定义了一个构造函数,那么编译器就不会再创建默认的构造函数了。
3.构造函数可以有0,1,或多个参数
4.构造函数不能被继承,因此它不能被重写,但是构造函数可以被重载,即一个类中可以有多个构造函数
5.关于子类和父类,子类可以通过super关键字来显示地调用父类的构造函数,当父类没有提供五参数的构造函数时,子类的构造函数中必须显示地调用父类的构造函数,但是如果父类提供了五参数的构造函数,则子类的构造函数可以不显示地调用父类的构造函数,在这种情况下编译器会默认调用父类提供的五参数的构造函数,当有父类的时候,在实例化对象时会先执行父类的构造函数,然后执行子类的构造函数,当子类和父类都没有定义构造函数的时候,编译器会为父类生成一个默认的五参数的构造函数。
(7)JAVA创建对象有几种方式?
1.通过反射机制来创建对象
2.通过new关键字来创建对象
3.通过clone()方法来创建对象
4.通过反序列化来创建对象(FileOutputStream,ObjectOutputStream)
(8)组合与继承有什么不同
1.组合这个技术运用在类的加载器类中,类加载器的父子类关系是通过组合实现,而不是通过继承实现的。
组合和继承时面向对象中两种代码复用的方式,组合是指在新类里面创建原有类的对象,重复利用已有类的功能。继承时面向对象的主要特性质疑,它允许设计人员根据其他类的实现来定义一个类的实现。
二者有什么区别,举一个例子来解释
例如Car表示汽车,Vehicle表示交通工具对象,Tire表示轮胎,根据我们常识可以知道,汽车拥有交通工具的特征,是继承关系,即is-a关系,而轮胎是汽车的一部分,即时组成汽车的一个组成部分,是组合关系,又被称为has-a关系
继承和组合都可以实现代码的重用,如果能尽量使用组合就尽量不要使用继承
(9)重载和重写有什么不同
1.重载是指方法名相同,但参数的类型,参数的个数,参数的顺序不同,(注意方法的返回类型并不能成为构成重载的条件)
2。重写是指对方法发覆盖,如果要重写一个方法,那么重写的方法要与原方法的返回类型,方法名,参数类型,参数个数,参数顺序都要相同,抛出的异常也要相同,而执行的方法体不同。如果子类要重写父类的方法,其修饰符不能比父类的方法的修饰符高,比如子类要重写父类的protected方法,则子类的方法只能修饰为public和protected,子类不能覆盖父类的private,static方法,同时也要记住,父类的final方法也不能被重写
(10)接口和抽象类有什么区别
1.抽象类指的是被abstract关键字修饰的类,如果一个类有抽象的方法,那么这个类一定是抽象类,抽象类可以包含抽象的方法和不抽象的方法,抽象的方法没有方法实体,即没有{},非抽象的方法有方法实体,抽象类可以定义普通变量。抽象类的方法不能用private,static,synchronized,native等访问修饰符修饰。
2.接口的方法默认是public abstract是公共抽象的方法,不能有方法实体,其功能只能通过类去实现这个接口来实现该方法,而接口中的变量是常量,声明时必须要给其赋值,默认为public static final修饰,可以定义一个接口,定义这个接口的常量来说明状态值。
3.接口和抽象类都不能实例化,