1.概述
概念:如果B类继承A类,那么B类将具有A类的所有方法,同时还可以扩展自己独有的方法和属性。这时把A称为"B的子类",把B称为"A的父类"。
单继承和多继承
单继承:一个子类中只有一个直接父类
多继承:一个类中有多个直接父类
java不支持多继承,多个父类有相同成员时会产生调用的不确定性,使用多态改进
代码示例:
class A {
void show() {
System.out.println("A run");
}
}
class B {
void show() {
System.out.println("B run");
}
}
class C extends A,B{
new C().show();//无法确定是A还是B的show方法
}
java支持多重继承 即C继承B,B继承A
当使用一个继承体系时:
a.查看该体系中的顶层类,了解该体系的基本功能
b.创建体系中的最底层子类对象,完成功能的使用
2.好处
a.提高代码复用性
b.类与类之间产生关系,给多态提供前提
3.super关键字
当子类的成员和局部变量同名时,用this区分;当子父类中的成员变量同名时,用super区分
this代表一个本类对象的引用;super代表一个父类的空间
代码示例:
class Fu {
int age = 40;
}
class Zi extends Fu {
int age = 18;
void show() {
System.out.println("Son:" + this.age + " Father:" + super.age);
}
}
class ExtendsDemo {
public static void main(String[] args){
Zi z=new Zi();
z.show();
}
4.函数覆盖
当父类中出现和子类成员函数函数名、参数完全相同的情况,会运行子类的函数,这种现象叫做覆盖(重写)override
注意事项:
a.子类方法覆盖父类方法时,子类权限必须大于等于父类的权限
b.静态只能覆盖静态,或被静态覆盖
什么时候使用覆盖:
当对一个类进行子类的扩展,子类就要保留父类的功能声明,但是要定义子类中该功能的特有内容时,就用覆盖操作完成
代码示例
class Fu {
void show() {
System.out.println("fu show run");
}
}
class Zi extends Fu {
void show() {
System.out.println("zi show run");
}
}
public class ExtendsDemo {
public static void main(String[] args) {
Zi z = new Zi();
z.show();
}
}
5.子类的实例化过程
代码示例:
class Fu {
Fu() {
super();
show();
return;
}
void show() {
System.out.println("fu show");
}
}
class Zi extends Fu {
int num = 8;
Zi() {
super();
num = 10;
System.out.println("zi show..." + num);
return;
}
}
public class ExtendsDemo {
public static void main(String[] args) {
Zi z = new Zi();
}
}
图解:
初始化顺序:子类属性默认初始化>父类构造函数初始化>子类属性显式初始化
6.final关键字
特点:
a.final可以修饰类、方法和变量
b.final修饰的类不可以被继承
c.final修饰的方法不可以被覆盖
d.final修饰的变量是一个常量,只能被赋值一次
e. 内部类只能访问被final修饰的局部变量