方法
- 方法可以让外部代码安全地访问实例字段;
- 方法是一组执行语句,并且可以执行任意逻辑;
- 方法内部遇到return时返回,void表示不返回任何值(注意和返回null不同);
- 外部代码通过public方法操作实例,内部代码可以调用private方法;
-
构造方法
实例在创建时通过new操作符会调用其对应的构造方法,构造方法用于初始化实例;
- 没有定义构造方法时,编译器会自动创建一个默认的无参数构造方法;
- 可以定义多个构造方法,编译器根据参数自动判断;
-
方法重载
方法重载是指多个方法的方法名相同,但各自的参数不同;
- 重载方法应该完成类似的功能,参考String的indexOf();
-
继承
继承是面向对象编程的一种强大的代码复用方式;
- Java只允许单继承,所有类最终的根类是Object;
- protected允许子类访问父类的字段和方法;
- 子类的构造方法可以通过super()调用父类的构造方法;
- 可以安全地向上转型为更抽象的类型;
- 可以强制向下转型,最好借助instanceof判断;
-
多态
子类可以覆写父类的方法(Override),覆写在子类中改变了父类方法的行为;
- Java的方法调用总是作用于运行期对象的实际类型,这种行为称为多态;
final修饰符有多种作用:
通过abstract定义的方法是抽象方法,它只有定义,没有实现。抽象方法定义了子类必须实现的接口规范;
- 定义了抽象方法的class必须被定义为抽象类,从抽象类继承的子类必须实现抽象方法;
- 如果不实现抽象方法,则该子类仍是一个抽象类;
面向抽象编程使得调用者只关心抽象方法的定义,不关心子类的具体实现。
接口
Java的接口(interface)定义了纯抽象规范,一个类可以实现多个接口;
- 接口也是数据类型,适用于向上转型和向下转型;
- 接口的所有方法都是抽象方法,接口不能定义实例字段;
-
静态字段
静态字段属于所有实例“共享”的字段,实际上是属于class的字段;
- 调用静态方法不需要实例,无法访问this,但可以访问静态字段和其他静态方法;
-
包
Java内建的package机制是为了避免class命名冲突;
- JDK的核心类使用java.lang包,编译器会自动导入;
- JDK的其它常用类定义在java.util.,java.math.,java.text.*
-
作用域
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;
- 使用模块对类的访问权限有了进一步限制。