Q1::你用的IDE是什么?
提示: 这个题的考点在于”版本”, 千万不要回答成: 我用的是IDEA, JDK, VMware...这种无效回答.
答:我用的IDE是: IDEA2018.3.1, JDK1.8, VMWare14.2, CenterOS6.9, MySQL5.6, Zookeeper3.4.5等.
Q2:JDK和JRE的区别是什么?
提示: 最好按照范围从大到小来回答.
答:JDK是Java开发工具包, 包含开发Java程序所需的工具和JRE.
JRE是Java运行环境, 包含运行Java程序所学的核心类库和JVM.
JVM是Java虚拟机, 它是用来保证Java程序跨平台的.
Q3:Java程序跨平台的原理是什么?
答:只需要在需要运行Java程序的电脑上安装对应版本的JVM, 由JVM来保证Java程序的跨平台性.
Q4:JVM可以跨平台吗?
答:JVM全称叫Java Virtual Machine(Java虚拟机), 它是用来保证Java程序跨平台性的, 它本身并不能跨平台.
Q5:Java中的保留字是什么?
答:Java中的保留字指的是: 有关键字的作用, 但是目前还不是关键字, 在以后的JDK升级版本过程中, 可能会被升级为关键字的单词. 例如: goto, const都是保留字.
Q6:main是关键字吗?
答:不是, main是主函数的名字, 可以被JVM识别, 也是程序的主入口, 所有代码的执行都是从这里开始的.
Q7:Java程序的特点是什么?
答:开源, 跨平台, 多线程, 面向对象.
Q8:Java程序的三大思想特征是什么?
答:封装, 继承, 多态.
Q9:path和classpath环境变量的区别是什么?
答:path环境变量:
配置的是可执行文件.exe的执行路径,可以在任意盘符下访问path路径下的可执行文件。
classpath环境变量:
配置的java语言编译后生成的字节码文件的执行路径,可以在任意盘符下访问配置后的字节码文件。
Q10:进行运算的时候, 变量和常量有什么区别?
答:变量指的是在程序运行过程中, 其值可以在一定范围内变化的量, 可以被多次赋值. 常量指的是在程序运行过程中, 其值不能发生改变的量, 且只能赋值一次.
Q11: final的作用是什么?
答:它是一个关键字, 表示”最终”的意思, 可以修饰类, 修饰变量, 修饰方法.
被它修饰的类: 不能被继承, 但是可以继承其它类.
被它修饰的方法: 子类可以继承, 但是不能重写.
被它修饰的变量: 其实是一个常量.
Q12:final修饰的变量有什么特点?
答:如果修饰的变量是: 基本类型, 则该变量的 数值不能改变. 如果修饰的变量是: 引用类型, 则该变量的地址值不能改变, 属性值可以改变.
Q13:Java中常量有几种?
答:有两种, 分为自定义常量和字面值常量. 其中字面值常量又分为6种:
整数常量, 小数常量, 字符常量, 字符串常量, 布尔常量, 空常量.
Q14:Java中的数据类型有几种?
答:有两种, 分为基本类型和引用类型. 其中:
引用类型: 指的是数组, 集合, 自定义类型等.
基本类型: 有四类八种.
四类: 整型, 浮点型, 布尔型, 字符型.
八种: byte, short, char, int, long, float, double, boolean.
Q15:标识符的组成由哪些? 命名规则和规范分别是什么?
答:标识符由: 英文大小写字母, 数字, 下划线, 美元符 这四部分任意拼接组成.
命名规则:
1. 必须由英文大小写字母, 数字, _, $这四部分任意拼接组成.
2. 不能以数字开头.
3. 不能和Java中关键字重名.
4. 最好做到见名知意.
命名规范:
1. 类, 接口: 大驼峰命名法, 所有单词的首字母都大写, 其他全部小写.
2. 方法, 变量: 小驼峰命名法, 从第二个单词开始所有单词的首字母都大写, 其他字母全部小写.
3. 常量: 所有字母都大写, 单词之间用下划线隔开.
4. 包: 所有字母都小写, 多级包之间用.隔开, 一般是公司的域名反写.
Q16:ASCII码表中, 字符‘a’, ‘A’,’0’对应的int值分别是多少?
答:‘a’: 97 ‘A’: 65 ‘0’: 48
Q17:long类型的变量占8个字节, float类型的变量占4个字节, 为什么long类型的范围反而要比float类型的范围小?
答:因为它们底层计算规则不一样, long是整数, 采用8421码规则. float是小数, 采用IEEE754规则.
Q18:++ 和 -- 用法是什么?
答:它们的用法分为两类: 此处以++举例(--类似)
1. 单独使用, 前加后加没有任何区别, 都是自身+1.
2. 参与运算, 前加是: 变量自身先加1, 然后用新值参与运算. 后加是: 先以变量的原值参与运算, 然后变量值再自身+1.
Q19:& 和 &&的区别是什么?
答:&: 逻辑与, 有false则整体为false, 不会发生短路效应, 不管前边时候出现false, 整个表达式都会执行.
&&: 短路与, 有false则整体为false, 会发生短路效应. 前边出现false, 后边不执行.
Q20:Java中四舍五入的原理是什么?
答:+0.5, 然后计算该数字对应的: 地板数.
Q21:Java中获取指定的随机数有几种方式?
答:1. 可以通过Math#random()实现. 2. 可以通过Random#nextInt()实现.
Q22:三元运算符 和 if.else语句之间的区别是什么?
答:它们的相同点是: 都可以用来做判断. 不同点是:
1. 作用范围不同. 能用三元运算符实现的逻辑, 用if.else语句一定能实现. 反之则不一定.
2. 本质不同. 三元运算符是一个运算符, 而if.else是一个语句.
Q23:for, while, do.while 这三种循环之间的区别是什么?
答:for和其他两个循环的区别在于:
for循环执行完毕后, 初始化条件不可以继续使用, 而其他两个循环执行完毕后, 初始化条件还可以继续使用.
do.while循环和其他两个循环的区别在于:
do.while循环是: 不管判断条件是否成立, 循环体都会执行一次. 而其他两个循环是判断条件不成立, 循环体不执行.
Q24:if语句 和 switch语句的区别是什么?
答:if语句一般用于做范围的判断, switch语句一般用来做区间判断.
Q25:switch.case语句的表达式可以放什么?
答:JDK1.5以前: byte, short, char, int.
JDK1.5: 新加入功能, 可以放枚举.
JDK1.7: 新加入功能, 可以放字符串(String).
Q26:switch语句中的break可以省略不写吗?
答:最后一个break可以省略, 对结果没有任何影响, 中间的break省略的话, 可能会发生case穿透的现象.
Q27:break 和 continue的区别是什么?
答:break是用来终止循环的, 循环不再继续执行, 而且它还可以应用到switch语句中. continue是用来结束本次循环, 进行下一次循环的, 循环还会继续执行.
Q28:方法重写和方法重载的区别是什么?
答:方法重写指的是: 子类出现和父类一模一样的方法时, 称为方法重写, 方法重写要求子父类方法返回值的数据类型也必须一致或者有子父类关系.
方法重载指的是: 同一个类中出现方法名相同, 参数列表不同的两个或以上的方法时, 称为方法重载. 方法重载和返回值的数据类型无关.
Q29:不同类型数组的默认值分别是什么?
答:整型数组: 默认值是0, 浮点型数组: 默认值是0.0,
boolean数组: 默认值是false, char数组: 默认值是’u0000’
引用类型数组的默认值都是: null.
Q30:浅谈栈内存和堆内存的区别是什么?
答:栈中存储的是局部变量及所有代码的执行, 资源是用完就释放.
堆中存储的是所有new出来的内容(对象), 在不确定的时间被GC回收.
Q31:数组和集合的区别是什么?
答:数组: 长度固定, 既可以存储基本类型的数据, 也可以存储引用类型的数据.
集合: 长度可变, 只能存储引用类型的数据.
Q32:局部变量 和 成员变量的区别是什么?
答:它们的区别有以下4点:
1. 定义位置不同.
(1)局部变量定义在方法中, 或者方法的形参上.
(2)成员变量定义在类中, 方法外.
2. 在内存中的存储位置不同.
(1)局部变量存储在 栈内存.
(2)成员变量存储在 堆内存.
3. 初始化值不同.
(1)局部变量没有默认值, 必须先定义, 再赋值, 然后才能使用.
(2)成员变量有默认初始化值.
4. 生命周期不同.
(1)局部变量是随着方法的调用而存在, 随着方法的调用完毕而消失.
(2)成员变量是随着对象的创建而存在, 随着对象的消失而消失.
Q33:变量的使用顺序是什么?
答:使用变量遵循就近原则, 局部位置有就使用, 没有就去本类的成员位置找, 有就使用, 没有就去父类的成员位置找, 有就使用. 没有就报错.(这里不考虑父类的父类).
Q34:类和对象之间的关系是什么?
答:类是属性和行为的集合, 是一个抽象的概念, 看不见也摸不着.
对象是类的具体体现, 实现.
例如: 单说”人”, 那指的就是”人类”, 而”姓名叫张三, 年龄23岁”的人就是一个具体的人类对象.
Q35:什么是面向对象?
答:面向对象是一种编程思想, 强调的是以对象为基础完成各种操作, 它是基于面向过程的. 说到面向对象不得不提的就是它的3大思想特点:
1. 更符合人们的思维习惯.
2. 把复杂的事情简单化.
3. 把程序员从执行者编程指挥者.
举个例子吧: 洗衣服. 面向过程呢, 要自己找盆, 接水, 放洗衣液, 揉搓衣服, 拧干, 晾晒等, 很麻烦, 如果是面向对象就简单的多了, 可以直接找女朋友来洗, 没有女朋友的就只能找洗衣机了. 所以啊, 万物接对象.
Q36:什么是封装?
答:封装就是隐藏对象的属性和实现细节, 仅对外提供公共的访问方式.
Q37:封装指的就是private, 这句话对吗?
答:不对, 因为private仅仅是封装的一种体现, 我们常用的方法, 类也是封装的体现.
Q38:private的作用是什么?
答:它是一个关键字, 表示”私有”的意思, 被它修饰的内容只能在本类中直接访问(包括私有成员).
Q39:构造方法可以给对象赋值, setXxx()方法也可以给对象赋值, 这两种赋值方式之间有什么区别?
答:构造方法主要作用是用来创建对象的, 捎带着可以给对象的属性赋值, 如果重复调用, 则创建的是一个新对象.
setXxx()方法的作用就是用来: 设置对象的属性值的, 并不会创建新对象.
Q40:getXxx()和setXxx()方法必须成对出现吗?
答:不一定, 看需求. 如果只设置值就用setXxx(), 如果只获取值就用getXxx().
建议:不管这两个方法用谁, 最好成对写.
Q41:说一下你对”Java中参数传递问题”的看法.
答:Java中只有值传递, 基本类型传递的是: 值. 引用类型传递的是: 地址值.
Q42:类变量(静态变量)和实例变量(也叫: 对象变量, 成员变量)的区别是什么?
答:它们的区别有以下4点:
1. 所属不同. 静态变量属于类, 而成员变量属于对象.
2. 在内存中的存储位置不同.
(1)静态变量存储在方法区的静态区.
(2)成员变量存储在堆内存.
3. 生命周期不同.
(1)静态变量随着类的加载而加载, 随着类的消失而消失.
(2)成员变量随着对象的创建而存在, 随着对象的使用完毕而消失.
4. 调用方式不同.
(1)静态变量既可以通过 类名点的形式调用, 也可以通过 对象名点的形式调用.
(2)成员变量只能通过 对象名点 的形式调用.
Q43:构造方法能不能重载?
答:可以, 虽然构造方法没有返回值的数据类型, 但是方法重载和返回值的数据类型无关.
Q44:构造方法的特点是什么?
答:
1) 方法名和类名完全一致.
2) 没有明确的返回值, 连void也没有.
3) 没有明确的返回值, 但是可以有return.
Q45:静态代码块和构造代码块的区别是什么?
答:静态代码块中的内容是随着类的加载而加载, 且只加载一次.
构造代码块中定义的是所有构造方法的共性内容, 每个构造方法执行之前, 都会先执行一次构造代码块中的内容.
Q46:什么是继承?
答:当多个类中有很多共性内容时, 每次写很麻烦. 我们可以把这些共性内容抽取出来单独的放到一个类中, 然后让那多个类和这个类产生一个关系, 这个关系就是: 继承.
Q47:继承的好处和弊端分别是什么?
答:
好处:
1. 提高了代码的复用性, 扩展性和可维护性.
2. 让类与类之间产生了关系, 是多态的前提.
弊端:
类与类之间的耦合性增强了, 和”高内聚, 低耦合”这一开发原则相违背.
Q48:Java中继承的特点是什么?
答:类与类之间: 只能单继承, 不能多继承, 但是可以多层继承.
接口与接口之间: 既可以单继承, 也可以多继承.
Q49:this和super的区别是什么?
答:this表示当前对象的引用, 谁调用, this就代表谁.
super表示当前对象的父类的内存空间标识.
Q50:this()和super()可以同时出现在一个构造方法中吗?
答:不能, this()调用的是本类的空参构造, super()调用的是父类的空参构造, 它们都要求必须放在构造方法的第一行, 所以不能同时出现.
Q51:super关键字和this关键字在同一个构造方法中是否可以共存?
答:可以, 但是super()和this()在同一个构造方法中不能共存.
Q52:为什么每个构造方法的第一行都有默认的super()?
答:用于子类对象访问父类数据前, 对父类数据进行初始化.
Q53:为什么默认的super()都是空参构造, 而不是带参构造?
答: 因为所有的类都直接或间接继承自Object, Object类中只有一个空参构造.
Q54:子父类都有静态代码块, 构造代码块, 构造方法, 在测试类中创建子类对象, 那么这6者之间的执行顺序是什么?
答:父类静态代码块, 子类静态代码块, 父类构造代码块, 父类构造方法, 子类构造代码块, 子类构造方法.
Q55:什么是多态, 它的前提条件是什么?
答:同一个事物在不同时刻表现出来的不同形态, 状态就叫: 多态.
多态的前提条件有三个:
1. 要有继承或者实现关系.
2. 要有父类(父接口)引用指向子类对象.
3. 要有方法重写.
Q56:多态的好处和弊端分别是什么?
答:
好处: 提高了代码的可扩展性, 维护性.
弊端: 父类(父接口)引用不能直接使用子类的特有成员.
Q57:多态中的成员访问特点是什么?
答:非静态方法是编译看左, 运行看右. 其他(成员变量, 静态方法)都是编译和运行都看左. 原因是因为: 只有非静态方法才能有方法重写, 而其他都没有.
Q58:抽象类和抽象方法的特点分别是什么? 它们之间有什么关系?
答:抽象类的特点是: 不能实例化, 需要子类继承.
抽象方法的特点是: 没有方法体, 需要子类重写.
它们之间的关系是:
有抽象方法的类一定是抽象类, 但是抽象类中不一定有抽象方法.
Q59:abstract不能和那些关键字共存?
答:不能和private共存. 因为抽象方法要求子类必须重写, 而私有方法子类根本无法直接方法, 谈何重写.
不能和static共存. 因为抽象方法没有方法体, 而静态方法可以被类名点的形式调用, 假设可以共存, 则类名点的形式调用无方法体的方法没有意义, 所以他们不能共存.
不能和final共存. 抽象方法要求子类必须重写, 而final修饰的方法子类不能重写.
Q60:Java中类和接口之间的关系是什么?
答:类与类之间: 继承关系, 只能单继承, 不能多继承, 但是可以多层继承.
类与接口之间: 实现关系, 可以单实现, 也可以多实现, 还可以在继承一个类的同时, 实现多个接口.
接口与接口之间: 继承关系, 可以单继承, 也可以多继承.