类的组成结构
构造器
- 每个类如果没有显示声明构造器,会默认创建一个无参构造器
- 构造器如果没有显式调用super()或this(),会默认执行super()
- 构造器可以存在重载,并且在构造器内可以调用其他重载的构造器
代码块
- 分为静态代码块和非晶态代码块
静态代码块
- 随着类的加载而执行
- 永远只执行一次
非静态代码块
- 随着对象的创建而执行
- 每创建一个对象就执行一次
属性
类属性
- 使用static修饰的属性是静态属性,也是类属性
- 类属性是在类加载的时候加载的,存储在类上,所有对象公用一个类属性
- 类属性可以通过“类.类属性”或“对象.类属性”的方式调用
实例属性
- 没有使用static修饰的属性
- 随着对象的创建而创建,存储在对象上,每个对象独立拥有实例属性
- 实例属性只能通过“对象.实例属性”调用
方法
类方法
- 使用static修饰的属性是静态方法,也是类方法
- 类方法是在类加载的时候加载的,存储在类上,所有对象公用一个类方法
- 类方法可以通过“类.类方法”或“对象.类方法”的方式调用
- 类方法中只能调用类方法或类属性,不能调用实例方法和实例属性
实例方法
重载
- 相同方法名, 不同参数列表构成重载
重载的特点
- 参数列表必须不同
- 权限修饰符可以不同
- 返回值类型可以不同
重载参数列表详解
- 重载参数中可以用...来接受剩余所有参数
- 当存在具体个数的参数和...参数两个方法时,优先命中写明具体参数个数的方法
- ...和数组视作相同的参数形式
重写
- 对父类的方法进行重写
- 子类重写父类方法,必须在父类范围内重写
- 父类中private的方法不可能被重写,因为private子类是没有权限获取到的
重写的要求
- 权限修饰符只能不变或放大,但是有个特例,private不能被重写
- 返回值类型必须被包含在原有返回值类型里 2.1 如果返回值类型是类,则必须是当前类或子类 2.2 如果返回值类型是基本类型,则必须完全相同 2.3 如果返回值类型是void,则必须是void
- 参数列表必须一致
- 抛出的异常类型也必须是原有异常类型或其子类
super和this
this
- this在实例方法,构造器中指向实例对象自己
- 特殊情况,this在构造器中形如this()调用,指向当前类符合当前参数的构造器
- this在类方法中指向当前类
this在构造器中使用详解
- this()表示调用当前类的构造器方法,因为构造器可以重载,所以调用的是哪个,看的是参数列表
- this()不可以在构造器中形成环,即A调用B,B又调用A
- this()必须写在首行,有this()就没有super()
super
- super在实例方法,构造器中指向实例对象中由父类构造器初始化的值的集合
- 特殊情况,super在构造器中形如suoer()调用,指向父类符合当前参数的构造器
- super在类方法中指向父类
super在构造器中使用详解
- super()表示调用父类的构造器方法,因为构造器可以重载,所以调用的是哪个,看的是参数列表
- super()必须写在首行,有super()就没有this()
关键字
权限修饰符
- public 表示所有包可见
- protected 表示不同包内子类可见
- 缺省 表示同包内可见
- private 只有本类内部可见
static
- 修饰属性、方法、代码块
- 表示是否是类上的属性、方法、代码块,随着类的加载而加载或执行
final
- 修饰类、方法、变量,表示不可修改
- 修饰类表示该类不可被继承
- 修饰方法表示该方法不可被重写
- 修饰变量表示该变量不可以被修改
abstract
- 可以用来修饰类和方法
- 用来修饰类表示该类不能实例化对象
- 用来修饰方法,表示在子类中该方法必须被重写
- 基于第3点,abstract不能修饰final方法和static方法,因为这两种方法不能被重写
- 常用于模版方法设计模式的实现
类的特性
封装
- 某些方法和属性可以设置成private,不允许外部访问
继承
- 使用extends关键词继承
继承的特点
- 只能继承一个父类
- 会继承父类除private外的所有属性和方法
- 如果没有显式继承父类,则默认继承java.lang.Object类
多态
父类的变量指向子类对象
多态的特点
- 变量只能调用父类下的属性和方法。是什么类型就只能调用什么类型下的属性和方法,其他的属性和方法就算存在也无法调用
- 子类可以通过重写父类方法,使得间接调用子类的方法
- 直接通过"对象.属性"的方式调用获取到的是父类属性值
- 可以通过子类重写父类方法,此时方法中获取到的属性是子类属性值