Java中类与类之间的关系:this
继承与隐藏:对象
继承也是一种访问。继承
当成员变量声明为默认类型时,包外的子类不能继承该成员变量。编译
protected与默认类型的区别在于,当成员变量被修饰为protected时,若访问该变量的类位于包外,则只有经过继承才能访问该变量,不然,即便经过子类类型的引用来访问,但也不能经过编译。变量
成员变量的隐藏会在子类具备与其父类的相同名称的成员变量时发生。其含义是指在子类中直接调用该成员变量时,将调用的是子类的而不是父类的。固然,父类的成员变量确实是被继承过来了的,只是被隐藏起来了的而已。因此,想要访问被隐藏起来了的父类的变量,得使用super关键字。原理
super与this同属预约义对象引用。扩展
对象:引用
某个对象引用变量能够引用自身类型的对象实例或其子类及间接子类的对象。方法
类A继承于类B,故类A的对象引用变量能够引用类B的对象,但即便类A的对象引用指向的是类B的对象,当使用类A的对象引用调用与类B中相同名称的成员变量或方法时,系统仍然认的是类A的对象引用而不是其所指向的对象。不然,需进行强制类型转换。static
强制类型转换转的只是引用类型,对真正指向的对象是不会干预的。在这句话中,还能够引出另一个意思,即对于编译而言,只要被转换的引用类型与转换后的目标类型是派生或被派生关系,则编译经过;同时,编译系统并不知道引用所指向的具体对象是什么,其只能根据引用类型来判断转换有没有但愿。在运行时才能知道是否能进行引用的强制类型转换。
引用赋值能够直接将子类引用赋给父类引用;若需将父类引用赋给;子类引用,则必须进行强制类型转换。
对于引用的比较,Java中有相应的要求:
- 相同类型的引用能够比较;
- 不一样类型的引用要进行比较,其中的类型要具备派生关系;
- 引用的比较是比较两个引用是否指向同一个对象。
方法的重写:
当父类的引用指向子类对象时,若访问被重写的方法,则将访问的是被从新定义的子类中的方法(这点与访问类的属性不一样)。
若想构成重写,子类中的方法名与参数列表必须彻底相同(即签名要一致),此时,要遵循如下规则:
- 返回类型要兼容;
- 访问级别的限制必定不能比被重写方法的窄,能够比被重写的方法宽;
- 不能重写被表示为final的方法。
重写与继承的关系:
若父类的方法为private的,根本不能被子类继承,既然不能被继承,也就可能造成重写了,更谈不上要遵循重写中的规则之类的了。
静态方法能够被继承,但不能被重写:
- 非静态方法会试图重写静态方法时,编译报错;
- 静态方法的隐藏。父类和子类都有相同签名的static方法,但用父类引用调用的是父类方法,用子类引用调用的是子类的方法,与对象无关。
- 当用子类引用调用子类自己没有的,而父类有并且可继承(即非private的)的方法时,调用从父类继承的方法。
能够在重写父类的方法时经过super引用相应的父类的方法来扩展子类中重写了的方法的功能。
隐藏是根据引用的类型来进行调用的(调用static方法和成员变量),重写是根据对象的类型来进行调用的。
上述说法都是基于面向对象中一个很是重要的原理——替代性,即子类能替代父类。
方法的重载:
只有在同一个类里才有方法重载的说法。重载中的对象引用参数是面向引用类型的,而与其所指向的具体对象无关。
final与继承:
final的类没法继承,故没法重写该类的方法;final的方法没法被重写,只能被继承。
abstract与继承:
抽象类永远不能被实例化,它的主要用途是用于继承和扩展。
抽象方法只有方法声明,没有方法体(即没有花括号)。
抽象类中能够有非抽象方法,这种方法每每是抽象类全部将来子类都具备的,且不会由于子类的不一样而具体实现不一样的方法。