java继承
定义
子类继承父类的属性和行为,使得子类对象具有与父类相同的属性、相同的行为。子类可以直接访问父类中的非私有的属性和行为。(共性抽取,提高了代码的复用性;使类与类之间产生了关系,是多态的前提)
Java只支持单继承。
继承后的几种情况
-
子类和父类没有重名属性和方法时
class Fu { int a = 1; void showFu () { System.out.println("Fu"); } } class Zi extends Fu{ int b = 3; void showZi () { System.out.println("Zi"); } } class Test { public static void main(String [] args) { Zi z = new Zi(); // 子类继承父类非私有的方法属性 System.out.println(z.a); // 1 z.showFu(); // Fu System.out.println(z.b); // 3 z.showZi(); // Zi } }
-
子类和父类属性重名时
class Fu { int a = 1; } class Zi extends Fu{ int a = 3; void show () { // 当父类和子类的属性名相同时,可以通过 super 访问父类的属性,super 指向父类 System.out.println(super.a); System.out.println(this.a); } } class Test { public static void main(String [] args) { Zi z = new Zi(); z.show(); // 1 3 } }
-
子类和父类方法重名时,就发生了方法重写
方法重写:子类中出现与父类出现方法签名和返回值一样的方法时(返回值类型,方法名和参数列表都相同),会出现覆盖效果,也称为重写或者复写。声明不变,重新实现。
方法签名
由方法名称和方法的形参列表(形参类型和形参顺序)共同组成 ;不包括返回类型和访问修饰符
class Fu { void show() { System.out.println("Fu"); } } class Zi { // @Override 注解 检查是否是方法重写,不是将会报错 @Override void show() { // 也可通过 super 掉用父类的非私有方法 System.out.println("Zi"); } } class Test { public static void main(String [] args) { Zi z = new Zi(); z.show(); // Zi } }
注意:
- 子类重写父类方法时,必须要保证子类方法权限大于等于父类方法权限
- 子类方法和父类方法具有相同的方法名字、相同的参数列表、相同的返回类型
-
子类和父类的构造方法
-
子类不会继承父类的构造方法
-
构造方法的作用是初始化成员属性(初始化对象是通过new关键字实现的),所以子类实例化时必须先实例化父类。子类的构造方法中默认有一个
super()
,表示掉用父类的构造方法。
class Fu { public Fu(){ System.out.println("Fu"); } } class Zi extends Fu{ public Zi() { // 默认掉用了 super() 父类构造方法 System.out.println("Zi"); } } class H { public static void main(String [] args) { Zi z = new Zi(); // Fu Zi } }
-
super 和 this
-
super :代表当前对象的父类
-
this:代表当前对象(谁掉用就是谁)
super.a; // 父类的成员变量 this.a; // 本类的成员变量 super.show(); // 父类的成员方法 this.show(); // 本类的成员方法 super(); // 父类的构造方法 this(); // 本类的构造方法
子类构造方法中默认掉用
super()
,手动掉用super()
会覆盖默认的super()
。super()
和this()
都必须是在构造方法的第一行,所以不能同时出现。
本文来自博客园,作者:遥远的相似性,转载请注明原文链接:https://www.cnblogs.com/z212021/p/13886358.html