一、静态
静态方法可以被继承和重写,静态方法也允许通过对象进行调用
- 静态方法执行时很有可能并没有构建对象,所以 在静态方法中不允许使用this/super之类用于指定对象的关键字
- 静态方法只能直接访问静态成员,不能直接访问非静态成员
静态块
- 类在执行时需要通过一个叫作类加载器的组件将程序加载到内存中,类在运行时一般不会发生变化,所以类 不会频繁加载,在整个运行过程中只加载一次,而且常驻内存
- 静态块在类加载完毕后自动执行,而且只执行一次
非静态块
非静态块在类内且在所有的方法之外,非静态块并不会在类加载后自动执行,而是在构建当前对象时自动执行。 new一次则会执行一次,执行时机在构造器之前执行
总结:
- 当类加载完毕会自动优先处理static属性和static块,这两个优先级是相同的,所以谁在前先处理谁 new对象时,
- 处理非静态属性和非静态块,这两个优先级是相同的,所以谁在前先处理谁
- 后执行构造器
定义一个可变长个数的参数
语法:数据类型… 变量名。-必须作为最后一个参数出现 具体处理过程中实际上是按照数组的方式进行处理,而且数组不会为null
静态导入
-
在一个类中反复使用到某个类中的静态方法,如果使用静态导入则在当前类中不需要再写类名称,相当于一次性导入该类的所有静态方法
-
语法:import static java.lang.Math.*; - 导入Math类中的所有静态方法
-
如果有多个静态导入操作,则所声明的静态方法不能重复,否则报错
-
注意要求使用JDK1.5+版本,否则编译不通过
基本数据类型的对象缓存
- 在Integer中包含有一个缓存池,缓存值为-128到127之间
- Integer\Long\Short\Byte中都有缓存池 ,浮点型没有缓存池是因为无法计数
String中包含一个缓存池,当使用某个字符串对象时会首先在缓存池中进行查找,如果存在则直接返回这个对象的 地址;如果不存在则会在缓存池中进行创建,创建完成后返回地址
二、多态性
多态性是发送消息给某个对象,让该对象自行决定响应何种行为。通过将子类对象引用赋值给超类对象引用变量来 实现动态方法调用
多态可以用三个定义和两个方法来总结。
- 三个定义分别是:父类定义子类构建、接口定义实现类构建和抽象类定义实 体类构建,
- 两个方法分别是方法重载和方法重写。
静态方法中不能直接访问非静态成员,但是普通方法允许直接调用其他成员方法,当然也允许直接调用静态 方法
多态引用时,构造子类对象时的构造方法的调用顺序
- 父类 bi=new 子类(); bi可以直接调用父类中声明的方法,但是具体执行的方法取决于new 的是谁。如果需要调用子类中的特殊方法,则必须先进行强制类型转换
- 先调用超类的构造方法,多重超类首先调用远超类的方法
- 然后再执行当前子类的构造方法
多态是同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口,使用不同的实例而执行不同操作
针对一个类对象有两种类型,
- 一种称之为编译期类型,编译时系统识别对象的类型,”动物 x = new 猫()”在编 译时,系统识别x是动物类别的,所以只能调用动物类定义的方法,而不能调用猫中特殊的方法。
- 另外一种称 之为运行时类型,也就是当程序运行系统识别的类型,new谁就是谁
多态左父右子,声明的类型为父类,实际创建的是子类的对象
当多个方法重载java的原则为:最佳匹配原则
三、方法的重写和重载
方法的重写(覆盖)
编译看左,运行看右
- 方法的重写(覆盖)一定发生在父子类之间,方法的名称,参数列表均一致,于参数名称无关
- 执行规则:new谁运行谁的方法,和声明的类型无关,由具体创建对象的类型决定
- 子类中方法范围要求大于等于父类中的方法范围,不允许private ;返回类型一致,子类方法可以小于等于父类类型,例如父类Number,子类Integer //参数类型一致
方法的重载
方法的名称相同,参数不同,和返回值类型无关。可以在一个类内或者父子类之间
参数不同有3种情况:参数个数不同、参数类型不同、参数顺序不同 和参数名称无关
调用规则:类型佳匹配原则
多态的优点
- 消除类型之间的耦合关系
- 可替换性、可扩充性
- 接口性、灵活性、简化性