一、基础部分:
(1)、java基础:
JVM能有几个实例?
每个java程序对应一个JVM实例,当一个java程序运行时就创建一个JVM实例,因此JVM实例的个数取决于同时执行的程序个数;
Java跨平台是如何实现的?
Java是利用JVM(Java虚拟机)实现跨平台的;
Java源码(*.java)经过java编译器编译成java字节码(*.class),java字节码经过JVM解释为具体平台的具体指令,并执行;不同平台有不同的JVM,主流平台都提供了JVM,
所以Java字节码可以在主流平台上解释执行;在这个意义上java是跨平台的,也就是说:java的字节码是跨平台的;
void和null有何区别?
在java中,void用于无返回值的方法上,如果该方法不需要返回数据,故返回值类型设置为void;
null则代表对i象/变量的值,表示变量没有被实例化,没有指向具体的内存地址;
请描述一下JVM加载class文件的原理机制
JVM中类的装载是由ClassLoader和它的子类来实现的;Java ClassLoader是一个重要的Java运行时系统组件,它负责在运行时查找和装入类文件中的类;
什么是垃圾回收?
垃圾回收(GC)是java语言的一个重要特性,作用收拾释放不再被使用的内存;
什么时候触发垃圾回收?
垃圾回收由系统进行管理,在系统认为需要的时候自动启动一个线程进行处理;
如何降低垃圾回收的触发频率?
尽量减少垃圾内存,也就是新建对象的数量,可以降低垃圾回收的频率;
它能保证程序有足够的可用内存吗?
垃圾回收机制无法保证有足够的内存;
Java中会存在内存泄漏吗?
会出现内存泄漏;
一般来说内存泄漏有两种情况;一是在堆中分配的内存,在没有将其释放掉的时候,就将所有能访问该内存的方式都删除掉;另一种情况则是在内存对象已经不需要的时候,还仍然保留则这块内存和它的访问方式(引用);第一种情况,在java中已经由于垃圾回收机制的引入,得到了很好的解决;所以,java中的内存泄漏,主要指的是第二种情况;
常用的JDK包如下:
-java.lang包:包含了JDK提供的基础类,比如String等,这个包是唯一一个不用导入就可以使用的包;
-java.io包:包含了与输入输出相关的类,比如文件操作等;
-java.net包: 包含了与网络有关的类,比如URL、URLConnection等;
-java.util包:包含系统辅助类,特别是集合类,如Collection、List、Map等;
-java.sql包:包含数据库操作的类,如Connection、Statement、ResultSet等;
(2)、OOP:
在Java中创建对象的不同方法有哪些?
它们分别是:
•通过new关键字
•通过newInstance()方法
•通过clone()方法
•通过反序列化
•通过工厂方法等
抽象类与接口的区别:
抽象类:
- 抽象方法:它只有声明,而没有具体的实现。抽象方法的声明格式为:abstract void fun();
- 如果一个类含有抽象方法,则称这个类为抽象类,抽象类必须在类前用abstract关键字修饰。
- 特点:
- 抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public。
- 抽象类不能用来创建对象
- 如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类
接口:
- 接口中可以含有 变量和方法。但是要注意,接口中的变量会被隐式地指定为public static final变量(并且只能是public static final变量,用private修饰会报编译错误),而方法会被隐式地指定为public abstract方法且只能是public abstract方法(用其他关键字,比如private、protected、static、 final等修饰会报编译错误)
- 接口中所有的方法不能有具体的实现,也就是说,接口中的方法必须都是抽象方法
区别:
- 抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法;
- 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;
- 接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;
- 一个类只能继承一个抽象类,而一个类却可以实现多个接口。
重写与重载的区别?
方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。
1.重写体现在父与子类中,重载是体现在一个类中。
2.重写的方法名,参数数目相同,参数类型兼容,重载的方法名相同,参数列表不同。
3.重写的方法修饰符大于等于父类的方法,重载和修饰符无关。
4.重写不可以抛出父类没有抛出的一般异常,可以抛出运行时异常
.内部类与静态内部类的区别?
静态内部类相对与外部类是独立存在的,在静态内部类中无法直接访问外部类中变量、方法。如果要访问的话,必须要new一个外部类的对象,使用new出来的对象来访问。但是可以直接访问静态的变量、调用静态的方法;
普通内部类作为外部类一个成员而存在,在普通内部类中可以直接访问外部类属性,调用外部类的方法。
如果外部类要访问内部类的属性或者调用内部类的方法,必须要创建一个内部类的对象,使用该对象访问属性或者调用方法。
如果其他的类要访问普通内部类的属性或者调用普通内部类的方法,必须要在外部类中创建一个普通内部类的对象作为一个属性,外同类可以通过该属性调用普通内部类的方法或者访问普通内部类的属性
如果其他的类要访问静态内部类的属性或者调用静态内部类的方法,直接创建一个静态内部类对象即可。
Static关键字有什么作用?
Static可以修饰内部类、方法、变量、代码块
Static修饰的类是静态内部类
Static修饰的方法是静态方法,表示该方法属于当前类的,而不属于某个对象的,静态方法也不能被重写,可以直接使用类名来调用。在static方法中不能使用this或者super关键字。
Static修饰变量是静态变量或者叫类变量,静态变量被所有实例所共享,不会依赖于对象。静态变量在内存中只有一份拷贝,在JVM加载类的时候,只为静态分配一次内存。
Static修饰的代码块叫静态代码块,通常用来做程序优化的。静态代码块中的代码在整个类加载的时候只会执行一次。静态代码块可以有多个,如果有多个,按照先后顺序依次执行。
Final在java中的作用
Final可以修饰类,修饰方法,修饰变量。
修饰的类叫最终类。该类不能被继承。
修饰的方法不能被重写。
修饰的变量叫常