Java面试题
- 7.数据类型
- 8.switch
- 9.最有效率的方法计算 2 乘以 8
- 10.Math.round();
- 11.float f=3.4是否正确
- 12.short s1 = 1; s1 = s1 + 1有错吗,short s1 = 1; s1 += 1有错吗
- 13.Java语言采用Unicode编码标准,Unicode(标准码)
- 14.注释:有利于程序的修改、调试和交流
- 15.访问修饰
- 16.运算符
- 17.final的作用
- 18.final finally finalize区别
- 19.this关键字
- 20.super关键字
- 21.this与super的区别
- 22.static关键字
- 23.static应用场景
- 24.static注意事项
- 25.流程控制语句
- 26.跳出当前的多重嵌套循环
- 27.面向对象
- 32.类与接口
1.JVM、JRE和JDK的关系
JVM: 是Java虚拟机,Java程序需要运行在虚拟机上,不同的平台有自己的虚拟机,因此Java语言可以实现跨平台。
JRE: Java虚拟机和Java程序所需的核心类库,包括了jvm
JDK: 提供给Java开发人员使用的,其中包含了Java的开发工具,也包括了JRE
开发工具:编译工具(javac.exe),打包工具(jar.exe)等
2.什么是跨平台性?原理是?
跨平台性,是指java语言编写的程序,一次编译后,可以在多个系统平台上运行
3.Java语言特点
3.1简单易学
3.2面向对象(封装,继承,多态)
3.3平台无关性(Java虚拟机实现平台无关性)
3.4支持网络编程并且很方便(Java语言诞生本身就是为简化网络编程设计的)
3.5支持多线程(多线程机制使应用程序在同一时间并行执行多项任)
3.6健壮性(Java语言的强类型机制、异常处理、垃圾的自动收集等)
3.7安全性
4.什么是字节码?采用字节码的最大好处是什么
字节码: Java源代码经过虚拟机编译器编译后产生的文件(扩展为.class的文件),它不面向任何特定的处理器,只面向虚拟机。
采用字节码的好处: 效率高,可移植性
Java编译器和解释器:
Java源代码---->编译器---->jvm可执行的Java字节码(即虚拟指令)---->jvm---->jvm中解释器----->机器可执行的二进制机器码---->程序运行。
5.什么是Java程序的主类?应用程序和小程序的主类有何不同?
一个程序中可以有多个类,但只能有一个类是主类(包含main()方法的类)。
Java小程序中,主类是一个继承自系统类JApplet或Applet的子类。
应用程序的主类不一定要求是public类,但小程序的主类要求必须是public类。主类是Java程序执行的入口点。
6.Java应用程序与小程序之间有那些差别?
应用程序是从主线程启动(也就是main()方法)。applet小程序没有main方法,主要是嵌在浏览器页面上运行(调用init()线程或者run()来启动),嵌入浏览器这点跟flash的小游戏类似。
7.数据类型
Java有哪些数据类型
Java语言是强类型语言,对于每一种数据都定义了明确的具体的数据类型,在内存中分配了不同大小的内存空间。
分类
1.基本数据类型,2.引用数据类型
基本数据类型
数值型
整数类型(byte,short,int,long)
浮点类型(float,double)
字符型(char)
布尔型(boolean)
引用数据类型
类(class)
接口(interface)
数组([])
8.switch
Java 5 以前,switch(expr)中,expr 只能是 byte、short、char、int。
从 Java5 开始,Java 中引入了枚举类型,expr 也可以是 enum 类型。
从 Java 7 开始,expr 还可以是字符串(String),但是长整型(long)在目前所有的版本中都是不可以的。既是byte、short、char、int、string、enum
9.最有效率的方法计算 2 乘以 8
2 << 3(左移 3 位相当于乘以 2 的 3 次方,右移 3 位相当于除以 2 的 3 次方)
10.Math.round();
向上取整。11.5就取12,-3.5就取-3
11.float f=3.4是否正确
错误,float f =(float)3.4; 或者写成 float f =3.4F
12.short s1 = 1; s1 = s1 + 1有错吗,short s1 = 1; s1 += 1有错吗
1 是 int 类型,因此 s1+1 运算结果也是 int型,需要强制转换类型才能赋值给 short 型。
short s1 = 1; s1 += 1;可以正确编译,因为 s1+= 1;相当于 s1 = (short(s1 + 1);其中有隐含的强制类型转换。
13.Java语言采用Unicode编码标准,Unicode(标准码)
14.注释:有利于程序的修改、调试和交流
单行注释格式: // 注释文字
多行注释格式: /* 注释文字 /
文档注释格式:/* 注释文字 */
15.访问修饰
public, protected,以及不写(默认),private,四种
修饰符来保护对类、变量、方法和构造方法的访问
private : 私有化,在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类)
default: (即缺省,什么也不写,不使用任何关键字): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。
protected : 对同一包内的类和所有子类可见。使用对象:变量、方法。 注意:不能修饰类(外部类)。
public : 对所有类可见。使用对象:类、接口、变量、方法
16.运算符
&和&&的区别
&运算符有两种用法:(1)按位与;(2)逻辑与。
&&运算符是短路与运算。逻辑与跟短路与的差别是非常巨大的,虽然二者都要求运算符左右两端的布尔值都是true 整个表达式的值才是 true。&&之所以称为短路运算,是因为如果&&左边的表达式的值是 false,右边的表达式会被直接短路掉,不会进行运算。
注意:逻辑或运算符(|)和短路或运算符(||)的差别也是如此。
17.final的作用
final修饰的类不可以被继承
final修饰的方法不可以被重写
final修饰的变量不可以被改变,被final修饰不可变的是变量的引用,而不是引用指向的内容,引用指向的内容是可以改变的
18.final finally finalize区别
final可以修饰类、变量、方法,修饰类表示该类不能被继承、修饰方法表示该方法不能被重写、修饰变量表示该变量是一个常量不能被重新赋值。
finally一般作用在try-catch代码块中,在处理异常的时候,通常我们将一定要执行的代码方法finally代码块中,表示不管是否出现异常,该代码块都会执行,一般用来存放一些关闭资源的代码。
finalize是一个方法,属于Object类的一个方法,而Object类是所有类的父类,该方法一般由垃圾回收器来调用,当我们调用System.gc() 方法的时候,由垃圾回收器调用finalize(),回收垃圾,一个对象是否可回收的最后判断。
19.this关键字
this代表当前对象本身,指向对象本身的一个指针。
20.super关键字
super是指向自己超(父)类对象的一个指针,这个超类是离自己最近的一个父类。
21.this与super的区别
super()和this()均需放在构造方法内第一行。
super()在子类中调用父类的构造方法,this()在本类内调用本类的其它构造方法。
用this调用一个构造器,但却不能调用两个。
this和super不能同时出现在一个构造函数里面,因为this必然会调用其它的构造函数,其它的构造函数必然也会有super语句的存在,所以在同一个构造函数里面有相同的语句,就失去了语句的意义,编译器也不会通过。
this()和super()都指的是对象,均不可以在static环境中使用。包括:static变量,static方法,static语句块。
this:它代表当前对象名(在程序中易产生二义性之处,应使用this来指明当前对象;如果函数的形参与类中的成员数据同名,这时需用this来指明成员变量名)
super: 它引用当前对象的直接父类中的成员(用来访问直接父类中被隐藏的父类中成员数据或函数,基类与派生类中有相同成员定义时如:super.变量名 super.成员函数据名(实参)
22.static关键字
在该类被第一次加载的时候,就会加载被static修饰的部分
被类的实例对象所共享
static修饰的变量或者方法是优先于对象存在的,也就是说当一个类加载完毕之后,即便没有创建对象,也可以去访问。
23.static应用场景
当某个成员变量是被所有对象所共享的时候,那么这个成员变量就应该定义为静态变量。
24.static注意事项
1、静态只能访问静态。
2、非静态既可以访问非静态的,也可以访问静态的。
25.流程控制语句
break ,continue ,return
break 结束当前的循环体
continue 跳出本次循环,继续执行下次循环(结束正在执行的循环 进入下一个循环条件)
return 结束当前的方法,直接返回
26.跳出当前的多重嵌套循环
在外面的循环语句前定义一个标号,然后在里层循环体的代码中使用带有标号的break 语句,即可跳出外层循环
public static void main(String[] args) {
ok:
for (int i = 0; i < 100; i++) {
for (int j = 0; j < 100; j++) {
System.out.println("i=" + i + ",j=" + j);
if (j == 40) {
break ok;
}
}
}
}
27.面向对象
28.面向对象和面向过程的区别
面向过程:
优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发,性能是最重要的因素。
缺点:没有面向对象易维护、易复用、易扩展
面向对象:
优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护
缺点:性能比面向过程低
面向过程是具体化的,流程化的,解决一个问题,你需要一步一步的分析,一步一步的实现。
面向对象是模型化的,你只需抽象出一个类,这是一个封闭的盒子,在这里你拥有数据也拥有解决问题的方法。需要什么功能直接使用就可以了,不必去一步一步的实现,至于这个功能是如何实现的,管我们什么事?我们会用就可以了。
面向对象的底层其实还是面向过程,把面向过程抽象成类,然后封装,方便我们使用的就是面向对象了。
29.面向对象三大特性
封装,继承,多态
封装: 封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法
继承: 继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。通过使用继承我们能够非常方便地复用以前的代码。
-
子类拥有父类非 private 的属性和方法。
-
子类可以拥有自己属性和方法,即子类可以对父类进行扩展。
-
子类可以用自己的方式实现父类的方法。
多态: 就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定(一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定)
- 在Java中有两种形式可以实现多态:继承(多个子类对同一方法的重写)和接口(实现接口并覆盖接口中同一方法)
30.多态的实现
实现多态有三个必要条件:继承、重写、向上转型。
继承: 在多态中必须存在有继承关系的子类和父类。
重写: 子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。
向上转型: 在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用父类的方法和子类的方法。
只有满足了上述三个条件,我们才能够在同一个继承结构中使用统一的逻辑实现代码处理不同的对象,从而达到执行不同的行为。
对于Java而言,它多态的实现机制遵循一个原则:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。
31.面向对象五大基本原则
-
单一职责原则SRP(Single Responsibility Principle)
类的功能要单一,不能包罗万象,跟杂货铺似的。 -
开放封闭原则OCP(Open-Close Principle)
一个模块对于拓展是开放的,对于修改是封闭的,想要增加功能热烈欢迎,想要修改,哼,一万个不乐意。 -
里式替换原则LSP(the Liskov Substitution Principle LSP)
子类可以替换父类出现在父类能够出现的任何地方。比如你能代表你爸去你姥姥家干活 -
依赖倒置原则DIP(the Dependency Inversion Principle DIP)
高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。抽象不应该依赖于具体实现,具体实现应该依赖于抽象。就是你出国要说你是中国人,而不能说你是哪个村子的。比如说中国人是抽象的,下面有具体的xx省,xx市,xx县。你要依赖的抽象是中国人,而不是你是xx村的。 -
接口分离原则ISP(the Interface Segregation Principle ISP)
设计时采用多个与特定客户类有关的接口比采用一个通用的接口要好。就比如一个手机拥有打电话,看视频,玩游戏等功能,把这几个功能拆分成不同的接口,比在一个接口里要好的多。
32.类与接口
抽象类和接口的对比
抽象类是用来捕捉子类的通用特性。接口是抽象方法的集合。
相同点
- 接口和抽象类都不能实例化
- 都位于继承的顶端,用于被其他实现或继承
- 都包含抽象方法,其子类都必须覆写这些抽象方法
不同点
Java8中接口中引入默认方法和静态方法,来减少抽象类和接口之间的差异。我们可以为接口提供默认实现的方法,并且不用强制子类来实现它。
通常是优先选用接口,尽量少用抽象类。
需要定义子类的行为,又要为子类提供通用的功能的时候选抽象类
33.普通类和抽象类有哪些区别?
普通类不能包含抽象方法,抽象类可以包含抽象方法。
抽象类不能直接实例化,普通类可以直接实例化。
抽象类不能使用 final 修饰,定义抽象类就是让其他类继承的,如果定义为 final 该类就不能被继承
34.创建一个对象用什么new关键字
new创建对象实例(对象实例在堆内存中),
35.对象实例与对象引用有何不同?
对象引用指向对象实例(对象引用存放在栈内存中)。一个对象引用可以指向0个或1个对象;一个对象可以有n个引用指向它