1.继承的概念
把多个类中相同的成员给提取出来定义到一个独立的类中。然后让这多个类和该独立的类产生一个关系,多个类就具备了这些内容。这个关系叫继承。
用extends关键字表示,格式: class 类名 extends 父类
2.继承的好处
a: 提高了代码的复用性;
b:提高了代码的可维护性;
c:一个类继承一个类是多态的前提;
3.继承的弊端
a:让类的耦合性增强。这样某个类的改变,就会影响其他和该类相关的类;
b:打破了分装性;
4.java中继承的特点
a:一个类只能继承一个类,单继承;
b:可以多层继承,继承体系;
5.继承的注意事项
a:子类不能继承父类的私有成员;
b:子类不能继承父类的构造方法,但可以通过super()去调用;
c:不要为了部分功能而去继承;
6.继承中的成员关系
a:成员变量:
通过子类的方法访问成员变量的顺序:先找子类方法的局部范围内找,有就使用;再去子类的成员范围找,有就使用;再去父类的成员范围内找,有就使用;找不到就报错;
b:构造方法:
子类的构造方法会默认调用父类的无参构造,是为了子类访问父类数据的初始化,如果父类没有无参构造,在子类构造方法中用super指定调用父类的带参数的构造方法,或者是之类构造方法通过this调用自己的构造方法,这个被调用的构造方法一定会有一个访问了父类的带参构造方法;
c:成员方法:
通过子类对象访问成员方法的顺序:先在子类中找,有就使用;再去父类中找,有就使用;找不到报错;
7.Override和Overload的区别
Override方法重写:在子类中出现了和父类中一模一样的方法声明的方法;
注意事项:
a:子类不能重写父类的私有方法(因为私有方法不能被继承);
b:子类重写父类方法时访问权限不能更低,最好一致;
c:父类静态方法,子类也必须通过静态方法进行重写,其实这个算不上方法重写,但是现象确实如此
Overload方法重载:在一个类中出现了方法名称一样的方法;
8.this和super
this:代表当前类的对象引用;
super:代表父类存储空间的标识(可以理解为父类的引用,可以访问父类的)
9.分析执行结果
- 1.案例
class Fu {
static {
System.out.println("静态代码块Fu");
}
{
System.out.println("构造代码块Fu");
}
public Fu() {
System.out.println("构造方法Fu");
}
}
class Zi extends Fu {
static {
System.out.println("静态代码块Zi");
}
{
System.out.println("构造代码块Zi");
}
public Zi() {
System.out.println("构造方法Zi");
}
}
class ExtendsTest2 {
public static void main(String[] args) {
Zi z = new Zi();
}
}
分析:
a: 类加载的时候执行静态代码块,静态代码块被优先加载;
b:初始化子类的时候先初始化父类(分层加载);
c:静态代码块构造代码块构造方法执行顺序:静态代码块 > 构造代码块 > 构造方法;
输出结果:
静态代码块Fu
静态代码块Zi
构造代码块Fu
构造方法Fu
构造代码块Zi
构造方法Zi
- 2.案例
class F{
A a = new A();
F(){
System.out.println("F1");
}
F(int age){
System.out.println("F2");
}
}
class Z extends F{
A a = new A();
Z(){
//super(1); 这时执行的是 F2
System.out.println("Z");
}
}
class A{
A(){
System.out.println("A");
}
}
class ExtendsDemo1{
public static void main(String[] args){
new Z();
}
}
分析:
a:类初始化过程:成员变量初始化-构造方法初始化;
b:子类的初始化:先进行父类初始化,然后进行子类初始化(分层初始化);
输出结果:
AF1AZ
网友评论