面试题:
一、请简述jdk、jre和jvm
* a: JRE为Java的运行时环境,是运行Java程序依赖的。如果仅仅是运行已经存在的Java程序,只安装JRE即可
* 包括Java虚拟机(JVM Java Virtual Machine)和Java程序所需的核心类库等,如果想要运行一个开发好的Java程序,计算机中只需要安装JRE即可
* JRE:JVM+类库
* b: JDK为Java的开发环境,是开发时依赖的。包含JRE
* JDK是提供给Java开发人员使用的,其中包含了java的开发工具,也包括了JRE。所以安装了JDK,就不用在单独安装JRE了。
* 其中的开发工具:编译工具(javac.exe) 打包工具(jar.exe)等
* JDK:JRE+JAVA的开发工具
* 为什么JDK中包含一个JRE呢?
* 开发完的程序,需要运行一下看看效果
二、goto和const是关键字吗?
* goto与const是Java中的保留字,即没有赋予特殊含义却仍被Java占用的单词,类似Editplus这样的高级记事本,针对关键字有特殊的颜色标记,非常直观
三、基本数据类型各占用多少字节?
* a: 整数型(精确)
* int 占用4个字节 (整数的默认值)
* byte 占用1个字节
* short 占用2个字节
* long 占用8个字节
* long类型在赋值时,需要在值后加入字母l(L)区分其是一个长整型
如 int i = 100; short s = 66; long l = 100L;
* 2:浮点型(小数型,非精确,为近似值)
* double 占用8个字节 (小数的默认值)
* float 占用4个字节
* float类型在赋值时,需要在值后加入字母f(F)区分其是一个长整型
如 double d = 100.0; double d2 = 10.1; float f = 100F;
* b:字符型
* 占用2个字节,必须使用’’包裹,且不能为空,如 char c = ‘a’; char c2 = ‘中’; char c3 = ‘ (空格)’; char c4 = ‘$’
* 字符存储原理
* 每一个值在存储时,均存储的为值对应的数字,每一个英文字符都有其固定的数字对应,英文字符与数字的对应关系组成了一张编码表,该表名称为ASCII表('A':65,'a':97,'0':48)
* 转义字符
* 有时无法直接给出一个字符,需要使用转义字符进行转义。转义字符也为一个字符,由转义符号与被转义字符组成转义符号:\
* \t 制表符
* \’ 单引号
* \” 双引号
* \\ 反斜杠
* c: 布尔型
* 代表一些条件成立与不成立的判断。只有两个值true与false
* boolean占用1个字节,如 boolean b = true; boolean b2 = false;
Day02面试题:
1、第一题:
byte b1=3,b2=4,b;
b=b1+b2; 错: bi和b2会自动提升int类型,在赋值给byte类型会损失精度
b=3+4; 对: 常量优化机制 , 编译是会算出7,然后在byte范围内
哪句是编译失败的呢?为什么呢?
第二题:
byte b = 10;
b++; 对,系统自动强制转换
b = b + 1; 不对,损失精度
哪句是编译失败的呢?为什么呢?
2、自增和自减 放在数值的前后各有什么区别?
a:单独使用:
* 放在操作数的前面和后面效果一样。(这种用法是我们比较常见的)
b:参与运算使用:
* 放在操作数的前面:先产生副作用,把原值先自增或自减,然后在参与运算
* 放在操作数的后面:先使用原值参与运算,然后再把原值自增或自减。
3、除以0可以吗?会报什么错误?
/(除法)和%(取模)的注意事项
* a: 整数做被除数,0不能做除数,否则报错
* b: 小数做被除数,整除0结果为Infinity,对0取模结果为NaN //Infinity:无穷大
4、&&和&有什么区别?
&& 短路与,即并且,有假则假,同时满足两个条件
特点:&&具有短路效果。左边是false,右边不执行
5、||和|有什么区别?
同上
6、三元运算符的格式?
b: 使用格式
* (条件表达式)?表达式1:表达式2;
==========================================
Day04面试题:
1、数组常见的异常?
* 空指针异常(NullPointerException)
举例:int[] arr = null;
* 数组索引越界异常(ArrayIndexOutOfBoundsException)
举例:int[] arr = new int[5]; 获取arr[6]的时候就会出现索引越界
2、什么是方法的重载?方法的定义格式和使用方式
A:定义
* 在同一个类中,出现方法名相同而参数列表不同,这样定义方法叫做方法重载。
B:注意事项:
* 和返回值类型无关
* 方法名必须一样
* 参数不一样
C:方法重载举例
* public int add(int a,int b) {逻辑} //两个数加法
* public int add(int a,int b,int c) {逻辑} //三个数加法
* public int add(int a,int b,int c,int d) {逻辑} //四个数加法
3、什么是成员变量?
2、成员变量
A:什么时候使用成员变量:
当类中所有的方法都需要使用的时候,就要把这些变量定义在成员位置
B:定义位置
* 直接定义在类中方法外的变量,叫做成员变量。
C:作用域
* 定义在方法内,变量只在方法内起作用,而定义在类中,可以被本类中的所有方法访问
3、成员变量知识补充
A:如果很多方法都要访问某个数据,就需要将这些数据定义在成员位置
B:前面的代码中所有变量都是用static修饰的为什么呢?
因为main方法是static修饰的。这样main方法调用其它方法时也必须是静态的,而静态方法访问属性时,属性也必须是静态的
总而言之:静态的只能访问静态的
=========================================
Day05面试题:
1、ArrayList的定义格式和使用
ArrayList的使用
A:导包:import java.util.ArrayList;
B:创建对象:
类名<集合内元素类型> 变量 = new 类名<集合内元素类型>();
ArrayList<Integer> list = new ArrayList<>();
例如:?
介绍菱形泛型?
* 注意:基本类型需要存放对应的引用类型
ArrayList<Integer> yyYY = new ArrayList<Integer>();
ArrayList<Double> zzZZ = new ArrayList<Double>();
C:调用方法:
* 直接向集合添加元素:add(元素);
* 在指定索引处向集合添加元素:add(索引,元素);
* 删除指定索引位置的元素:remove(索引);
* 修改指定索引位置的元素:set(索引,元素);
* 获取集合长度:size();
* 根据指定索引获取集合元素:list.get(索引);
2、ArrayList集合与数组的区别
A:为什么使用ArrayList
* 虽然数组容器效率最快,但是开发中我们使用的数组并不多。因为它的长度不可变!
* 而使用ArrayList集合,它的底层也是数组实现的,效率一样,但是ArrayList的长度是可变的。
* 并且可以调用功能强大的方法来满足不同需求
B:ArrayList集合与数组的区别
* 数组长度不可变,可以存储任意类型,有索引
* 集合长度可变,只能存储引用数据类型(存储基本数据类型时会自动转成对应的引用数据类型),也有索引
* 数组并没有提供操作其元素的方法,而集合提供了很多方法操作其元素
* int->Integer
* double->Double
* float->Float
* char->Character
=============================================
面试题:
1、Scanner类的next()方法和nextLine()方法的区别?
=============================================
Day07面试题:
1、什么是面向对象?
面向对象是软件开发过程中使用的一种思维方式.将功能封装进对象,强调具备了功能的对象.不关注过程.
是一种更符合人们思考习惯的思想,可以将复杂的事情简单化,将程序的执行者转换成为指挥者.
2、面向对象的三大思想特征是什么?
封装
继承
多态
3、成员变量和局部变量的区别有哪些?
* 成员变量
* 定义位置:类中,整个类中均可以访问。
* 内存:成员变量随着对象的建立而建立,存在于对象所在的堆内存中。
* 默认值:成员变量有默认值。
* 回收:随着对象的回收而回收。
* 局部变量
* 定义位置:定义在局部范围,如方法内,语句内等。
* 内存:局部变量存在于栈内存中。
* 默认值:没有默认值。
* 回收:随着作用域结束而回收,通常为语句或方法范围。
* 变量访问原则
* 就近原则
* c: 注意
* 成员变量的访问不再使用从前的方式,而使用调用属性对应的get/set方法的方式。即类的使用不再包含直接使用对象访问属性,均是在调用方法。
4、什么是封装?封装的好处,原则分别是什么?
* 把数据和方法包装进类中,以及具体实现的隐藏,常共同被称作是封装。
* 封装的结果是一个同时带有特征和行为的数据类型。
* 我们前边所完成的水果项类的定义就是封装的一部分。同样,成员变量与成员方法以及对应的private修饰,公共的get/set方法均为封装的一部分。