本文很多知识点源自《JavaGuide ⾯试突击版》。
1.面向对象和面向过程的区别
- 面向过程:面向过程关注的时候代码的实现细节,缺点是:关注代码细节、复用性低
- 面向对象:面向对象的实现过程是先把实现细节整合到对象中,找到这个对象就能拥有这个对象的功能。优点是:易维护、易复用、易扩展。
面向对象基于面向过程,但是面向对象不一定优于面向过程,如果场景较为简单时,优先推荐使用面向过程;但是如果场景较为复杂的话,推荐采用面向对象。
2.Java语言的特点:
- 面向对象(封装、继承、多态)
- 平台无关性(JVM实现1平台无关性)
- 可靠性
- 安全性
- 支持多线程
- 支持网络编程并且很方便
3.JVM、JRE、JDK
- JVM:
JVM具有可移植性:所有的Java程序都是运行在Java虚拟机上的,Java虚拟机屏蔽了不同操作系统的差异性,使得相同的程序能够运行在不同的操作系统之上,实现了Java语言的跨平台性。
JVM是运行java字节码的虚拟机,jvm带给Java的优点是:一次编译、处处运行 - JRE=JVM+核心类库
- JDK=JRE+kit(核心工具包)
5.字符型常量和字符串常量的区别:
- 形式上:字符常量是由一个单引号引起的字符,字符串常量是由双引号引起的若干字符
- 含义上:字符常量相当于一个整形值,可以参加表达式运算;字符串常量代表一个地址值(该字符串在内存中存放位置)
- 占用内存大小:字符常量只占2个字节,字符串常量占若干字节
5.构造器Constructor是否可以被override?
Constructor不能被重写,但是可以被重载。
6.重载和重写的区别
- 重载:发生在同一个类中,方法名必须相同,参数列表不同。
重载方法的选择问题?
在调用重载方法时,如果提供了精确匹配的方法就做精确匹配,如果没有提供精确匹配方法就做相对精确匹配,如果提供了相同程度的相对精确匹配就会匹配不到而发生报错。 - 重写:再父子类中出现方法名一致的方法称之为重写。
a.重写需要遵循一下原则(两等两小一大)
1)一等:方法签名一致
2)一等:当父类方法的返回值是基本类型或是void时,子类的方法返回值必须和父类方法返回值一致
3)一小:子类抛出的编译时异常必须小于父类
4)一小:当父类的方法返回值类型是引用数据类型时,那么子类方法的返回值类型要么和父类一致,要么是父类方法返回值的子类
5)一大:子类方法的权限修饰符范围大于等于父类
b.如果父类的方法的访问权限修饰符被private/static/final修饰,那么子类无法重写该方法,但是被static修饰的方法能够被再次声明
c.构造方法无法被重写
7.Java面向对象的三大特征:封装、继承、多态
- 封装:体现形式:方法、属性私有化摈弃给提供公共的访问形式来进行正常的取值和赋值,提高代码数据的安全性
- 继承:如果多个类的内容出现重复,把重复的内容放到一个新的类中,通过extends关键字让原来的类和新的类产生关联关系--继承。原来的类可以称之为子类,新的类的可以称之为父类。子类可以继承父类的部分信息(父类的私有化信息、构造方法、构造代码块除外)
1)继承方式:单继承
2)子类可以拥有自己的属性和方法
3)子类可以同重写实现父类的方法 - 多态:多态指的是代码在执行过程中能够呈现多种形式,在Java中有有两种形式可以显示多态:继承和接口,多态分为以下两种:
1)编译时多态:在编译时期绑定代码,体现形式:重载
2)运行时多态:在运行时绑定代码,体现形式:重写、向上造型(可以调用哪些方法看的是父类,方法的具体执行看的是子类)。
8.String StringBuffer和StringBuilder的区别是什么?String为什么是不可变的?
- 优于String类中使用了final关键字来修饰字符数组来保存字符串,所以String是不可变的
- StringBuilder和StringBuffer中也是使用字符数组来保存字符串,但是没有使用final来修饰,所以这两者是可变的。
- StringBuilder和StringBuffer的区别:
1)从jdk1.0开始,String类做拼接时用的是StringBuffer,安全可靠,但是拼接效率低。
2)从jdk1.5开始,String类做拼接使用的是StringBuiler,不安全但是拼接效率高。
9.自动装箱和自动拆箱
- 装箱:由基本数据类型来构建包装类的对象;把基本数据类型直接赋值给包装类对象,称为自动封箱,自动封箱底层实现:包装类.valueOf(基本数据类型)。
- 拆箱:将包装类类型转换为基本数据类型;把包装类对象直接赋值给基本数据类型,称之为自动拆箱,自动拆箱的底层实现:包装类对象.xxxValue(),自动封箱和拆箱是jdk1.5的新特性
10.在一个静态方法里面调用一个非静态成员为什么是非法的?
由于静态方法可以不通过对象调用,因此在静态方法里,不能调用其他非静态变量,也不可以访问其他非静态变量成员。
11.在Java中定义一个不做事且没有参数的构造方法的作用?
Java程序在执行子类的构造方法之前,如果没有用super()来调用父类特定的构造方法,则会调用父类中的无参构造。因此如果父类中只定义了有参构造,而在子类中没有使用super()来调用父类中特定的构造方法,则编译时就会发生错误,而解决的方法就是在父类中加上一个不做事且没有参数的构造方法。
12.import和javax的区别
刚开始的时候javaAPI所必需的包是java开头的包,javax当时值时扩展API包来使用,但是随着时间的推移,javax逐渐的扩展成为java API的组成部分。但是,但是,将扩展从 javax 包移动到 java包确实太麻烦了,最终会破坏⼀堆现有的代码。因此,最终决定 javax 包将成为标准 API 的⼀部分。
所以,实际上 java 和 javax 没有区别。这都是⼀个名字。
13.接口和抽象类的区别
- 接口不是类
- 接口里只有抽象方法
- 类与接口是多实现,接口与接口之间支持多继承
- 接口里的属性和抽象方法都有默认的修饰符
- 抽象类能够延展类的继承结构,接口能够给类注入更多的特性。
14.成员变量和局部变量区别
- 位置不同:成员变量定义在方法外类内;局部变量定义在方法内
- 使用范围:成员变量的使用范围是整个类,局部变量的使用范围是整个方法
- 内存:成员变量存放在堆,局部变量存放在栈
- 生命周期:随着类创建对象而出现,随着对象被回收而消失;局部变量:当方法被调用时才出现,随着方法执行结束而消失
15.创建一个对象使用什么运算符?对象实体和对象引用有何不同?
new创建对象实例,对象引用指向对象实例,一个对象引用可以指向0个或是1个对象,一个对象也可以有n个引用指向它。
16.什么是方法的返回值?方法返回值的作用是什么?
方法返回值是指我们获取到的某个方法体中的代码执行后产生的结果。返回值的作用:接受出结果,使得他们可以用于其他操作。
17.⼀个类的构造⽅法的作⽤是什么? 若⼀个类没有声明构造⽅法,该程序能正确执⾏吗? 为什么?
- 构造方法的主要作用是对对象的初始化工作。
- 可以
- 因为即使一个类没有声明构造方法,底层也会添加默认的不带参数的构造方法。
18.构造方法有哪些特性?
- 名字和类名相同
- 没有返回值,但不能用void声明构造函数
- 生成类的对象时自动执行,无需调用
19. 静态⽅法和实例⽅法有何不同
- 在外部调用静态方法时,可以使用类名.静态方法,也可以使用对象名.静态方法的方式,而实例方法只有后面这种形式。
- 静态方法在访问本类的成员时,只允许访问静态成员,而不允许访问非静态信息,实例方法则无此种限制。
20. 对象的相等与指向他们的引⽤相等,两者有什么不同?
对象的相等,⽐的是内存中存放的内容是否相等。⽽引⽤相等,⽐较的是他们指向的内存地址是否相
等。
21.在调⽤⼦类构造⽅法之前会先调⽤⽗类没有参数的构造⽅法,其⽬的是?
帮助子类做初始化操作。
22.== 与 equals(重要)
- ==:它的作用是判断两个对象的地址是否相等,基本数据类型==比较的是值,引用数据类型==比较的是内存地址
- equals():它的作用也是判断两个对象是否相等,但是他一般有两种使用情况:
1)类没有覆盖 equals() ⽅法。则通过 equals() ⽐较该类的两个对象时,等价于通过==⽐较这两个对象。
2)类覆盖了 equals() ⽅法。⼀般,我们都覆盖 equals() ⽅法来⽐较两个对象的内容是否相等;若它们的内容相等,则返回 true (即,认为这两个对象相等)。 -
注意:
1)String 中的 equals ⽅法是被重写过的,因为 object 的 equals ⽅法是⽐较的对象的内存地址,⽽ String 的 equals ⽅法⽐较的是对象的值。
2)当创建 String 类型的对象时,虚拟机会在常量池中查找有没有已经存在的值和要创建的值相同的对象,如果有就把它赋给当前引⽤。如果没有就在常量池中重新创建⼀个 String 对象。
23.hashCode 与 equals (重要)
- 如果两个对象相等,则hashcode一定也是相同的
- 两个对象相等,对两个对象调用equals方法都会返回true
- 两个对象有相同的hashcode值,他们也不一定是相等的
- 因此equals方法被覆盖过,则hashcode也不必须被覆盖。
- hashCode() 的默认⾏为是对堆上的对象产⽣独特值。如果没有重写 hashCode(),则该 class的两个对象⽆论如何都不会相等(即使这两个对象指向相同的数据)
24.简述线程、程序、进程的基本概念。以及他们之间关系是什么?
- 进程:操作系统上应用程序拆分成多个小任务(操作系统调度的最小单位)
- 线程:进程拆分成多个小任务(CPU可以执行的最小单位)
- 程序是含有指令和数据的⽂件,被存储在磁盘或其他的数据存储设备中,也就是说程序是静态的代码。
25.线程的状态
26.final关键字
关键字,修饰符---修饰数据、方法、类
1)修饰数据,称为最终值
- 当final修饰基本类型数据时,值不能改变
- 当final修饰引用数据类型时,地址值不能改变
- 当final修饰成员变量时,保证对象完成之前给值
- 当final修饰静态变量时(静态常量),保证类加载完成之前给值
2)修饰方法称为最终方法:支持重载不支持重写
3)修饰类称为最终类:可以继承别的类但是不能被别的类继承
27.java中的异常
用于发现问题、反馈问题以及解决问题的一套机制
Throwable类---异常的顶级父类,子类---Error、Exception.
- Error:是一个合理的应用程序,不应该试图抓住的严重问题(改变外部需求、环境、资源等等)
- Exception:是一个合理的应用程序可以处理也可以不处理
1.处理方式:1)抛出 2)捕获
2.分类:- 编译时异常---在编译时期出错 一定要处理 除了RuntimeException以及它的子类以外
CloneNotSupportedException----克隆不支持异常
ParseException---解析异常 - 运行时异常----在运行时出错 可以处理也可以不处理 RuntimeException以及它的子类
ArithmeticException------算术异常
NullPointerException----空指针异常
ArrayIndexOutOfBoundsException----数组越界异常
ClassCastException-----类型转换异常
NumberFormatException----数字格式异常
- 编译时异常---在编译时期出错 一定要处理 除了RuntimeException以及它的子类以外
- 捕获方式:
1.分别捕获---针对方法上抛出的所有异常进行分别处理(提供对应的catch进行分别处理)
2.统一捕获---针对方法上抛出的所有异常进行统一处理(提供一个catch以及抛出异常类的公共父类)
3.分组捕获---提供|来间隔一组之间的异常类进行统一处理(jdk1.7出现的) - finally块
无论异常是否出现都要把finally块里的内容执行完毕
28. Java 序列化中如果有些字段不想进⾏序列化,怎么办?
对于不想进⾏序列化的变量,使⽤ transient 关键字修饰。
transient 关键字的作⽤是:阻⽌实例中那些⽤此关键字修饰的的变量序列化;当对象被反序列化时,被 transient 修饰的变量值不会被持久化和恢复。transient 只能修饰变量,不能修饰类和⽅法。
29.获取⽤键盘输⼊常⽤的两种⽅法
- 通过Scanner
Scanner input = new Scanner(System.in);
String s = input.nextLine();
input.close(); - 通过BufferedReader
BufferedReader input = new BufferedReader(new
InputStreamReader(System.in));
String s = input.readLine();
30.java中io流
详细可见该文章
https://www.jianshu.com/p/d8c0403c4b6c
31.深拷贝 vs 浅拷贝
- 浅拷贝:对基本数据类型进⾏值传递,对引⽤数据类型进⾏引⽤传递般的拷贝,此为浅拷贝。
- 深拷贝:对基本数据类型进⾏值传递,对引⽤数据类型,创建⼀个新的对象,并复制其内容,此为深拷贝。
详细可见该文章中克隆一部分内容:
https://www.jianshu.com/p/4a00687ce6db