继承那些事?!!
在 Java 中通过 extends 关键字可以申明一个类是从另外一个类继承而来的,一般形式如下:
class 父类{
}
class子类 extends父类{
}
一,继承的最大好处就是为了实现代码的复用。那么,子类到底从父类得到的什么呢?
1.继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
注意:(java中只支持单继承,不支持多重继承,如果想实现多继承可以通过接口的方式实现。)
2.作为父类:可以有无数个子类。 作为子类:只能有一个直接父类。
二,子类继承了父类,是否意味着子类可以继承父类的所有成员?(答案是否定的!!)
1.父类的私有成员,子类无法继承。
2.子类不能从父类继承构造方法.
3.父子类不在同一个包中,但是成员没有通过任何的访问修饰符。
三,super与this关键字
super关键字:我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类,类似于C#中我们学过的base关键字。
this关键字:指向自己引用,本来的成员属性。
要讲super就不能不提this,下面从4个角度讲解一下super(需要对比的时候拿this对比一下,加深理解) 1. super关键字表示超(父)类的意思。this变量代表对象本身。 2. super访问父类被子类隐藏的变量或覆盖的方法。当前类如果是从超类继承而来的,当调用super.XX()就是调用基类版本的XX()方法。其中超类是最近的父类。 3.调用super() 父类构造函数的时候只能调用在子类构造函数的第一行 4.this只能在类中的非静态方法中使用,静态方法和静态的代码块中绝对不能出现this。并且this只和特定的对象关联,而不和类关联,同一个类的不同对象有不同的this 例如: class Person { protected void print() { System.out.println("The print() in class Person."); } } public class DemoSuper extends Person { public DemoSuper(){ super(); //调用父类的构造方法,而且放第一行,如果不写,系统自动加 } public void print() { System.out.println("The print() in class DemoSuper."); super.print();// 调用父类的方法 } public static void main(String[] args) { DemoSuper ds = new DemoSuper(); ds.print(); } }
四,重写override
一个继承链中,父类的方法对于子类来说具有相同的语义,但是不同的细节操作,因此子类需要override父类的这个方法以满足自己的需求。
注意的点:
1、方法名,参数表一定和父类中的相同,返回类型相同,或者是子类。
1、访问权限一定不低于父类的实例方法
2、抛出的异常一定是父类方法抛出的异常相同,或者子类。
总结
方法的重写(Overriding)和重载(Overloading)是java多态性的不同表现,重写是父类与子类之间多态性的一种表现,重载可以理解成多态的具体表现形式。
- (1)方法重载是一个类中定义了多个方法名相同,而他们的参数的数量不同或数量相同而类型和次序不同,则称为方法的重载(Overloading)。
- (2)方法重写是在子类存在方法与父类的方法的名字相同,而且参数的个数与类型一样,返回值也一样的方法,就称为重写(Overriding)。
- (3)方法重载是一个类的多态性表现,而方法重写是子类与父类的一种多态性表现。
五,构造函数:
构造函数不能继承,但是子类一定可以(也必须)借用父类的构造函数。java保证:除了Object类对象,每一个类的实例在构造时,先去调用父类的构造函数。
我们自定义类的构造函数的第一句一定是super(xx,...),如果不是,那么第一句就一定是this(xx,...)去调用本类的另一个构造函数。
如果子类构造函数不显式的调用super(),那么,javac会自动插入super(),也就是父类无参数的构造函数。
对于构造函数,其实类中所有构造函数都是隐式static的。很明显的例证就是 构造函数無需通過实例就可以调用。
六.构造方法:
public final class pet{ class pet extends pett{//次行出现错误 } }
2.用final修饰的方法不能被子类重写。
3.用final修饰的变量,只能赋值一次!!