Java基础笔记(十六)——继承

继承

提取出一些共性特征,作为父类,子类就可以继承父类的这些开放成员,子类再添加自己独有的属性和方法。如果再有类具有这些共同特征,也可继承这个父类。

特点:1.利于代码复用     2.缩短开发周期

继承是一种类与类之间的关系。

使用已存在的类的定义作为基础建立新类。

子类(派生类)——|>父类(基类)

新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类的特征(即继承全部开放特征)。

满足“A is a B”的逻辑关系。如:猫和狗都继承动物类,学生和老师都继承人类。

继承的实现(extends)

父类

class Animal{

  //公共的属性和方法

}

子类,只能继承一个父类

class Dog extends Animal{

      //子类特有的属性和方法

}

class Cat extends Animal{

}

子类可以访问父类非私有成员【把父类的非私有(private修饰但提供了getter/setter方法不是私有)成员(属性和方法)当自己的用】。

父类不可以访问子类特有成员(即时public也不行)。

方法重写&方法重载

先回顾以下方法重载

1.同一个类中

2.方法名相同,参数列表不同(参数顺序、个数、类型),与参数名无关。

3.与方法返回值类型,访问修饰符无关。

方法重写:子类也具有父类的方法,但实现的功能有所不同,需要重写。即与父类同名的方法。

1.有继承关系的子类中。

2.子类重写父类的方法。

3.返回值类型,方法名,参数列表(参数类型、顺序、个数)都有与父类继承的方法相同,与方法的参数名无关(参数名相同与否均可)。

4.子类方法的访问修饰符的访问范围需要大于等于父类的访问范围。private<default<protected<public

当子类重写父类方法后,子类对象调用的是重写后的方法,子类定义与父类同名的方法,要重写;子类可以定义与父类重名的属性。

super:父类对象的引用

子类可以把父类的开放成员(属性和方法)当作自己的用,子类包括继承父类的方法和自己重写父类的的方法。在子类的方法中,调用其它其它成员方法,在包含父类方法以及重写父类的方法情况下,子类肯定是调用重写的方法,那么如果想要调用父类的方法,而不是重写的那个方法,可以用super关键字来调用。如:super.eat();    super.setAge(3);   

当然了,如果父类的方法没有被重写,子类对象和子类方法中在调用父类方法时如同自己的一样,子类在调用父类的开放属性时也是同自己定义的一样去使用。

父类的构造方法不允许被继承,也就不允许被重写了。

在有继承关系的程序初始化顺序:

在Java中,当实例化对象时,对象所在类的所有成员变量首先要进行初始化,只有当所有类成员完成初始化后,才会调用对象所在类的构造函数创建对象。

父类静态成员——>子类静态成员——>父类对象构造——>子类对象构造

静态成员【静态变量(也就是static成员属性)和静态代码块】,其中访问修饰符不影响成员加载顺序,谁先谁后与书写位置有关。

假设静态变量在静态代码块前面:(如果出现位置相反,就反过来)

父类静态变量、父类静态代码块、子类静态变量、子类静态代码块、父类非静态变量(成员属性)、父类构造代码块、父类构造函数、子类非静态变量、子类构造代码块、子类构造函数。

(1)静态优先非静态,静态属于类加载,只初始化一次,非静态属于对象,随着对象的创建可能会初始化多次。

(2)父类优先于子类进行初始化。Object类是超类(顶级父类。

(3)成员变量按出现顺序进行初始化,即使在方法中,也在任何方法被调用前(包括构造方法)先初始化。

构造方法的调用必须放在构造方法里,子类构造(包括带参构造)默认调用父类无参构造方法,如果要调用父类带参构造,可以通过super(参)调用父类允许被访问的其它构造方法。super必须在子类构造方法中的第一行。如:super(name,month);

super小结:

代表父类引用。

-访问父类成员方法   super.print();

-访问父类属性          super.name;

-访问父类构造方法   super();

(1)子类的构造的过程中必须调用其父类的构造方法(一层一层往上找,直到Object类)。

(2)如果子类的构造方法中没写super,则系统默认调用父类的无参构造方法,没显式写无参构造的,系统默认提供。

(3)如果父类中写了带参构造却没写无参构造,在子类的构造方法中,又没写super(参),则编译出错。【因为父类写带参构造了,系统就不会再提供无参构造了,而子类不写super(参),就会默认去调用父类的无参构造去,找不到,就出错。】如果父类既写了无参构造又写了带参构造,子类的构造方法中不写super,默认调用父类无参构造,写了super();也是调用无参构造,写了super(参),调用带参构造。其中子类的构造方法包括带参构造和无参构造都符合上述说法,创建对象时调用哪个构造,哪个构造都要遵守上述规则。super();就是调用父类无参构造,可写可不写,super(参)是调用指定的父类的带参构造。

(4)使用super();   super(参);   必须放在子类构造方法中的第一行。

猜你喜欢

转载自www.cnblogs.com/tendo/p/10501069.html