1: 成员变量
当子父类中出现一样的属性时, 子类类型的对象, 调用该属性, 值是子类的属性值
如果想要调用父类中的属性值, 需要使用一个关键字: super
This: 代表是本类类型的对象引用
Super: 代表是子类所属的父类中的内存空间引用
注意: 子父类中通常是不会出现同名成员变量的, 因为父类中只要定义了, 子类就不用在定义了, 直接继承过来用就可以了
2: 成员函数
当子父类中出现了一模一样的方法时, 建立子类对象会运行子类中的方法好像父类中的方法被覆盖掉一样所以这种情况, 是函数的另一个特性: 重写
3: 构造函数
发现子类构造函数运行时, 先运行了父类的构造函数为什么呢?
原因: 子类的所有构造函数中的第一行, 其实都有一条隐身的语句 super();
super(): 表示父类的构造函数, 并会调用于参数相对应的父类中的构造函数而 super(): 是在调用父类中空参数的构造函数
为什么子类对象初始化时, 都需要调用父类中的函数?(为什么要在子类构造函数的第一行加入这个 super()?)
因为子类继承父类, 会继承到父类中的数据, 所以必须要看父类是如何对自己的数据进行初始化的所以子类在进行对象初始化时, 先调用父类的构造函数, 这就是子类的实例化过程
注意: 子类中所有的构造函数都会默认访问父类中的空参数的构造函数, 因为每一个子类构造内第一行都有默认的语句 super();
如果父类中没有空参数的构造函数, 那么子类的构造函数内, 必须通过 super 语句指定要访问的父类中的构造函数
如果子类构造函数中用 this 来指定调用子类自己的构造函数, 那么被调用的构造函数也一样会访问父类中的构造函数
问题:
super() 和 this() 是否可以同时出现的构造函数中?
两个语句只能有一个定义在第一行, 所以只能出现其中一个
super() 或者 this(): 为什么一定要定义在第一行?
因为 super() 或者 this() 都是调用构造函数, 构造函数用于初始化, 所以初始化的动作要先完成
在方法覆盖时, 注意两点:
1: 子类覆盖父类时, 必须要保证, 子类方法的权限必须大于等于父类方法权限可以实现继承否则, 编译失败 (举个例子, 在父类中是 public 的方法, 如果子类中将其降低访问权限为 private, 那么子类中重写以后的方法对于外部对象就不可访问了, 这个就破坏了继承的含义)
2: 覆盖时, 要么都静态, 要么都不静态 (静态只能覆盖静态, 或者被静态覆盖)
继承的一个弊端: 打破了封装性对于一些类, 或者类中功能, 是需要被继承, 或者复写的
这时如何解决问题呢? 介绍一个关键字, final
final 特点:(详细解释见前面)
1: 这个关键字是一个修饰符, 可以修饰类, 方法, 变量
2: 被 final 修饰的类是一个最终类, 不可以被继承
3: 被 final 修饰的方法是一个最终方法, 不可以被覆盖
4: 被 final 修饰的变量是一个常量, 只能赋值一次
来源: http://www.bubuko.com/infodetail-2515906.html