继承概述
通过扩展一个类来建立另外一个类的过程,叫做继承
(
inheritance
)
通俗地说,所谓继承,就是让类与类之间产生父子关系。
被继承的类叫做
父类
(基类、超类) 继承的类叫做
子类
(派生类)
格式(
extends
)
![](https://i-blog.csdnimg.cn/blog_migrate/453533782f636f450d40902f4b5e0894.png)
子类继承父类之后有什么效果?
子类拥有了父类的
非私有
成员(成员变量、成员方法)
继承的使用场景
子类通过继承,拥有了父类的非私有成员,这是开发中常见的做法,
那么,继承还有哪些使用场景呢?
向上抽取:
多个类中存在相同的属性和行为时,可以将这些内容提取出来放到一个新类中,让这些类和新类产生父
子关系,实现代码复用。
向下扩展:
当需要扩展已有的类的功能时,可以通过继承已有的类,在子类中添加新功能或重新实现已有功能,对
父类(已有的类)没有影响
继承的传递性
![](https://i-blog.csdnimg.cn/blog_migrate/0ecbe6a9866070ae19df77e34c3ffb0e.png)
package com.bigdata.demo3;
public class A extends B {
String a;
}
package com.bigdata.demo3;
public class B extends C {
String b; }
package com.bigdata.demo3;
public class C {
String c;
}
package com.bigdata.demo3;
public class Test {
public static void main(String[] args) {
// C c = new C();
// String c1 = c.c;
// B b = new B();
// String b1 = b.b;
// String c = b.c;
A a = new A();
String a1 = a.a;
}
}
继承关系中子父类成员变量的使用
需求:子父类中定义了同名的成员变量,如何使用?
分析:
A
:子类中定义成员变量
int price
,默认值为
10
B
:父类中定义成员变量
int price
,默认值为
20
C
:子类成员方法中定义局部变量
int price
,值为
5
D
:在子类成员方法中分别输出三个
price
的值
结论
1
查找变量的原则: 就近原则
2
查找变量的顺序: 局部变量
,
成员变量
,
父类
3
访问父类变量的方式:
super.
父类变量名
;
4 super
: 当前对象父类的引用(父类内存空间的标识)
5
对象初始化顺序: 先初始化父类内容,再初始化子类内容
package com.bigdata.demo2;
public class Parent {
double price = 30;
}
package com.bigdata.demo2;
public class Children extends Parent {
double price = 20;
public void test(double price) {
System.out.println(price); // 10.0
// this: 不看局部变量, 从本类中找成员, 如果找不到, 到父类里面去找
System.out.println(this.price); // 20.0
// super: 从父类开始找
System.out.println(super.price);
}
}
package com.bigdata.demo2;
public class Test {
public static void main(String[] args) {
Children children = new Children();
// System.out.println("children.price = " + children.price);
children.test(10);
}
}
继承关系中子父类成员方法的使用
需求:子父类中定义了同名的成员方法,如何使用?
结论
1
查找方法的原则: 就近原则
2
查找方法的顺序: 本类
,
父类
3
访问父类方法的方式:
super.
父类方法名
();
4
定义重名方法的前提: 父类功不能完全满足现实需求,扩展父类
功能 父类功能已过时,重新实现父类功能
继承关系中子父类构造方法的使用
需求:创建对象时,构造方法是如何被调用的?
继承关系中子父类构造方法的使用
需求:继承关系中
,
创建对象时,构造方法的调用顺序
?
需求:父类不存在默认无参构造方法怎么办?
子类创建对象时,必须先初始化该对象的父类内容,若父类中不存在默认无参构造,须手动调用父类其 它构造。
方法重写(
Override
)
定义:
子类中出现和父类方法定义相同的方法的现象
解释:
方法重写也叫方法的复写、覆盖
方法名、参数列表、返回值类型都相同
注意事项:
1
父类私有方法无法重写
2
子类方法访问权限不能小于父类方法
3
子类不能比父类方法抛出更大的异常(了解)
使用场景:
扩展父类功能 父类功能过时,重新实现父类功能
Java
中的访问权限修饰符
![](https://i-blog.csdnimg.cn/blog_migrate/1e339c8901a70795d0a0f8a4ab2ce758.png)
方法重写和方法重载的区别
![](https://i-blog.csdnimg.cn/blog_migrate/9c40be9d48763500c96652bcce15efca.png)
Java
中继承的特点
单继承
Java
只支持类的单继承
私有成员不能继承
只能继承父类的非私有成员(成员变量、成员方法)
构造方法不能继承
构造方法用于初始化本类对象。