类的继承
继承是面向对象三大特征之一,是实现软件服用的重要手段,继承使用extends关键字。
继承的特点:
- Java继承既有单继承的特点,每个子类只有一个直接父类
- 子类是一种特殊的父类,因此父类包含的范围比子类大,所以认为父类是大类,子类是小类
- 子类扩展了父类,可以获得父类全部的成员变量和方法
- 如果定义了一个java类,并没有显示地指出它的父类,则这个类默认扩展为Object类
类的继承语法格式:
下面看一个简单的继承的例子
class Person{
String name;
int age;
}
class Student extends Person{
void study(){
System.out.println("good study");
}
}
class Worker extends Person{
void work(){
System.out.println("good work");
}
}
public class ExtendDemo {
public static void main(String[] args) {
Student s=new Student();
s.study();
}
}
这里有三个类,Person,Student,Worker,每个类都有name和age属性,但由于Student和Worker是Person的子类,所以可以直接继承父类中的属性,子类中就可以不用再写name和age,降低了重复代码
方法重写
大部分时候子类需要以父类为基础,增加新的成员变量和方法,有时子类会包含与父类同名的方法,这种现象称为方法重写,
方法重写遵循的原则:
- 被重写方法与重写方法方法名相同,形参列表相同
- 重写的子类方法返回值类型应给比父类方法返回值类型更小或相等,子类方法声明抛出的异常类应该比父类方法声明抛出的异常类更小或相等
- 子类方法的访问权限应该比父类方法的访问权限更大或相等
- 被覆盖方法要么都是类方法,要么都是实例方法
下面看一段代码
class Person{
String name;
int age;
void study(){
System.out.println("person study");
}
}
class Student extends Person{
void study(){
super.study();
System.out.println("student study");
}
}
public class ExtendDemo {
public static void main(String[] args) {
Student s=new Student();
s.study();
}
}
在上面代码中,student重写了person的study方法,程序将输出person study和student study。
super关键字
如果需要在子类中调用父类被覆盖的实例方法,则可以使用super限定来调用父类被覆盖的实例方法。
子父类出现后,类成员的特点
1.变量
如果子类中出现非私有的同名成员变量,子类访问本类中的变量用this,子类访问父类中的变量用super
看下面的代码:
class Fu{
int num=4;
}
class Zi extends Fu{
int num=5;
void show(){
System.out.println(super.num);
}
}
public class ExtendDemo {
public static void main(String[] args) {
Zi z=new Zi();
z.show();
}
}
2.函数
当子类出现和父类一样的函数时,当子类对象调用该函数,会运行子类函数的内存,覆盖了父类函数
详细注意事项见上面
3.构造函数
final关键字
final作为修饰符,可以修饰类,函数和变量,被final修饰的类不可以被继承,被final修饰的方法不可以被复写,被final赋值的变量是一个常量,只能赋值一次,既可以修饰成员变量,又可以修饰局部变量