01 面向对象的特征

  1. 封装:隐藏部分对象的属性和实现细节,以不同的访问级别来保护对象内部的数据,防止外部程序的不当访问,对外提供公开的接口。【私有的属性,共有的方法】
  2. 继承:子类自动共享父类数据和方法。
  3. 多态:对于同一个行为,不同的子类对象具有不同的表现形式。同一个事件发生在不同的对象上会产生不同的结果。
    编译时类型和运行时类型不一致
    【举例:Person类拥有task方法 Student和Teacher继承 其中学生的任务的学习 老师的任务的教学】

封装:私有的属性 共有的方法

继承:子类共享父类

多态:不同子对象对同一行为有不同表现形式

02 &和&&的区别?

都是逻辑与 &&有短路性 &一般作为 按位与运算符

重点说短路和按位与

03 String 是 Java 基本数据类型吗?可以被继承吗?

String 类使用 final 修饰,无法被继承

不是。Java 中的基本数据类型只有8个:byte、short、int、long、float、double、char、boolean;除了基本类型(primitive type),剩下的都是引用类型(reference type)。

基本数据类型:数据直接存储在栈上

引用数据类型区别:数据存储在堆上,栈上只存储引用地址

String类不可继承 final修饰

基本数据类型8个

基本数据类型是放在栈上

引用数据类型的值放在堆上,栈只保存引用地址

03 浅谈JDK、JRE、JVM区别与联系

JDK(Java Development Kit) 是 Java 语言的软件开发工具包(SDK)。在JDK的安装目录下有一个jre目录,里面有两个文件夹bin和lib,在这里可以认为bin里的就是JVM(Java Virtual Machine),lib中则是JVM工作所需要的类库,而JVM和 lib合起来就称为JRE(Java Runtime Environment,Java运行环境)。

JVM不能单独搞定class的执行,解释class的时候JVM需要调用解释所需要的类库lib。在JDK下面的的jre目录里面有两个文件夹bin和lib,在这里可以认为bin里的就是jvm,lib中则是jvm工作所需要的类库,而jvm和 lib和起来就称为jre。JVM+Lib=JRE。总体来说就是,我们利用JDK(调用JAVA API)开发了属于我们自己的JAVA程序后,通过JDK中的编译程序(javac)将我们的文本java文件编译成JAVA字节码,在JRE上运行这些JAVA字节码,JVM解析这些字节码,映射到CPU指令集或OS的系统调用。

JDK 开发环境

JRE 运行环境

JVM 虚拟机

04 String和StringBuilder、StringBuffer的区别?

String:String 的值被创建后不能修改,任何对 String 的修改都会引发新的 String 对象的生成。

StringBuffer:跟 String 类似,但是值可以被修改,使用 synchronized 来保证线程安全。

StringBuilder:StringBuffer 的非线程安全版本,没有使用 synchronized,具有更高的性能,推荐优先使用。

String不可直接改变值,只要改变值本质上是创建了一个新的对象

StringBuilder 可以改变值 线程不安全

05 重载(Overload)和重写(Override)的区别?

方法的重载和重写都是实现多态的方式,区别在于重载实现的是编译时的多态性,而重写实现的是运行时的多态性。

重载:一个类中有多个同名的方法,但是具有有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)。

重写:发生在子类与父类之间,子类对父类的方法进行重写,参数都不能改变,返回值类型可以不相同,但是必须是父类返回值的派生类。即外壳不变,核心重写!重写的好处在于子类可以根据需要,定义特定于自己的行为。

重载 方法同名不同参

重写 子类重写父类,只能是返回值不一样,其他的保持一致

05 抽象类(abstract class)和接口(interface)有什么区别?

普通类像亲爹 ,他有啥都是你的。

抽象类像叔伯,有一部分会给你,还能指导你做事的方法。

接口像干爹,可以给你指引方法,但是做成啥样得你自己努力实现。

抽象类更像普通类 接口次之

抽象类不清楚自己能做什么不能做什么 接口是什么都不做 只提供思想(方法)

06 Error 和 Exception 有什么区别?

Error 和 Exception 都是 Throwable 的子类

Error 表示系统级的错误和程序不必处理的异常,是恢复不是不可能但很困难的情况下的一种严重问题,比如内存溢出,不可能指望程序能处理这样的情况。

Exception 表示需要捕捉或者需要程序进行处理的异常,是一种设计或实现问题,也就是说,它表示如果程序运行正常,从不会发生的情况。

error表示最高级的错误,程序没办法处理,而且一定会终止程序的运行。

exception次之,分为系统异常和普通异常

java 为系统异常和普通异常提供了不同的解决方案,编译器强制普通异常必须 try..catch 处理或用 throws 声明继续抛给上层调用方法处理,所以普通异常也称为 checked 异常,而系统异常可以处理也可以不处理,所以,编译器不强制用 try..catch 处理或用 throws 声明,所以系统异常也称为 unchecked 异常

07 ArrayList 和 Vector 的区别

动态 索引 有序 实现了List接口 List接口继承了Collection接口

Vector 线程安全 ArrayList不是

08 ArrayList 和 LinkedList 的区别

ArrayList 底层基于动态数组实现,LinkedList 底层基于链表实现

索引 ArrayList > LinkedList

随机插入和删除 ArrayList < LinkedList

顺序插入和删除 ArrayList > LinkedList

09 HashMap 和Hashtable 的区别

HashMap 允许 key 和 value 为 null,Hashtable 不允许。

HashMap 是非线程安全的,Hashtable是线程安全的。

HashMap 去掉了 Hashtable 中的 contains 方法。

10 编译和运行的区别

编译时类型指在声明对象时所采用的类型

运行时类型指为对象赋值时所采用的类型

1.编译就是将java代码交给编译器进行语法检查,如果没有错误就生成.class文件

2.运行就是将字节码文件(.class)交给java虚拟机执行,如果没有逻辑错误,就成功出现结果。

编译期和运行期内存的分配

1.编译期仅仅知道内存分配的位置和大小,不做具体的分配操作

2.运行期确定真正的分配,确定分配的大小以及位置

常见的错误

1.编译错误是常见的语法错误:缺少分号,大小写

2.运行错误是逻辑错误:空指针异常,越界访问,除数为0等

已检查的异常是被编译器在编译时候已经检查过的异常,这些异常需要在try/catch块中处理的异常。

编译时:重载、泛型(类型检测) List();

运行时:重写

11 什么是Java反射

Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;

对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性。

通过对象调用 getClass() 方法
直接通过 类名.class 的方式
通过 Class 对象的 forName() 静态方法来获取

好看请赞,养成习惯 :) ,作者:靠谱杨​

关于笔者:我可能不是天才,但我会努力成为人才。

更多日常分享尽在我的VX公众号:小杨的挨踢IT生活

【Java基础知识】东软面试(一面)_java