Java面试复习—Java基础
- 前言
- java基础
- 1.重载和重写
- 2.String、StringBuffer、StringBuilder
- 3.装箱与拆箱
- 4.==与equals
- 5.final关键字
- 6.Throwable类
- 7.接口和抽象类
- 8.System.out.println(3|9)输出什么?
- 9.面向对象的特征
- 10.public、private、protected、default
- 11.heap 和 stack 有什么区别?
- 12.swtich 是否能作用在 byte 上,是否能作用在 long 上,是否能作用在 String 上?
- 13.用最有效率的方法算出 2 乘以 8 等於几?
- 14.有没有 length()这个方法?String 有没有 length()这个方法?
- 15.是否可以继承 String 类?
- 16.静态内部类和内部类的区别
- 17.静态变量和实例变量的区别
- 18.是否可以从一个 static 方法内部发出对非 static 方法的调用
- 19.String s=new String(“xyz”);创建了几个 String Object?
- 20.接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?
- 21.内部类可以引用他包含类的成员吗?有没有什么限制?
- 22.java 中实现多态的机制是什么?
- 23.日期和时间
- 24.java 和 javasciprt 的区别
- java异常
前言
本文是Java面试复习系列中的Java基础篇,后面会陆续有该系列其他篇章,并且会一直维护。本系列都为网上资源整理而来,如有问题,及时联系。
java基础
1.重载和重写
- 重载:见名知意,就是重新载入该方法。所以方法名必须相同,但参数列表可以不同。在一个类中。
- 重写:就是抄一遍该方法。所以方法名和参数列表必须相同。出现在继承中。
2.String、StringBuffer、StringBuilder
String | STRING BUFFER | STRING BUILDER | |
---|---|---|---|
可变性 | 不可变 | 可变 | 可变 |
线程安全 | 安全(对象不可变) | 安全(同步锁) | 不安全 |
性能 | 低 | 中 | 高 |
总结 | 操作少量数据 | 数据量大、多线程 | 数据量大、单线程 |
3.装箱与拆箱
- 装箱:将基本类型用对应的引用类型包装(基本–>引用)
- 拆箱:将包装类型转换为基本的数据类型(引用–>基本)
4.==与equals
- ==判断地址是否相等
- equals重写之后比较对象的值是否相等,否则等效==
- String重写equals,Object没有
5.final关键字
- 变量
- 基本类型:初始化之后不能更改
- 引用类型:初始化之后不能指向另一个对象
- 方法:锁定方法、效率
- 类:不能被继承
6.Throwable类
- Exception(异常)
- 程序本身可以处理
- Error(错误)
- 程序无法处理
- 方法:
- getMessage():返回异常发生时的详细信息
- toString():返回异常发生时的简要描述
- printStackTrace():在控制台上打印Throwable对象封装的异常信息
- try catcah以及finally
- try 捕获异常
- catch 处理捕获的异常
- finally
- 无论是否捕获或处理异常,finally块里面的语句都会被执行
- 以下4种情况不会执行:
- finally中发生了异常
- 在finally前使用了System.exit()退出程序
- 程序所在线程死亡
- 关闭CPU
7.接口和抽象类
- 相同点
- 都不能被实例化
- 实现了接口或者抽象类的方法之后才能实例化
- 区别(从上而下记忆)
接口(注重扩展、维护性) | 抽象类(提供公共的实现代码) |
---|---|
public | public protect default |
实例变量默认final | 不一定为final |
一个类可以实现多个接口 | 继承一个抽象类 |
实现接口的所有方法 | 可以不实现所有方法 |
不能使用new实例化,但是可以声明 | 不能实例化 |
在接口中的方法不能实现 | 可以有非抽象的方法 |
8.System.out.println(3|9)输出什么?
正确答案:11.
考察知识点:&和&& |和||
- &和&&:
- 共同点:两者都可做逻辑运算符。它们都表示运算符的两边都是true时,结果为true;
- 不同点: &也是位运算符。& 表示在运算时两边都会计算,然后再判断;&&表示先运算符号左边的东西,然后判断是 否为true,是true就继续运算右边的然后判断并输出,是false就停下来直接输出不会再运行后面的东西。
- |和||:
- 共同点:两者都可做逻辑运算符。它们都表示运算符的两边任意一边为true,结果为true,两边都不是true,结果就 为false;
- 不同点:|也是位运算符。| 表示两边都会运算,然后再判断结果;|| 表示先运算符号左边的东西,然后判断是否为 true,是true就停下来直接输出不会再运行后面的东西,是false就继续运算右边的然后判断并输出。
回到本题: 3 | 9=0011(二进制) | 1001(二进制)=1011(二进制)=11(十进制)
9.面向对象的特征
- 封装
- 继承
- 多态
- 抽象
10.public、private、protected、default
作用域 | 当前类 | 同包 | 子孙类 | 其他 |
---|---|---|---|---|
public | √ | √ | √ | √ |
protect | √ | √ | √ | |
default | √ | √ | ||
private | √ |
11.heap 和 stack 有什么区别?
- 栈是一种线形集合,其添加和删除元素的操作应在同一段完成,栈按照后进 先出的方式进行处理
- 堆是栈的一个组成元素。
12.swtich 是否能作用在 byte 上,是否能作用在 long 上,是否能作用在 String 上?
- switch(expr1)中,expr1 是一个整数表达式。
- 因此传递给 switch 和 case 语句的参数应该是 int、 short、 char 或者 byte。long,string 都不能作用 于 swtich。
13.用最有效率的方法算出 2 乘以 8 等於几?
答: 2 << 3。
- 左移一位相当于*2
- 右移一位相当于/2
14.有没有 length()这个方法?String 有没有 length()这个方法?
- 数组没有 length()这个方法,有 length 的属性。
- String 有 length()这个 方法。
15.是否可以继承 String 类?
- String 类是 final 类,故不可以继承。
16.静态内部类和内部类的区别
- 静态内部类是被声明为静态(static)的内部类,它可以不依赖于外部类实例被实例化。
- 内部类需要在外部类实例化后才能实例化。
17.静态变量和实例变量的区别
- 静态变量也称为类变量,归全类共有,它不依赖于某个对象,可通过类名直 接访问
- 实例变量必须依存于某一实例,只能通过对象才能访问到它
18.是否可以从一个 static 方法内部发出对非 static 方法的调用
- 不可以,如果其中包含对象的 method(),不能保证对象初始化
19.String s=new String(“xyz”);创建了几个 String Object?
- 两个对象
- 一个是"xyx"
- 一个是指向"xyx"的引用对象 s。
20.接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?
- 接口可以继承接口。
- 抽象类可以实现(implements)接口。
- 抽象类可继承实体类,但前提是实体类必须有明确的构造函数
21.内部类可以引用他包含类的成员吗?有没有什么限制?
- 一个内部类对象可以访问创建它的外部类对象的内容。
22.java 中实现多态的机制是什么?
- 方法的覆盖 Overriding 和重载 Overloading 是 java 多态性的不同表现
- 覆盖 Overriding 是父类与子类之间多态性的一种表现,重载 Overloading 是一个 类中多态性的一种表现
23.日期和时间
- 如何取得年月日、小时分秒?
- 创建 java.util.Calendar 实例(Calendar.getInstance()),调用其 get() 方法传入不同的参数即可获得参数所对应的值
- 如: calendar.get(Calendar.YEAR);
- 创建 java.util.Calendar 实例(Calendar.getInstance()),调用其 get() 方法传入不同的参数即可获得参数所对应的值
- 如何取得从 1970 年到现在的毫秒数?
- Calendar.getInstance().getTimeInMillis(); System.currentTimeMillis()
- 如何取得某个日期是当月的最后一天?
- Calendar time = Calendar.getInstance(); time.set(Calendar.DAY_OF_MONTH, time.getActualMaximum(Calendar.DAY_OF_MONTH))
- 如何格式化日期?
- 利用 java.text.DataFormat 类中的 format()方法可将日期格式化。
24.java 和 javasciprt 的区别
- JavaScript 与 Java 是两个公司开发的不同的两个产品。
- Java 是 SUN 公司推 出的新一代面向对象的程序设计语言,特别适合于 Internet 应用程序开发, Java 的前身是 Oak 语言。
- JavaScript 是 Netscape 公司的产品,其目的是为了扩展 Netscape Navigator 功能,而开发的一种可以嵌入 Web 页面中的基于对象和事件驱动的解释性语言,它的前身是 Live Script;
- 下面对两种语言间的异同作如下比较:
- 基于对象和面向对象:
- Java 是一种真正的面向对象的语言,即使是开发简单的程序,必须设计对象;
- JavaScript 是种脚本语言,它可以用来制作与网络无关的,与用户交互作用的复杂软件。它是一种基于对象(Object Based)和事件驱动(Event Driver) 的编程语言。因而它本身提供了非常丰富的内部对象供设计人员使用;
- 解释和编译:
- Java 的源代码在执行之前,必须经过编译;
- JavaScript 是一种解释性编程语言,其源代码不需经过编译,由浏览器解释执行;
- 强类型变量和类型弱变量:
- Java 采用强类型变量检查,即所有变量在编译之前必须作声明;
- JavaScript 中变量声明,采用其弱类型。即变量在使用前不需作声明,而是 解释器在运行时检查其数据类型;
- 代码格式不一样
- 基于对象和面向对象:
java异常
1.error 和 exception 有什么区别?
- error 表示系统级的错误和程序不必处理的异常,是恢复不是不可能但很困难的情况下的一种严重问题;比如内存溢出,不可能指望程序能处理这样的情况;
- exception 表示需要捕捉或者需要程序进行处理的异常,是一种设计或实现问题;也就是说,它表示如果程序运行正常,从不会发生的情况。
2.try {}里有一个 return 语句,那么紧跟在这个 try 后的 finally {}里的 code 会不会被执行,什么时候被执行,在 return 前还是后?
- 会执行,在 return 前执行。
3.JAVA 语言如何进行异常处理,关键字:throws,throw,try,catch,finally 分别代表什么意义?在 try 块中可以抛出异常吗?
- Java 通过面向对象的方法进行异常处理,把各种不同的异常进行分类,并提供了良好的接口。
- 在 Java 中,每个异常都是一个对象,它是 Throwable 类或其它子类的实例。当一个方法出现异常后便抛出一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获到这个异常并进行处理。
- Java 的异常处理是通过 5 个关键词来实现的:try、catch、throw、throws 和 finally。
- 一 般情况下是用 try 来执行一段程序,如果出现异常,系统会抛出(throws)一个异常,这时候你可以通过它的类型来捕捉(catch)它,或最后(finally)由缺省处理器来处理;
- try 用来指定一块预防所有“异常”的程序;
- catch 子句紧跟在 try 块后面,用来指定你想要捕捉的“异常”的类型;
- throw 语句用来明确地抛出一个“异常”;
- throws 用来标明一个成员函数可能抛出的各种“异常”;
- Finally 为确保一段代码不管发生什么“异常”都被执行一段代码;
4.运行时异常与一般异常有何异同?
- 异常表示程序运行过程中可能出现的非正常状态
- 运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。
- java 编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。