方法
可变参数,相当于数组,但无需构造,非 NULL
参数绑定:基本类型参数传递,复制;引用类型参数传递,引用
构造方法
先初始化字段,再按构造方法进行初始化
默认构造方法,多构造方法-方法重载
继承
子类 extends 基类
一个protected
字段和方法可以被其子类及子类的子类访问
子类引用父类的字段时,可以用super.fieldName
如果父类没有默认的构造方法,子类就必须显式调用super()
并给出参数
允许使用sealed
修饰class,并通过permits
明确写出能够从该class继承的子类名称
向上转型:把一个子类型安全地变为更加抽象的父类型
向下转型很可能会失败,ClassCastException
instanceof
判断一个变量所指向的实例是否是指定类型,或者这个类型的子类
多态
实例方法调用是基于运行时的实际类型的动态调用,而非变量的声明类型
多态是指,针对某个类型的方法调用,其真正执行的方法取决于运行时期实际类型的方法
要调用父类的被覆写的方法,可以通过super
来调用
父类不允许子类对它的某个方法进行覆写,可以把该方法标记为final
(final
修饰方法阻止覆写,修饰类阻止继承,修饰字段阻止修改)
抽象类
把一个方法声明为abstract
,表示它是一个抽象方法,本身没有实现任何方法语句
注意这个类也必须申明为抽象类
接口
如果一个抽象类没有字段,所有方法全部都是抽象方法,就可以把该抽象类改写为接口,使用interface
可以声明一个接口
所谓interface
,是比抽象类还要抽象的纯抽象接口,它连(实例/变量)字段都不能有
接口定义的所有方法默认都是public abstract
的
当一个具体的class
去实现一个interface
时,需要使用implements
关键字
区别:一个类只能继承自另一个类,不能从多个类继承;但一个类可以实现多个interface
静态
静态方法和静态字段都用 static
修饰
interface
可以有静态常量字段(只能且自动为 public static final
)
包
类似命名空间,但要求逻辑结构与物理结构一致
位于同一个包的类,可以访问包作用域的字段和方法。类中不用public
、protected
、private
修饰的字段和方法就是包作用域
引用其它的类:要么写出完整类名,要么 import
某个包的某个类(或者 *
)
编译器对待简单类名的查找顺序
当程序中有包声明,编译方法需要修改。打包编译 javac -d . A.java
即可
作用域
定义为public
的class
、interface
可以被其他任何类访问
定义为private
的field
、method
无法被其他类访问(如果定义了嵌套类,那么,被嵌套类拥有访问private
的权限)
定义为protected
的字段和方法可以被子类访问,以及子类的子类
包作用域是指一个类允许访问同一个package
的没有public
、private
修饰的class
,以及没有public
、protected
、private
修饰的字段和方法
注意:包名必须完全一致,包没有父子关系
内部类
Inner Class除了有一个this
指向它自己,还隐含地持有一个Outer Class实例,可以用Outer.this
访问这个实例。所以,实例化一个Inner Class不能脱离Outer实例
还有一种定义Inner Class的方法,它不需要在Outer Class中明确地定义这个Class,而是在方法内部,通过匿名类(Anonymous Class)来定义
用static
修饰的内部类和Inner Class有很大的不同,它不再依附于Outer
的实例,而是一个完全独立的类
classpath
classpath
是JVM用到的一个环境变量,它用来指示JVM如何搜索class
JVM 需要知道,要加载一个类时,应当去哪里搜索它的 .class
文件
不推荐在系统环境变量中设置 classpath
建议在启动 JVM 时设置 classpath
java -cp .;C:workproject1in;C:shared abc.xyz.Hello
没有设置系统环境变量,也没有传入-cp
参数,那么JVM默认的classpath
为.
注意不要把任何 Java 核心库添加到 classpath 中
jar 包可以将 package 组织的目录层级以及文件打成一个 jar 包,本质上是 zip
MANIFEST.MF
是纯文本,可以指定Main-Class
和其它信息。JVM会自动读取这个MANIFEST.MF
文件。指定后可以直接启动一个 jar
java -jar hello.jar
可以用构建工具如 Maven 来打包
模块
模块的重要作用就是声明依赖关系
Java标准库已经由一个单一巨大的rt.jar
分拆成了几十个模块,这些模块以.jmod
扩展名标识
这些.jmod
文件每一个都是一个模块,模块名就是文件名
在src
目录下多了一个module-info.java
这个文件,这就是模块的描述文件
把bin目录下的所有class文件先打包成jar, 继续使用JDK自带的jmod
命令把一个jar包转换成模块