Java面试题——Java基础
1.面向对象和面向过程的区别:
面向过程:就是分析出解决问题的步骤,然后用函数把这些步骤一步一步实现,使用的时候依次调用即可;
- 优点:是性能比面向对象高,因为类的调用需要实例化,开销比较大,比较消耗资源;
- 缺点:是没有面向对象易维护、易复用、易扩展。
面向对象:是把构成问题的事务分解为各个对象,建立对象的目的不是为了完成一个步骤,而是为了描述某个事务在整个解决问题的步骤中的行为。
- 优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态等特性,可以设计出低耦合的系统,是系统更加灵活、更加易于维护;
- 缺点:性能比面向过程低。
2.java语言有哪些特点:
1.简单易学;
2.面向对象;
3.平台无关性(跨平台性);
4.可靠性;
5.安全性;
6.支持多线程;
7.支持网络编程并且很方便;
8.编译与解释并存。
3.面向对象的特性:
抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。
继承:继承是从已有类得到继承信息创建新类的过程。提供继承的类叫父类(超类、基类)、得到继承的类叫子类(派生类)。
封装:通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。可以说,封装就是隐藏一切可隐藏的东西,只向外界提供最简单的编程接口(可以想想普通洗衣机和全自动洗衣机的差别,明显全自动洗衣机封装更好因此操作起来更简单;我们现在使用的智能手机也是封装得足够好的,因为几个按键就搞定了所有的事情)。
多态:多态性是指允许不同子类型的对象对同一消息作出不同的响应。简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情。
4.jvm,jre,jdk的区别:
- JVM :英文名称(Java Virtual Machine),就是我们耳熟能详的运行Java字节码的虚拟机。它只认识 xxx.class 这种类型的文件,它能够将 class 文件中的字节码指令进行识别并调用操作系统向上的 API 完成动作。所以说,jvm 是 Java 能够跨平台的核心。
- JRE :英文名称(Java Runtime Environment),我们叫它:Java 运行时环境。它主要包含两个部分,jvm 的标准实现和 Java 的一些基本类库。它相对于 jvm 来说,多出来的是一部分的 Java 类库。
- JDK :英文名称(Java Development Kit),Java 开发工具包。jdk 是整个 Java 开发的核心,它集成了 jre 和一些好用的小工具。例如:javac.exe,java.exe,jar.exe 等。
显然,这三者的关系是:一层层的嵌套关系。JDK>JRE>JVM。
5.基本语法:
- 大小写敏感:Java 是大小写敏感的,这就意味着标识符 Hello 与 hello 是不同的。
- 类名:对于所有的类来说,类名的首字母应该大写。如果类名由若干单词组成,那么每个单词的首字母应该大写,例如 MyFirstJavaClass 。
- 方法名:所有的方法名都应该以小写字母开头。如果方法名含有若干单词,则后面的每个单词首字母大写。
- 源文件名:源文件名必须和类名相同。当保存文件的时候,你应该使用类名作为文件名保存(切记 Java 是大小写敏感的),文件名的后缀为 .java。(如果文件名和类名不相同则会导致编译错误)。
- 主方法入口:所有的 Java 程序由 public static void main(String[] args) 方法开始执行。
6.java标识符:
- 所有的标识符都应该以字母(A-Z 或者 a-z),美元符($)、或者下划线(_)开始
- 首字符之后可以是字母(A-Z 或者 a-z),美元符($)、下划线(_)或数字的任何字符组合
- 关键字不能用作标识符
- 标识符是大小写敏感的
- 合法标识符举例:age、$salary、_value、__1_value
- 非法标识符举例:123abc、-salary
7.java的修饰符:
像其他语言一样,Java可以使用修饰符来修饰类中方法和属性。主要有两类修饰符:
- 访问控制修饰符 : default, public , protected, private
- 非访问控制修饰符 : final, abstract, static, synchronized
8.Java和C++的区别:
- 都是面向对象的语言,都支持封装,继承,多态;
- Java不提供指针来直接访问内存,程序内存更加安全;
- Java的类是单继承的,C++支持多重继承;虽然Java的类不可以多继承,但是接口可以多继承;
- Java有自动内存管理机制,不需要程序员手动释放无用内存。
9.字符型常量和字符串常量的区别:
- 形式上:字符常量是单引号引起的一个字符,字符串常量是双引号引起来的若干个字符;
- 含义上:字符常量相当于一个整形值(ASCII值),可以参与表达式运算,字符串常量代表一个地址值(该字符串在内存中存放位置);
- 占内存大小:字符常量占两个字节,字符串常量占若干个字节(至少一个字符结束标志)。
10.java中的基本数据类型:
11.一个类可以包含以下类型变量:
-
局部变量:在方法、构造方法或者语句块中定义的变量被称为局部变量。变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。
-
成员变量:成员变量是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。
a. 类变量:类变量也声明在类中,方法体之外,但必须声明为 static 类型。
b. 实例变量:实例变量声明在一个类中,但在方法、构造方法和语句块之外。
12.重载和重写的区别:
重载(overload):发生在一个类中,方法名必须相同,参数列表不同,个数不同,顺序不同,方法的返回值和访问修饰符可以不同,发生在编译时;
重写(override):发生在父子类中,方法名、参数列表必须相同,返回值范围小于等于父类,抛出异常的范围小于等于父类,访问修饰符大于等于父类;如果父类方法的访问修饰是private,则子类不能重写该方法。
13.构造器Constructor是否可被override:
override的意思是重写,重写是子类对父类中的方法进行重写。父类中的私有属性和构造方法不能被子类继承,因此构造器不能被重写,但可以overload,会看到一个类中有多个构造函数的情况,例如,有参构造和无参构造。
14.装箱和拆箱:
自动装箱是java编译器在基本数据类型和对应的对象包装类型之间的yige转换。比如,把int转换成Interger等。反之就是自动拆箱。
装箱:基本类型转引用类型;拆箱:引用类型转基本类型。
原始类型:boolean, char, byte, short, int, long, float, double
封装类型:Boolean, Character, Byte, Short, Integer, Long, Float, Double
15.java基本类型和引用类型的区别:
基本类型保存原始值,引用类型保存的是引用值(引用值就是值对象在堆中所处的位置/地址)
16.Java 中是否可以覆盖(override)一个 private 或者是 static 的方法?
- Java 中 static 方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而 static 方法是编译时静态绑定的。static 方法跟类的任何实例都不相关,所以概念上不适用。
- java 中也不可以覆盖 private 的方法,因为 private 修饰的变量和方法只能在当前类中使用,如果是其他的类继承当前类是不能访问到 private 变量或方法的,当然也不能覆盖。
17.==和equals的区别:
==对基本类型和引用类型的作用效果:
- 基本类型:比较的是值是否相同;
- 引用类型:比较的是引用是否相同;
equalsd的解读:
equals 本质上就是 ==,默认情况引用比较,只不过 String 和 Integer 等重写了 equals 方法,所以一般情况下比较的是值是否相等。
18.final在java中的作用:
- final 修饰的类叫最终类,该类不能被继承。
- final 修饰的方法不能被重写。
- final 修饰的变量叫常量,常量必须初始化,初始化之后值就不能被修改。
19.接口和抽象类的区别是什么:
1、抽象类和接口都不能直接实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象;
2、抽象类要被子类继承,接口要被类实现;
3、接口只能做方法申明,抽象类中可以做方法申明,也可以做方法实现;
4、接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量;
5、抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽象类。同样,一个实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类;
6、抽象方法只能申明,不能实现,接口是设计的结果 ,抽象类是重构的结果;
7、抽象类里可以没有抽象方法;
8、如果一个类里有抽象方法,那么这个类只能是抽象类;
9、抽象方法要被实现,所以不能是静态的,也不能是私有的;
10、接口可继承接口,并可多继承接口,但类只能单根继承。
20.成员变量和局部变量的区别有哪些:
- 从语法形式上,成员变量是属于类的,而局部变量是在方法中定义的变量或是方法的参数;成员变量可以被访问修饰符private, public等修饰,而局部变量不能被访问修饰符和static所修饰,但都可以被final修饰;
- 从变量在内存中的存储方式来看,成员变量是对象的一部分,而对象存储在堆内存中,局部变量存储在栈内存;
- 从生命周期来看,成员变量是对象的一部分,它随着对象的创建而存在,而局部变量随着方法调用而自动消失;
- 从初始值来说,成员变量如果没有被赋初值,则会自动以类型的默认值而赋值(一种情况例外被 final 修饰的成员变量也必须显示地赋值);而局部变量则不会自动赋值。