继承:extends
- 减少代码的冗余
- 提高复用性 便于扩展
- 为多态性提供前提
结构:
class A extends B{}
A:子类
B:父类 、基类 、 超类
声明后:A获得B的所有(包含私有)属性 方法
一个子类只能有一个父类,但一个父类可以被多个子类继承
Object类:java中所有类都直接或间接继承了Object类
overrides:
对父类中的同名,同参数列表方法:重写
idea中的overrides标记
方法的重载与重写:
重载:同名 参数列表不同 在编译期就确定了
重写:
- 同名
- 同参数列表
- 重写的方法权限不小于被重写方法的权限修饰符(权限只能放大)
- prviate 的方法不能被重写(报错)
返回值类型
super关键字:
- 理解为:父类的 类比(this)
当子类定义了与父类同名的属性、方法时:
采用"super.属性"、“super.方法”、"super.构造器"调用父类中对应的属性方法构造器
super(形参列表):表示调用父类指定的构造器
在子类的构造器首行没有显式定义super()或者this()则默认使用super()
子类构造器一定直接或间接调用父类的构造器,虽然创建子类对象时调用了父类的构造器,但是仅仅创建了一个对象即new的对象。
创建子类对象后获取全部父类的方法,并且在堆空间中加载了所有父类的属性,但父类并没有生成对象。
多态性:
例如:
父类: Persong
子类:Man 、 Woman
一般的:
Man man = new Wan(); Woman woman = new Woman()
多态性:父类的引用指向子类的对象
Person man = new Man()
此时调用man的方法时,执行的是子类重写父类的方法(虚拟方法调用)。但是不能再调用men本身特有的方法,只能调用父类Person有的方法。
即编译时看Person有没有对应方法,运行时调用的是子类重写的方法。
编译看左边,运行看右边
多态性使用的前提:
- 存在继承关系
- 存在方法的重写
方法可以重写,但属性 为父类的属性。
public class animalTest { public static void main(String[] args) { animal animals = new animal(); doit(new dog()); doit(new cat()); } public static void doit(animal animals){ animals.eat(); animals.shout(); } }
定义时看不出会执行什么函数,只有在运行时才能确定具体运行哪一个重写。
向下转型:
a instanceof A:对象a是否为类A的实例。
对于类的转换存在转换失败的情况,因此采用instanceof进行判定
Man p1 = new Men Women p2 = (Women)p1//通过强制类型转换 将men转换为women
为了在向下转型的过程出现ClassCastException的异常,在向下转型前采用instanceof进行判定,若返回true则进行向下转型,否则不进行转型
若 a instanceof A 返回true则
将A替换为A的任意父类 仍然返回true
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)