1. 方法重载(overload)
定义:同一个类中的方法,方法名相同,形参列表不同,则被称为方法重载。
记忆:同类同名 不同参
方法的返回值类型、修饰符,与方法重载没有任何关系,可以不同。
2. 方法重写(override)
重写是父类与子类之间多态性的一种表现。
重载是一个类中多态性的一种表现。
方法重写遵循的规则(三同两小一大):
- ① 三同:方法名相同,形参列表相同,方法类型相同(都是类方法 或 都是实例方法)
- ② 两小:返回值类型:子类 <= 父类 , 抛出的异常类:子类 <= 父类
- ③ 一大:子类方法的访问权限 >= 父类方法的访问权限
其它注意点:
- 子类无法访问和重写带有 private 的父类方法
- 子类中通过 super. 访问父类的实例变量和实例方法,通过父类类名. 访问父类的类变量和类方法
- super 和 this 都不能出现在 static 修饰的方法中
3. 多态
class BaseClass {
public int book = 6;
public void base() {
System.out.println("父类的普通方法");
}
public void test() {
System.out.println("父类被覆盖的方法");
}
}
public class SubClass extends BaseClass {
public String book = "疯狂java讲义";
public void sub() {
System.out.println("子类的普通方法");
}
public void test() {
System.out.println("子类覆盖父类的方法");
}
public static void main(String[] args) {
BaseClass ploy = new SubClass();
// 重点: ↓
ploy.test(); // 子类覆盖父类的方法
System.out.println(ploy.book); // 输出父类的 book 6
System.out.println(((SubClass) ploy).book); // 输出子类的 book 疯狂java讲义
((SubClass) ploy).sub(); 强制类型转换来调用运行时类型 SubClss 的方法
}
}
- BaseClass ploy = new SubClass(); 引用变量 ploy 的编译时类型是 BaseClass ,运行时类型为 SubClass 。
- 其中的 BaseClass ploy = new SubClass(); 引用变量只能调用它编译时类型 BaseClass 的方法,而不能调用它运行时类型 SubClass 的方法。如果非要调用 SubClass 的方法 sub() ,则必须强制类型转换 ((SubClass) ploy).sub();
- 强制类型转换时需要同时注意两点:
① 基本类型之间的转换:与布尔类型之间不能进行类型转换
② 引用类型之间的转换:只能在具体继承关系的两个类型之间转换,即一父一子
例如:
Object obj = Integer.valueOf(5);
System.out.println(obj); // 5
// 下面代码强制类型转换,编译可以通过,但运行时会报异常
String str = (String) obj;
System.out.println(str);
上述代码中 obj 编译时类型为 Object ,实际类型为 Integer ,由于 Integer 和 String 没有继承关系,所以将 obj 强制类型转换为 String 类型会报错。
修改如下:
if (obj instanceof String) {
String str = (String) obj;
}
Object obj = new Object();
obj = "父转子,向下转型,强制类型转换";
String str = (String) obj;
System.out.println(str);
多态总结:
① 子转父,向上转型,系统自动完成
② 父转子,向下转型,强制类型转换
③ 强制类型转换前,先用 instanceof 运算符判断是否可用成功转换
4. 继承
- java语言是单继承,C++是多继承
- 子类扩展了父类,子类是一个特殊的父类
继承会破坏封装,比如:
// Bird 和 Ostrich(鸵鸟)内部都有 fly 这个方法
// 但调用 b.fly()时,执行的是 Ostrich 重写后的 fly 方法
Bird b = new Ostrich();
b.fly();
为了保证父类有良好的封装性,设计父类应遵循如下规则:
① private:将父类所有成员变量都设置成 private 修饰
② public:可被其他类访问,可被子类重写
③ public final :可被其他类访问,不可被子类重写
④ protected:不可被其他类访问,可被子类重写
5. 初始化块
- 初始化块是 Java 类里可出现的第四种成员(前面依次有成员变量、方法、构造器)
- 初始化块的语法格式:【修饰符】 { }
- 初始化块的修饰符只能是 static ,或者不写
- 初始化块没有名字和标识,因此无法通过类、对象来调用
- 初始化块在构造器之前执行