一、继承
- 什么是继承
继承是面向对象程序设计时使代码复用的手段,是对原有类的扩展,增加新功能,产生派生类的过程。 - 为什么要有继承
为了:共性的抽取,实现代码的复用。 - 如何实现继承
使用关键字extend
需要注意的是:
- 类内成员的访问
访问规则:遵循就近原则,子类有该成员就优先访问子类的,如果没有就在父类中找。若父类也没有就报错。当父子类中有同名成员时亦遵循此原则。
问题:那么,当父子类中有同名成员时,该如何越过子类成员的就近原则去访问父类成员呢?
- super关键字
答案就是使用super
.
super的作用:在子类方法中访问父类的成员。
super的使用禁忌:只能在非静态方法中使用;在子类方法中,访问父类的成员变量和方法
public class Base{
int a;
int b;
public void funA(){
System.out.println("Base的funA()");
}
public void funB(){
System.out.println("Base的funB()");
}
}
public class Derived extends Base{
int a;
int b;
public void funA(int a){ //与父类方法发生重载
System.out.println("Derived的funA()");
}
public void funB(){
System.out.println("Derived的funB()");
}
public void funC(){
a=100;//这里用的是子类自己的a,相当于this.a
super.a=200;//这里获取的是继承自父类的a
funB();//这里是Derived的funB()
super.funB();//这里获取的是继承自父类Base的funB()
System.out.println("Derived的funC()");
}
}
- 父与子的构造方法
在子类对象构造时,需要先调用父类构造方法,然后执行子类的构造方法。
这么做的原因是:子类的对象同时也是一个父类的对象,在子类构造子类对象的时候,先要将从父类继承下来的成员初始化完整,然后再初始化子类自己新增的成员。
需要注意的是:
-
super与this
共同点:
(1) 只能在非静态方法中使用,用来访问非静态成员方法和字段
(2)在构造方法中使用的时候必须是构造方法下的第一句,并且不能同时出现。
不同点:
(1)this是对当前对象的引用,super是对父类继承下来的成员的引用。
(2)this是被非静态成员方法隐藏的一个参数,super则不是。
(3)this()用来调用本类构造方法,super()用来调用父类构造方法,二者不能能时出现。 -
初始化时的执行顺序
父类静态代码块—>子类静态代码块–>父类实例代码块–>父类构造方法–>子类实例代码块–>子类构造方法。
注意:第二次实例化时,静态代码块将不会再执行。
- 继承的方式
可以:单继承、多层继承、不同类继承同一个类;
不可以:多继承,java不支持多继承
- final关键字
(1) 当修饰变量或字段时:表示这是个不能修改的常量;
(2)当修饰类时:此类不能被继承
(3)当修饰方法时:该方法不能被重写
二、多态
-
什么是多态:
在完成某个行为的时候,当不同的对象去完成时会产生出不同的状态;在代码运行时,当传递不同对象的时候,会调用对应类的方法。 -
如何实现多态
(1)必须在继承体系下;
(2)子类必须要对父类的方法进行重写
(3)通过父类的引用调用重写的方法 -
什么是重写
又称覆盖,是子类对父类方法的实现过程进行重写编写,返回值与形参都不能变。
重写的规则:
(1)修饰符、返回值、方法名、参数列表要完全一致;
(2)被重写的方法访问权限要大于等于父类原本方法的访问权限;
(3)static、private、final修饰的方法、构造方法都不能重写;
(4)重写的方法用@Override
注释
-
向上转型和向下转型
向上转型:安全的转型,父类引用引用子类对象,可以让代码更灵活例如:
Animal cat=new Cat();
向下转型:不安全