面向对象
- 模块化开发
- 复用性强
- 可靠性,灵活性
- 可读性
面向对象的特征
- 封装:隐藏内部属性,提高可维护性
- 继承:提高代码重用性,不修改类的情况下给类添加新特性
- 多态:接口的多种不同的实现方式就是多态。允许子类类型的指针赋值给父类类型,把不同子类对象都当作父类来看
- 抽象:把类的行为和实现分开
面向对象和面向过程
- 面向过程:性能高,不用实例化类。Linux,嵌入式一般用面向过程
- 面向对象:方便维护,复用性高,容易扩展。有封装继承多态的特性,可以设计出耦合度低的系统,更灵活
重写和重载
- 重载 体现编译多态性,同名方法有不同的参数就是重载
- 同一个类的不同方法
- 参数不同
- 返回值可以不同
- 权限修饰符可以不同
- 异常可以不同
- 方法名必须相同
- 重载是同一个类中方法之间的关系,是水平关系 - 重写 体现运行多态性,子类父类之间
- 子类对父类方法的重写
- 方法名,参数,返回值必须和父类一样
- 访问修饰符限制大于父类的方法
- 子类抛出异常不能大于父类的异常
- 重写是子类和父类的关系,是从上到下的垂直关系
JDK JRE JVM
- JDK,Java开发工具包,包含了编写Java必要的编译和运行工具,包含了JRE
- JRE,Java运行环境,包括虚拟机和丰富的系统类库,封装功能类,提高开发效率
- JVM,提供字节码文件的运行环境
Java跨平台
- Java源文件被编译成字节码文件
- Java虚拟机(JVM)是跨平台的,所以字节码文件是跨平台的
Java和C++
- 面向对象语言
- Java没有指针,内存更安全
- Java的类单继承,C++多继承
- Java自动管理内存,不需要手动释放
字节码是什么
Java提供虚拟机的概念,在机器和编译程序之间加入了一个抽象的虚拟机器,虚拟机在任何平台都能提供编译程序一个共同的接口
能让虚拟机理解的代码就是字节码
每个平台的解释器不同,但是虚拟机相同。虚拟机把字节码解释给解释器,解释器再翻译成特定机器上的代码,在特定机器运行。体现了Java编译与解释并存的特点
值传递和引用传递
- 值传递,基本类型的变量,传递的是该变量的一个副本,改变副本不影响变量
- 引用传递,对象型变量,传递的是对象地址的副本,不是对象本身
Java内传递是值传递,对象的传递是引用传递
String、StringBuffer、StringBuilder 的区别
- String:只读字符串,不可更改
- StringBuffer:可以修改,被synchronized修饰
- StringBuilder:可以修改,单线程使用,跟StringBuffer一模一样,效率比StringBuffer高
自动拆箱自动装箱
基本类型和引用类型之间的转换
equals和==的区别
基本类型通过==判断,比较两个对象的地址是否相等
引用类型通过equals判断,比较两个对象内容是否相等
Java栈内存和堆内存
栈
- 存取快,仅次于寄存器
- 数据大小和生成周期固定
- 栈内的数据可以共享
- 基本数据类型,指令代码都保存在栈中
- 先进后出
堆 - 存取慢
- 生存期不固定
- 堆的数据不可以共享
- 保存对象实例,每new一次都会创建新对象,因为堆不共享
Object a=null; 只在栈中分配内存
new Object(); 只在堆中分配空间
Object a=new Object(); 在堆中分配空间,指向栈的地址
堆是栈的子集
和C++不同,Java自动管理堆和栈的内存回收问题,GC会根据栈保存的地址定期扫描堆,优化内存,没有对应地址的直接被清空(refresh),这就是Java的垃圾回收机制
为什么要重写hashCode()方法
HashSet和equals方法判断对象是否相同是通过调用hashCode方法,不重写的话,默认创建对象的hash值不同,即使我创建的对象属性一模一样,HashSet也没办法正常去重,所以需要重写hashCode方法
阿里的开发手册里也规定了,如果自定义对象作为Map的键就必须重写equals和hashCode方法
final,finally,finalize区别
- final是修饰符,声明属性方法和类,属性不可变,方法不能覆盖,类不能继承
- finally是异常处理语句,表示总是执行
- finalize是一个方法,提供垃圾收集器的资源回收
抽象类和接口的区别
- 接口的所有方法都是抽象的,抽象类里有抽象方法和非抽象方法
- 类可以实现很多接口,但是只能继承一个抽象类
- 接口中所有变量都是常量,抽象类可以包含常量和普通变量
- 接口是绝对抽象的,抽象类可以通过静态方法return实例化
IO
IO操作就是Java进行输入和输出操作,分为字节流和字符流
Java序列化
把Java对象转化为字节序列的过程叫序列化
把字节序列恢复成Java对象的过程叫反序列化
error和exception的区别
- Error,系统级的错误,Java运行环境错误或者硬件问题
- 比如内存不足
- 程序修不了,虚拟机抛出的问题 - Exception,需要程序处理的异常
- RuntimeException(运行时异常),程序不能恢复的异常,错误的操作导致的异常,编译器不检查这些异常
- CheckedException(受检查异常),程序可以处理的异常, 程序可以修复
反射的实现
-
构造一个类的对象
-
判断类的成员变量和方法
-
调用对象的方法
-
生成动态代理
-
Spring IoC容器通过反射创建对象,注入依赖属性
-
Spring MVC的请求调用对应方法
什么是注解
元数据,描述数据的数据就是注解,添加注解有助于程序的阅读
创建对象
- new一个对象
- 通过反射解析一个类的对象
- 通过clone创建对象
- 使用反序列化创建对象