Java 基础总结

2019/01/06 Java

Java 基础总结

JVM 层面看 .java 文件到最终执行流程

step1: 编译器把 .java 文件编译成 字节码(二进制)
step2: 虚拟机把描述类的数据从 Class 文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的 Java 类型
(加载-》验证-〉准备-》解析-〉初始化-》使用-〉拆卸)
step3: 虚拟机执行字节码

ClassLoader 中与加载类相关的方法

getParent()

返回该类加载器的父类加载器。

loadClass(String name)

加载名称为 name 的类,返回的结果是 java.lang.Class 类的实例。

findClass(String name)

查找名称为 name 的类,返回的结果是 java.lang.Class 类的实例。

findLoadedClass(String name)

查找名称为 name 的已经被加载过的类,返回的结果是 java.lang.Class 类的实例。

defineClass(String name, byte[] b, int off, int len)

把字节数组 b 中的内容转换成 Java 类,返回的结果是 java.lang.Class 类的实例。这个方法被声明为 final 的。

resolveClass(Class<?> c)

链接指定的 Java 类。

Java 反射提供哪几种功能

  • 方法
  • 执行方法
  • 注解
  • 数组
  • 属性(字段)
  • 构造器

Java static final

  • static final 和 final static 没有区别,一般在 static 写在前面
final
  • final 关键字可以用于成员变量,局部变量,方法以及类。
  • final 成员变量必须在声明的时候初始化或者在构造器中初始化,否则就会编译错误。
  • 不能够对 final 变量再次赋值。
  • 局部变量必须在声明时赋值。
  • 在匿名类中所有的变量都必须是 final 变量
  • final 方法不能被重写
  • final 类不能被继承

接口和抽象类区别

接口

  • 接口是对行为的抽象,他是抽象方法的集合 (所以说接口方法本来就是抽象方法)
  • 接口实现使用implements关键字
  • Java 8 之后,接口也可以通过关键字 default 有默认实现
  • 接口的修饰符只能是 public
  • 接口只能继承其他接口
  • 接口可以多继承而类不能多继承

抽象类

  • 抽象类不能被实例化
  • 抽象类的实现是继承(extends)
  • 抽象类除了不可以被实例化之外,跟类基本没什么区别
  • 抽象方法的修饰符只能是 public protected
  • 抽象方法可以继承和实现其他接口或者抽象类

实际应用中接口和抽象类的选择

  • 如果一个类不需要实例化,可以优先使用抽象类。比如 Spring 的 BeanUtils 就是一个抽象类,里面的所有方法都是 static,而且提供默认实现(因为抽象类和类,除了能不能被实例化之外,其他没有什么区别);
  • 如果,你想多重继承,那么必须使用接口来实现。

instanceof

判断左边对象是否是右边对象的实例,如果是的话,就返回 true。否的话就返回 false。

范型 extends 和 super

Search

    Table of Contents