Java高频面试题
Java基础
1.1面向对象和面向过程的区别
面向对象
面向对象比面向过程的性能低,但是面向对象有容易维护、容易复用、容易扩展,面向对象有封装、继承、多态特性,很容易写出低耦合的代码,使系统更加灵活,系统便于维护。
面向过程
面向过程的性能要高于面向对象,因为每次类调用时都要创建实例化,所以开销比较大,比较消耗资源,如果当性能是最重要的考虑因素的时候,比如单片机、嵌入式一般采用面向过程开发
1.2JAVA语言有哪些特点
1.简单易学
2.跨平台性
3.安全性
4.面向对象
5.可靠性
6.支持多线程
7.编译与解释并存
1.3JVM、JDK与JRE的通俗解答
1.3.1JVM
JVM使java运行字节码的虚拟机。JVM有针对不同系统的特点实现,目的是使用相同的字节码,他们会给出相等的结果
1.3.1.1什么是字节码?采用字节码的好处是什么
在Java中,JVM可以理解的代码叫做字节码(拓展名.class),它不面向任何处理器,只面向虚拟机。Java语言通过字节码的形式,在一定程度上解决了传统语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以字节码并不针对一种特定的机器,因此,Java程序不用重复编译便可在多种不同的操作系统的计算机上运行。
需要注意的是.calss到可执行的二进制机器码的过程中,JVM有两种方式:
一种是解释器,一种是JIT编译器。如果是热点程序会走JIT编译器,否则会走解释器
总结
Java虚拟机是运行字节码的虚拟机。JVM有针对不同系统的特定实现,目的是用相同的字节码,能得出相同的结果。也就是不同系统的JVM实现了Java语言的:“一次编译多次运行”的关键所在
1.3.2JDK与JRE
JDK是功能齐全的软件开发工具包,它拥有JRE所拥有的一切,还有编译器和工具。它能够创建和编译程序
JRE是Java运行时的环境,他是已编译Java程序所需的所有内容的集合,包括Java虚拟机(JVM),Java类库,java命令和其他的一些基础构建。但是,他不用于创建新程序。
1.4Java与C++的区别
同:都是面向对象的语言,支持封装继承多态
异:1. java是不提供指针操作内存,程序内存更加安全
2.Java的类是单继承的,C++可以实现多继承;虽然类不能多加载,但是接口时可以多加载的
3.Java有自动内存管理机制,不需要程序员手动释放无用内存
1.5字符型常量和字符串常量的区别
形式上:字符常量是单引号引起的一个字符;字符串常量是双引号的若干符号
含以上:字符常量相当于一个整型值(ASCII值),可以参加表达式运算;字符串常量代表一个地址值(该字符串在内存中存放的位置)
占内存大小:字符常量只占有两个字节(Java中);字符串常量占若干个字节
1.6构造器Constructor是否可被Override
构造器不能被Override(重写),但是可以被Overload(重载),所以你可以看到一个类中有多个构造函数的情况
1.7重写与重载的区别
重载是同一个方法能够根据输入数据的不同,做出不同处理
重写是当子类继承父类的相同方法,输出数据一样,但是要做出有区别与父类的相应处理时,你就要覆盖父类的方法
重载(两同一不同)
发生在同一个类中,方法名必须相同,参数列表(个数,参数类型,顺序)不同,与方法返回值,权限修饰符无关
重写
重写时发生在与运行期,是子类对父类的允许访问的方法的实现过程的重新编写
- 返回值类型、方法名、参数列表都必须相同
- 如果父类的方法修饰符为(private/static/final。子类不能重写该方法)
- 构造方法无法被重写
注意
巧计口诀:两同两小一大
子类的返回值类型要小于等于父类类型
子类方法声明抛出的异常类应比父类方法声明抛出的异常小或就是父类抛出的异常
子类的权限修饰符访问权限要大于父类权限修饰符访问权限
1.8面向对象:封装、继承、多态
1.8.1封装
将类的某些信息隐匿在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问
好处:1.只能通过规定的方法访问数据
2.隐藏该类的实例细节,方便修改和实现
A. 访问修饰符
private 本类
默认 本类 同包
protected 本类 同包 子类
public 本类 同包 子类 其他
B. Java中的内部类
内部类的定义就是在另外一个类里面的类。与之对应,包括内部类的类也就称为外部类
内部类的作用
- 内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类
- 内部类的方法可以直接访问外部类的所有数据,包括私有的数据
- 内部类所实现的功能使用外部类也可以实现,只是有时使用内部类更方便
内部类分类
- 成员内部类
- 方法内部类
- 静态内部类
- 匿名内部类
1.8.2继承
继承是类与类的一种关系,是一种“is a”的关系。比如狗继承动物,这里的动物类是狗类的父类或者基类,狗类是动物类的子类或者派生类
好处
子类拥有父类的所有属性与方法,但是由private修饰的属性子类是无法调用的,实现了代码的复用性
A.方法的重写
子类如果对于父类的方法不满意,认为不符合需求,我们可以自己编写所继承父类的方法,这种方式就成为代码的重写,当调用方法的时候会优先调用子类所重写的方法。
重写要注意,以下三个条件都是要保持一致的
- 方法名
- 返回值类型
- 参数列表