1.方法的重写
重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。
重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法
重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常。例如: 父类的一个方法申明了 一个检查异常 IOException,但是在重写这个方法的时候不能抛出 Exception 异常,因为 Exception 是 IOException 的父类,只能抛出 IOException 的子类异常。
方法的重写规则
- 参数列表必须完全与被重写方法的相同
- 返回类型必须完全与被重写方法的返回类型相同
- 访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为 public,那么在子类中重写该方法就不能声明为protected
- 父类的成员方法只能被它的子类重写
- 声明为final的方法不能被重写
- 声明为static的方法不能被重写,但是能够被再次声明
- 子类和父类在同一个包中,那么子类可以重写父类所有除了声明为private和final的方法。
- 子类和父类不在同一个包中,那么子类只能够重写父类的声明为public和protected的非final方 法
- 重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,重写的方法不能抛 出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以
- 构造方法不能被重写。
- 如果不能继承一个方法,则不能重写这个方法
2.super与this关键字
Super关键字:我们可以通过super关键字来实现对父类成员的访问,,用来引用当前对象的父类。
This关键字:指向自己的引用
3.重写与重载之间的区别
方法重载是一个类中定义了多个方法名相同,而他们的参数的数量不同或数量相同而类型和次序不同,则称为方法的重载。
方法重写是在子类存在方法与父类的方法名字的相同,而且参数的个数与类型一样,返回值叶一样的方法,就称为重写
方法重载是一个类的多态性的表现,而方法重写是子类与父类的一种多态性表现
4.初始化块
初始化块根据是否使用ststic修饰分为两类:
1.不使用static修饰的是初始化块
2. 使用static修饰的是静态初始化块
初始化块
初始化块相当于是对构造器的补充,用于创建对象时给对象的初始化,在构造器之前执行
如果一段初始化代码对所有构造器完全相同,且无需接收参数,那就可以将其提取到非静态初始化代码块中
实际上,经过编译后,非静态块已经添加到构造器中,且位于所有构造器代码的前面
静态初始化快
静态初始化快用static修饰,又叫类初始化块
静态初始化块负责对类初始化,因此类初始化块是在类初始化阶段就执行
静态块跟静态方法一样,不能访问非静态成员
因为静态块是在类的初始化阶段完成的(加载时完成一次 ),因此在创建某个类的第二个对象时,该类的静态块就不会执行了
单个类中初始化块、静态初始化快、构造器的执行顺序
在单个类中,静态初始化快(多个时从上往下,无论在最后面还是在最前面,都是先执行静态初始化快)、初始化块(多个时从上往下无论在最后面还是在最前面,都是先执行静态初始化快,如果有静态初始化快,先执行后再到初始化块,在类中不局限于在前或者在后),构造器(最后执行)
5.修饰符总结
四个访问控制符:
注意:在不写访问控制符的情况下,就是friendly(默认)修饰符
类修饰符
1.public(访问控制符),将一个类声明为公共类,他可以被任何对象访问,一个程序的主类必须是公共类。
2. friendly,默认的修饰符,只有在相同包中的对象才能使用这样的类
3. abstract,将一个类声明为抽象类,没有实现的方法,需要子类提供方法实现。
4. final,将一个类生命为最终(即非继承类),表示他不能被其他类继承。
成员变量修饰符
- public(公共访问控制符),指定该变量为公共的,他可以被任何对象的方法访问
- private(私有访问控制符)指定该变量只允许自己的类的方法访问,其他任何类(包括子类)中的 方法均不能访问
- protected(保护访问控制符)指定该变量可以别被自己的类和子类访问。在子类中可以覆盖此变量
- friendly ,在同一个包中的类可以访问,其他包中的类不能访问
- final,最终修饰符,指定此变量的值不能变。
- static(静态修饰符)指定变量被所有对象共享,即所有实例都可以使用该变量。变量属于这个类,不属于实例,不允许被重写
方法修饰符 - public(公共控制符),指定该方法可以从所有类访问
- private(私有控制符)指定此方法只能有自己类等方法访问,其他的类不能访问(包括子类)
- protected(保护访问控制符)指定该方法可以被它的类和子类进行访问。
- final,指定该方法不能被重载。
- static,指定不需要实例化就可以激活的一个方法。
- synchronize,同步修饰符,在多个线程中,该修饰符用于在运行前,对他所属的方法加锁,以防 止其他线程的访问,运行结束后解锁
- native,本地修饰符。指定此方法的方法体是用其他语言在程序外部编写的
初始化块:
static(可选),使用static修饰的初始化块被称为静态代码块