面向对象编程----继承---笔记

继承关系: 父与子(官方) 类与类之间的关系
继承与属性和方法有关
实现继承 , 子类 extends + 父类
所有的实现类
为什么需要继承?
• 是为了实现方法的多态, 实现代码的重用
为什么继承可以实现代码的重用?
• 继承可以使得子类具有父类别的各种属性和方法,而不需要再次编写相同的代码
继承的解析:
§ 现今面向对象程序设计技巧中,继承并非以继承类别的“行为”为主,而是继承类别的“类型”,使得组件的类型一致。
§ 另外在设计模式中提到一个守则,“多用合成,少用继承”,此守则也是用来处理继承无法在运行期动态扩展行为的遗憾。

多继承: 在c++中有体现
使用单继承的优点:
多继承会让子类"可控性"越来越差,单继承会使子类更为可控.
多继承在现实生活中会很强大,但是用于编程时,可控性差
Tips : Object 父类-基类-超类
○ 同包约束, 继承->同包时可以继承,不同包也能继承
○ 1 作为子类,任何时候都可以继承到protected修饰的内容
(子类和父类同不同包没关系)
○ 2 默认缺省的权限修饰符, 只能在同一个包中进行访问
3 私有的,则只能在本类中进行访问
子类如果定义了一个与父类一样名称的变量, 则会覆盖父类的对应名称的变量的值(属性的覆盖或属性的隐藏)
不管子类中的内容如何修改,都不会影响父类中的值
在类中直接定义的属性未手动赋值,(没有分配初始值, 那么程序会自动生成初始值 ), 此时修改该属性的值必须在方法中或者语句块中去实现.
子类重写方法:
子类调用方法的时候, 会优先调用子类的方法, 如果找不到对应的方法, 那么再调用父类的方法
方法重写:
在父类中定义一个方法, 其子类中也定义一个一模一样的方法
方法重写和方法重载是两码事
@Override 符号表示重写,放在方法名之前
@Override 就是注解, 表示验证一下这个方法是否是重写
在企业规范中, 是必须要写@Override的, 这是规范
方法重写的规则: (范围: 必须有继承关系)
§ 父类和子类的方法名必须相同
§ 父类和子类的方法形参必须相同
§ 父类和子类的返回值类型必须相同
§ 父类方法的权限修饰符的范围可以小于等于子类中的方法(如果父类中定义的是protected, 子类可以是protected/public
§ 方法体可以自行定义
方法重载的规则: (范围: 在本类中实现)
§ 重载的英文单词为overload
重载与重写的区别:
§ 重写必须存在继承关系, 重载是在本类中存在
§ 重载关心的是: 方法名相同, 参数不同(个数,顺序,类型), 与返回值无关
§ 重写关心的是: 方法名相同, 参数相同, 返回类型相同, 权限修饰符可以不同
§ 重写的权限修饰符, 子类中的范围 >= 父类中的范围; 重载的权限修饰符可以不同.

Tips: final修饰的方法是不能被继承的(也不能被重写)
被final修饰的类是不能被继承的(eg.String, 包装类, Math)

构造方法的继承:
§ 默认情况下,在每一个子类的构造函数的第一行,调用super()方法
public class son extends father {
public son() {
super(); //初始化当前子类的时候, 首先会去调用父类的构造方法. 必须放在构造器的第一行

}
}
//如果显示的定义了父类的构造器,而且带参数,那么这个构造器就会把原有的隐式构造方法给覆盖掉
当子类在调用父类的构造函数时, super()需要和父类中的构造函数保持一致. 如果有参数, 则必须传值.
关键字this:
this(); //代表调用本类的无参构造器
this()和super()不能共存
注意: 创建一个子类对象的时候,虽然直观看到的是调用的是子类的构造,但是必须先调用父类的构造器才行.
没有成功调用父类的构造时, 子类对象创建就会失败;
子类的构造器中, super()和this()不能同时存在
this和super都必须放在构造器的第一行

猜你喜欢

转载自www.cnblogs.com/zjulanjian/p/10247519.html