继承
继承是面向对象编程中非常强大的一种机制,它首先可以复用代码。当我们让子类
从父类
继承时,子类
就获得了父类
的所有功能,我们只需要为子类
编写新增的功能。
Java使用extends
关键字来实现继承
通过继承,子类
只需要编写额外的功能,不再需要重复代码。
注意:子类自动获得了父类的所有字段,严禁定义与父类重名的字段!
在OOP的术语中,我们把Person
称为超类(super class),父类(parent class),基类(base class),把Student
称为子类(subclass),扩展类(extended class)。
Java只允许一个class继承自一个类,因此,一个类有且仅有一个父类。只有Object
特殊,它没有父类。除了Object
,都会继承自某个类。
protected
继承有个特点,就是子类无法访问父类的private
字段或者private
方法。
例如,Student
类就无法访问Person
类的name
和age
字段这使得继承的作用被削弱了。为了让子类可以访问父类的字段,我们需要把private
改为protected
。用protected
修饰的字段可以被子类访问
因此,protected
关键字可以把字段和方法的访问权限控制在继承树内部,一个protected
字段和方法可以被其子类,以及子类的子类所访问
super
super
关键字表示父类(超类)。子类引用父类的字段时,可以用super.fieldName
。
在Java中,任何class
的构造方法,第一行语句必须是调用父类的构造方法。如果没有明确地调用父类的构造方法,编译器会帮我们自动加一句super();
class Student extends Person {
protected int score;
public Student(String name, int age, int score) {
super(name, age); // 调用父类的构造方法Person(String, int)
this.score = score;
}
}
如果父类没有默认的构造方法,子类就必须显式调用super()
并给出参数以便让编译器定位到父类的一个合适的构造方法。
子类不会继承任何父类的构造方法。子类默认的构造方法是编译器自动生成的,不是继承的。
子父类中成员函数的特点
当子父类中出现成员函数一模一样的情况,会运行子类的函数。 这种现象,称为覆盖操作。这时函数在子父类中的特性。
-
函数两个特性:
1,重载。同一个类中。overload
2,覆盖。子类中。覆盖也称为重写,覆写。
-
override 覆盖注意事项:
1,子类方法覆盖父类方法时,子类权限必须要大于等于父类的权限。
2,静态只能覆盖静态,或被静态覆盖。
当对一个类进行子类的扩展时,子类需要保留父类的功能声明, 但是要定义子类中该功能的特有内容时,就使用覆盖操作完成.
子父类中静态成员的特点
static数据成员在类的内部声明,但只能在类的外部定义,在类的外部不能指定static,在类的定义时候进行初始化;
static数据成员只能在类的外部进行初始化
(1) static 成员函数没有 this 形参,它可以访问所属类的 static 成员,但不能访问非 static 成员。
(2)static成员函数既可以在类的内部定义,也可以在类的外部定义,在外部定义时,不能重复指定static保留字。
(3)static成员函数不能声明为虚函数,不能实现动态绑定
(4)static 成员函数不能声明为const,因为const是针对this是不是const而言的
(5)构造函数、析构函数不能为静态函数。
公有继承的私有成员不能被继承,无法访问
公有继承的保护成员,只能在派生类中访问,不能用派生类对象访问
私有继承的公有成员,成员被私有化,无法访问
静态函数不存在重载