方法

  • 方法可以让外部代码安全地访问实例字段;
  • 方法是一组执行语句,并且可以执行任意逻辑;
  • 方法内部遇到return时返回,void表示不返回任何值(注意和返回null不同);
  • 外部代码通过public方法操作实例,内部代码可以调用private方法;
  • 理解方法的参数绑定。

    构造方法

  • 实例在创建时通过new操作符会调用其对应的构造方法,构造方法用于初始化实例;

  • 没有定义构造方法时,编译器会自动创建一个默认的无参数构造方法;
  • 可以定义多个构造方法,编译器根据参数自动判断;
  • 可以在一个构造方法内部调用另一个构造方法,便于代码复用。

    方法重载

  • 方法重载是指多个方法的方法名相同,但各自的参数不同;

  • 重载方法应该完成类似的功能,参考String的indexOf();
  • 重载方法返回值类型应该相同。

    继承

  • 继承是面向对象编程的一种强大的代码复用方式;

  • Java只允许单继承,所有类最终的根类是Object;
  • protected允许子类访问父类的字段和方法;
  • 子类的构造方法可以通过super()调用父类的构造方法;
  • 可以安全地向上转型为更抽象的类型;
  • 可以强制向下转型,最好借助instanceof判断;
  • 子类和父类的关系是is,has关系不能用继承

    多态

  • 子类可以覆写父类的方法(Override),覆写在子类中改变了父类方法的行为;

  • Java的方法调用总是作用于运行期对象的实际类型,这种行为称为多态;
  • final修饰符有多种作用:

    • final修饰的方法可以阻止被覆写;
    • final修饰的class可以阻止被继承;
    • final修饰的field必须在创建对象时初始化,随后不可修改。

      抽象类

  • 通过abstract定义的方法是抽象方法,它只有定义,没有实现。抽象方法定义了子类必须实现的接口规范;

  • 定义了抽象方法的class必须被定义为抽象类,从抽象类继承的子类必须实现抽象方法;
  • 如果不实现抽象方法,则该子类仍是一个抽象类;
  • 面向抽象编程使得调用者只关心抽象方法的定义,不关心子类的具体实现。

    接口

  • Java的接口(interface)定义了纯抽象规范,一个类可以实现多个接口;

  • 接口也是数据类型,适用于向上转型和向下转型;
  • 接口的所有方法都是抽象方法,接口不能定义实例字段;
  • 接口可以定义default方法(JDK>=1.8)。

    静态字段

  • 静态字段属于所有实例“共享”的字段,实际上是属于class的字段;

  • 调用静态方法不需要实例,无法访问this,但可以访问静态字段和其他静态方法;
  • 静态方法常用于工具类和辅助方法。

  • Java内建的package机制是为了避免class命名冲突;

  • JDK的核心类使用java.lang包,编译器会自动导入;
  • JDK的其它常用类定义在java.util.,java.math.,java.text.*
  • 包名推荐使用倒置的域名,例如org.apache。

    作用域

  • Java内建的访问权限包括public、protected、private和package权限;

  • Java在方法内部定义的变量是局部变量,局部变量的作用域从变量声明开始,到一个块结束;
  • final修饰符不是访问权限,它可以修饰class、field和method;
  • 一个.java文件只能包含一个public类,但可以包含多个非public类。

    内部类

    Java的内部类可分为Inner Class、Anonymous Class和Static Nested Class三种:

  • Inner Class和Anonymous Class本质上是相同的,都必须依附于Outer Class的实例,即隐含地持有Outer.this实例,并拥有Outer Class的private访问权限;

  • Static Nested Class是独立类,但拥有Outer Class的private访问权限。

    classpath和jar

  • JVM通过环境变量classpath决定搜索class的路径和顺序;

  • 不推荐设置系统环境变量classpath,始终建议通过-cp命令传入;
  • jar包相当于目录,可以包含很多.class文件,方便下载和使用;
  • MANIFEST.MF文件可以提供jar包的信息,如Main-Class,这样可以直接运行jar包。

    模块

  • Java 9引入的模块目的是为了管理依赖;

  • 使用模块可以按需打包JRE;
  • 使用模块对类的访问权限有了进一步限制。