1.面向对向和面向过程的区别?
- 面向过程:
优点:高效,不用实例化对象。适合单片机、linux、嵌入式编程。
缺点:不易于复用、维护、扩展。写一个是一个,不够灵活。 - 面向对象:
优点:易于理解。具有封装、继承、多态的特点。易于复用、维护、扩展。
缺点:因为需要实例化对象,效率较面向过程低一些。
2.Java语言有哪些特点?
- 简单易学
- 面向对象(封装、继承、多态)
- 平台无关性(依靠JVM实现)
- 安全性(自动垃圾回收,不直接操作内存)
- 可靠性
- 支持多线程(并发编程)
- 很好的支持网络编程
- 编译与解释并存。
3.JDK、JRE、JVM的关系?
JVM
jvm是运行java字节码的虚拟机。针对不同的操作系统有不同的实现(windows、linux、macOS),目的是让相同的字节码文件可以在不同的环境上运行,并得到相同的结果。
JDK
jdk是java程序开发的环境,是完成的java SDK。拥有jre所有的功能,并且还包含javac等工具。可以创建和编译程序。
JRE
jre是java程序运行的环境。包含JVM和java类库,可以运行编译好的java程序。但是不能创建新的程序或者编译程序。
4.Oracle JDK和Open JDK的区别?
- OracleJDK三年更新一次版本,OpenJDK三个月发布一次
- OpenJDK是一个完全开源的参考模型,OracleJDK是OpenHDK的一个实现,并不是完全开源。
- OracleJDK比OpenJDK更稳定,修复了一些错误。使用OpenJDK造成的程序崩溃一般更换为OracleJDK后就好了。OracleJDK性能比OpenJDK更高。
- OracleJDK不是免费的,OpenJDK是开源免费的。
5.Java和C++的区别?
- 都是面向对象的语言,都支持封装、继承、多态。
- Java不提供指针来直接操作内存,程序更加安全。
- Java是单继承多实现,C++是多继承。
- Java有自动内存管理机制,不需要程序员手动释放无用内存
6.什么是Java程序的主类?应用程序和小程序的主类有何不同?
7.Java应用程序和小程序有什么区别?
8.字符型常量和字符串常量的区别?
- 形式上字符常量是由单引号包括的一个字符,字符串是由双引号包括的若干(0-n)个字符。
- 含义上:字符常量相当于一个整型值(ASCII值),可以参与表达式运算,字符串常量代表一个地址(该字符在内存中存放的位置)
- 占用内存大小 字符常量仅占用2个字节,字符串常量占用若干个字节**(至少一个字符结束标志?)???**
9.构造器Constructor是否可被override。
不可以被重写但是可以重载。
10.重载和重写的区别?
- 重载是在同一个类中的方面名称相同,参数的顺序、名称、类型不同。返回值的类型和访问修饰符变化不算重载。
- 重写是发生在子类继承父类,方法的名称和参数要完全一致。返回值范围不大于父类方法,访问权限不小于父类方法,抛出异常不大于父类方法抛出异常。父类的private方法不能被子类重写
11.Java面向对象编程的三大特性:封装、继承、多态。
- 封装:将类的属性私有化,在类的外部不支持直接访问。提供公开的访问方法。
- 继承:在已经存在的类定义的基础上创建新类的技术。新类可以继承原有的类的非私有属性和方法,并在此基础上进行扩展添加新的属性和功能。
- 多态:父类的引用指向子类的对象,调用父类的方法。在编译时期不能确定调用的是那个子类的方法,在执行时期才能确定。
12.StringBuffer和Stringbuilder的区别?为什么String是不可变的?
- String 类中使用final修饰的char数组 char[] value[]保存字符串。所以是不可变的。
- StringBuffer和StringBuilder都是继承自AbstractStringBuilder类。AbstractStringBuilder中也是使用char数组 cahr value[]保存字符串,默认大小16。但是没有被final关键字修饰所以是可变的。
- StringBuffer对方法加了synchronized关键字是线程安全的相对效率较低。
- StringBuilder没有对方法加锁,不是线程安全的相对效率高一些。
- 少量操作的数据使用String,单线程操作使用StringBuilder,多线程操作使用StringBuffer。
13.什么是装箱与拆箱?
- 装箱将基本类型用他们对应的包装类型包装起来。
- 拆箱;将包装类型转化为基本类型。
14.在一个静态的方法中为什么不能调用成员变量或方法?
因为静态方法执行时可以没有对象,成员变量或方法的调用需要有对象示例支持。
15.在Java中定义一个不做事的无参构造方法的意义是什么?
Java程序在执行子类的构造方法的之前,如果没有显式的通过super()调用父类的构造方法。会默认调用父类的无参构造方法。如果父类写了有参的构造方法没有重写无参构造方法的时候。会造成子类不能调用父类的无参构造方法,因为没有进而造成子类创建失败。
16.接口和抽象类的区别是什么?
- 接口默认所有的方法都是public的,除了默认方法外其他方法不能有具体的实现即不能有方法体。
- 接口中的属性默认是final类型的,抽象类中的则不一定。
- 一个类可以实现多个接口,只能继承一个抽象类。
- 一个类实现接口的话就要实现接口所有的非默认方法,继承抽象类则没有要求。
- 接口不能直接通过new实例化为对象。
17.成员变量和局部变量的区别是什么?
- 从语法上看成员变量定义在方法的外部,是属于类的可以被访问修饰符修饰。局部变量是定义在方法内是属于方法内部的不能被访问权限修饰符修饰。
- 从变量的存储位置上看:成员变量随着对象的实例化初始化,在堆空间内。局部变量随着方法的执行初始化,在栈空间中。
- 从生命周期看:成员变量随着对象的创建而初始化,随着对象的回收而销毁。局部变量随着方法的执行而初始化,随着方法的执行完毕而销毁。
- 从初始化赋值看:成员变量没有显式赋值的话在初始化的时候会赋予默认值。而局部变量在初始化的时候不会自动赋予默认值。
18.创建一个对象使用哪个关键字?对象实体与对象引用有什么区别?
- 创建对象使用new关键字。
- 对象实例时存储在堆中,对象的引用是指向对象内存地址。
- 一个对象可以被多个引用指向,一个引用仅能指向一个对象。类比于引用是线、对象是气球。
19.构造方法有哪些特征
- 名字与类名相同
- 没有返回值,但是不能声明为void返回。
- 生成类对象时自动执行,无需显式调用。
20.静态方法和实例方法的区别是什么?
- 静态方法可以通过类名直接调用,成员方法必须通过实例对象调用(静态方法也可以通过对象调用)。
- 静态方法在访问静态内容,而实例方法则没有限制。
21.对象的相等和指向他们的引用相等,两者有什么区别?
对象相等是比较的内存中对象的内容是不是一样。引用相等比较的是指向的内存地址是否相同,也就是是否指向同一个对象。
22.在调用子类的构造方法之前为什么要先调用父类的无参构造方法?
帮助子类做初始化工作。
23.==与equals的区别是什么?
- == 使用==对比时基本对象比较的是值是否相等,引用数据类型比较的是内存中的地址是否相同。
- equals:作用也是比较两个对象是否相等。有两种使用情况:
2.1没有覆盖equals方法。此时通过equals比较两个对象时等效于==比较。
2.2 重写了equals方法,则比较的是equals方法的返回值是否相同。 - String中的equals方法重写过了,因为Object中的equals对比的是地址,而String的equals对比的是对象的值。
- 创建String类型的对象时,虚拟机会再常量池中查找有没有已经存在的值和要创建的值相同的对象,如果有就把它赋值给当前引用。如果没有就在常量池中创建一个新的String对象。
24.hashCode与equals
- 如果两个对象相等,则hashcode一定也是相同的。
- 两个对象相等,则两个对象分别调用equals方法都会返回True。
- 两个对象具有相同的hashcode值,他们不一定相等(hash碰撞)。
- 所以equals被覆盖过则必须hashCode方法也必须被覆盖。
- hashCode的默认行为是为堆上的对象产生独特值。如果没有重写则该class的任意两个实例对象都永远不会相等。
25.为什么Java只有值传递?
26.线程、进程、程序之间是什么关系?
- 程序:程序是含有指令和数据的文件,被存储在磁盘或者其他数据存储设备中。也就是静态的代码。
- 进程:进程是程序的一次执行的过程,是系统运行程序的基本单位。因此进程是动态的程序(进行中的程序)。系统运行一个程序即是一个进程创建、运行到消亡的过程。
- 线程:线程是比进程更小的执行单元。一个进程在其执行的过程中可以产生多个线程,与进程不同的是多个线程共享同一块内存空间和一组系统资源,所以系统产生一个线程或者是在线程间切换工作时消耗比进程小得多。所以线程又称为轻量级进程。
30.线程又哪些基本状态?
new->ready->running->-wait->blocked->dead
31.final关键字的使用?
- 修饰基本数据类型的变量则该变量一旦初始化后不可修改,如果修饰的是引用类型的变量一旦初始化后不能指向其他对象。
- 修饰一个类,则这个类不能被继承。
- 修饰一个方法,则方法不能被重写。所有的private方法隐式的声明为final。
32.java中的异常处理
在java中所有的异常都有一个共同祖先类java.lang包中的Throwable类。这个类有两个重要的子类;Exception(异常)、Error(错误),两个都是java处理异常的重要子类,各自都包含大量子类。
-
Error:程序无法处理的错误,表示应用程序中比较严重的问题。表示虚拟机运行出现了问题,会终止程序运行。
-
Exception:程序可以处理的异常,表示在程序开发中可以预期到的问题。可以通过编码规避或者处理的问题。不会造成程序终止。
-
Throwable类常用方法:
- getMessage 返回异常发生时的详细信息。
- toString 返回异常发生时的简要描述。
- getLocalizedMessage:返回异常对象的本地化信息。使用Throwable的子类覆盖这个方法,可以称为本地化信息,付过没有覆盖则返回getMessage结果。
- printStackTrace:在控制台上打印Throwable对象封装的异常信息。
-
异常处理总结
- try 尝试捕获异常。
- catch 处理捕获到的异常。
- finally: 无论是否捕获异常都会执行的方法块。
-
以下几种情况 finally块不会执行:
- 在finally中发生了异常。
- 在前面的代码使用了System.exit()退出程序。
- 程序所有的线程死亡。
- 关闭cpu。