Java OOP
继承
定义
多个类具有相似的属性方法,抽象出作为父类。子类可以访问父类 的所有非私有属性。私有属性可以通过共有方法来访问。
语法
子类 extend 父类
super
super(),调用父类构造器。默认可以不写。可以通过传参来指定(显式调用)父类构造器。只能在构造器第一行调用。不能和 this()同时使用。
super 调用时不仅限父类。同名遵顼就近原则。
注意:如果父类某属性设置 private,子类无法访问,也无法绕过访问爷类同名属性。
作用
减少代码冗余。不用把一样的属性和方法再写一遍。
重载
定义
子类和父类具有相同的方法名称,形参,返回。子类的方法覆盖父类的方法。
子类返回类型和父类一致,或者是父类返回类型的子类。
javapublic class Father(){ public Object m1(){ return null; }; } public class Son extends Father(){ public String m1(){ return null; }; }
子类不可以缩小父类的访问权限
public>protected>默认>private
重写与重载
发生范围 | 方法名 | 参数列表 | 返回类型 | 修饰符 | |
---|---|---|---|---|---|
overload 重载 | 本类 | 一致 | 类型,个数或者顺序至少有一个不同 | 无要求 | 无要求 |
override 重写 | 父子类 | 一致 | 一致 | 一致,或者子类返回类型是父类 返回类型的子类 | 子类不能缩小 |
多态
方法和类具有多种形态。建立在封装和继承的基础上。
继承是多态的前提。
重载和重写是多态 的体现。
对象的多态
一个对象的编译类型和运行类型可以不一致
javaAnimal animal = new Dog();
父类的引用可以指向子类
属性看编译类型,方法看运行类型
对象的编译类型被定义时就已经确定了,无法改变。运行类型可以改变。
向上转型
本质:父类的引用指向子类的对象。
对象可以调用父类所有成员。遵循访问权限。子类特有类型不能访问。因为对象可以调用哪些成员,是由编译类型决定的。
向下转型
前提条件:
- 子类类型:转型的目标类型必须是源对象的实际子类类型。
- 对象名指向转换的对象类型:源对象必须是通过父类引用指向的实际子类对象。
语法:子类类型 对象名 = (子类类型) 父类对象名 ;
java
Animal animal = new Cat();
Cat cat = (Cat) animal;
人话:堆中本来就创建了一个 Cat 对象,拥有 Cat 类型的全部成员,转型改变的只是这些成员的访问权限。
动态绑定机制
调用对象方法时,该方法会和该对象(运行类型)的内存地址/运行类型绑定。属性不会。
java
class A {
int count = 10;
public int sum(){
return count + 10;
}
public sum1(){
return sum()+count;
}
}
class B extends A {
int count = 20;
public int sum(){
return count + 20;
}
}
class demo{
static public void main(String[] args){
A a = new B();
a.sum();//40
a.sum1();//50
}
}