java继承基础概述.docx
- 文档编号:3507966
- 上传时间:2022-11-23
- 格式:DOCX
- 页数:15
- 大小:18.44KB
java继承基础概述.docx
《java继承基础概述.docx》由会员分享,可在线阅读,更多相关《java继承基础概述.docx(15页珍藏版)》请在冰豆网上搜索。
java继承基础概述
1继承思想
首先我来写两个代码:
//定义学生类
classStudent{
Stringname;
intage;
publicStudent(){}
//getXxx()/setXxx()
publicvoideat(){
System.out.println("吃饭");
}
}
//定义老师类
classTeacher{
Stringname;
intage;
publicTeacher(){}
//getXxx()/setXxx()
publicvoideat(){
System.out.println("吃饭");
}
}
我们观察上面两个代码:
发现name,age成员变量,以及getXxx()/setXxx(),还有eat()等都是相同的。
如果我们后来继续定义类,举例:
工人类,军人类。
他们是不是也具备这些内容。
那么,我们每一次定义这样的类的时候,都要把这些重复的内容都重新定义一遍。
麻烦不?
麻烦。
所以,我们要考虑改进?
如何改进呢?
我这想的:
我能不能把这些相同的内容给定义到一个独立的类中。
然后,让这多个类和这个独立的类产生一个关系,有了这个关系后,
这多个类就可以具备这个独立的类的功能。
为了实现这个效果,java就提供了一个技术:
继承。
父亲:
4个儿子
继承怎么表示呢?
继承的格式是什么样子的呢?
classFu{}
classZiextendsFu{
}
我们就回头修改我们的代码:
classPerson{
Stringname;
intage;
publicPerson(){}
//getXxx()/setXxx()
publicvoideat(){
System.out.println("吃饭");
}
}
classStudentextendsPerson{
publicStudent(){}
}
classTeacherextendsPerson{
publicTeacher(){}
}
2方法重写与方法构造
1:
方法重写和方法重载的区别?
方法重载能改变返回值类型吗?
方法重写:
在子类中,出现和父类中一模一样的方法声明的现象。
方法重载:
同一个类中,出现的方法名相同,参数列表不同的现象。
方法重载能改变返回值类型,因为它和返回值类型无关。
Override:
方法重写
Overload:
方法重载
2:
this关键字和super关键字分别代表什么?
以及他们各自的使用场景和作用。
this:
代表当前类的对象引用
super:
代表父类存储空间的标识。
(可以理解为父类的引用,通过这个东西可以访问父类的成员)
场景:
成员变量:
this.成员变量
super.成员变量
构造方法:
this(...)
super(...)
成员方法:
this.成员方法
super.成员方法
3成员变量的问题
/*
看程序写结果:
A:
成员变量的问题
intx=10;//成员变量是基本类型
Students=newStudent();//成员变量是引用类型
B:
一个类的初始化过程
成员变量的初始化
默认初始化
显示初始化
构造方法初始化
C:
子父类的初始化(分层初始化)
先进行父类初始化,然后进行子类初始化。
结果:
YXYZ
问题:
虽然子类中构造方法默认有一个super()
初始化的时候,不是按照那个顺序进行的。
而是按照分层初始化进行的。
它仅仅表示要先初始化父类数据,再初始化子类数据。
*/
classX{
Yb=newY();
X(){
System.out.print("X");
}
}
classY{
Y(){
System.out.print("Y");
}
}
publicclassZextendsX{
Yy=newY();
Z(){
//super
System.out.print("Z");
}
publicstaticvoidmain(String[]args){
newZ();
}
}
4继承概述
/*
继承概述:
把多个类中相同的内容给提取出来定义到一个类中。
如何实现继承呢?
Java提供了关键字:
extends
格式:
class子类名extends父类名{}
好处:
A:
提高了代码的复用性
B:
提高了代码的维护性
C:
让类与类之间产生了关系,是多态的前提
类与类产生了关系,其实也是继承的一个弊端:
类的耦合性增强了。
开发的原则:
低耦合,高内聚。
耦合:
类与类的关系
内聚:
就是自己完成某件事情的能力
*/
//使用继承前
/*
classStudent{
publicvoideat(){
System.out.println("吃饭");
}
publicvoidsleep(){
System.out.println("睡觉");
}
}
classTeacher{
publicvoideat(){
System.out.println("吃饭");
}
publicvoidsleep(){
System.out.println("睡觉");
}
}
*/
//使用继承后
classPerson{
publicvoideat(){
System.out.println("吃饭");
}
publicvoidsleep(){
System.out.println("睡觉");
}
}
classStudentextendsPerson{}
classTeacherextendsPerson{}
classExtendsDemo{
publicstaticvoidmain(String[]args){
Students=newStudent();
s.eat();
s.sleep();
System.out.println("-------------");
Teachert=newTeacher();
t.eat();
t.sleep();
}
}
5继承特点
/*
Java中继承的特点:
A:
Java只支持单继承,不支持多继承。
有些语言是支持多继承,格式:
extends类1,类2,...
B:
Java支持多层继承(继承体系)
*/
/*
classFather{}
classMother{}
classSonexntedsFather{}//正确的
classSonextendsFather,Mother{}//错误的
*/
classGrandFather{
publicvoidshow(){
System.out.println("我是爷爷");
}
}
classFatherextendsGrandFather{
publicvoidmethod(){
System.out.println("我是老子");
}
}
classSonextendsFather{}
classExtendsDemo2{
publicstaticvoidmain(String[]args){
Sons=newSon();
s.method();//使用父亲的
s.show();//使用爷爷的
}
}
6继承注意事项
/*
继承的注意事项:
A:
子类只能继承父类所有非私有的成员(成员方法和成员变量)
B:
子类不能继承父类的构造方法,但是可以通过super(马上讲)关键字去访问父类构造方法。
C:
不要为了部分功能而去继承
classA{
publicvoidshow1(){}
publicvoidshow2(){}
}
classB{
publicvoidshow2(){}
publicvoidshow3(){}
}
//我们发现B类中出现了和A类一样的show2()方法,所以,我们就用继承来体现
classBextendsA{
publicvoidshow3(){}
}
这样其实不好,因为这样你不但有了show2(),还多了show1()。
有可能show1()不是你想要的。
那么,我们什么时候考虑使用继承呢?
继承其实体现的是一种关系:
"isa"。
Person
Student
Teacher
水果
苹果
香蕉
橘子
采用假设法。
如果有两个类A,B。
只有他们符合A是B的一种,或者B是A的一种,就可以考虑使用继承。
*/
classFather{
privateintnum=10;
publicintnum2=20;
//私有方法,子类不能继承
privatevoidmethod(){
System.out.println(num);
System.out.println(num2);
}
publicvoidshow(){
System.out.println(num);
System.out.println(num2);
}
}
classSonextendsFather{
publicvoidfunction(){
//num可以在Father中访问private
//System.out.println(num);//子类不能继承父类的私有成员变量
System.out.println(num2);
}
}
classExtendsDemo3{
publicstaticvoidmain(String[]args){
//创建对象
Sons=newSon();
//s.method();//子类不能继承父类的私有成员方法
s.show();
s.function();
}
}
7类的组成
/*
类的组成:
成员变量:
构造方法:
成员方法:
而现在我们又讲解了继承,所以,我们就应该来考虑一下,类的组成部分的各自关系。
继承中成员变量的关系:
A:
子类中的成员变量和父类中的成员变量名称不一样,这个太简单。
B:
子类中的成员变量和父类中的成员变量名称一样,这个怎么玩呢?
在子类方法中访问一个变量的查找顺序:
a:
在子类方法的局部范围找,有就使用
b:
在子类的成员范围找,有就使用
c:
在父类的成员范围找,有就使用
d:
如果还找不到,就报错。
*/
classFather{
publicintnum=10;
publicvoidmethod(){
intnum=50;
}
}
classSonextendsFather{
publicintnum2=20;
publicintnum=30;
publicvoidshow(){
intnum=40;
System.out.println(num);
System.out.println(num2);
//找不到符号
System.out.println(num3);
}
}
classExtendsDemo4{
publicstaticvoidmain(String[]args){
//创建对象
Sons=newSon();
s.show();
}
}
8成员的范围
/*
问题是:
我不仅仅要输出局部范围的num,还要输出本类成员范围的num。
怎么办呢?
我还想要输出父类成员范围的num。
怎么办呢?
如果有一个东西和this相似,但是可以直接访问父类的数据就好了。
恭喜你,这个关键字是存在的:
super。
this和super的区别?
分别是什么呢?
this代表本类对应的引用。
super代表父类存储空间的标识(可以理解为父类引用,可以操作父类的成员)
怎么用呢?
A:
调用成员变量
this.成员变量调用本类的成员变量
super.成员变量调用父类的成员变量
B:
调用构造方法
this(...)调用本类的构造方法
super(...)调用父类的构造方法
C:
调用成员方法
this.成员方法调用本类的成员方法
super.成员方法调用父类的成员方法
*/
classFather{
publicintnum=10;
}
classSonextendsFather{
publicintnum=20;
publicvoidshow(){
intnum=30;
System.out.println(num);
System.out.println(this.num);
System.out.println(super.num);
}
}
classExtendsDemo5{
publicstaticvoidmain(String[]args){
Sons=newSon();
s.show();
}
}
9继承中构造方法的关系
/*
继承中构造方法的关系
A:
子类中所有的构造方法默认都会访问父类中空参数的构造方法
B:
为什么呢?
因为子类会继承父类中的数据,可能还会使用父类的数据。
所以,子类初始化之前,一定要先完成父类数据的初始化。
注意:
子类每一个构造方法的第一条语句默认都是:
super();
*/
classFather{
intage;
publicFather(){
System.out.println("Father的无参构造方法");
}
publicFather(Stringname){
System.out.println("Father的带参构造方法");
}
}
classSonextendsFather{
publicSon(){
//super();
System.out.println("Son的无参构造方法");
}
publicSon(Stringname){
//super();
System.out.println("Son的带参构造方法");
}
}
classExtendsDemo6{
publicstaticvoidmain(String[]args){
//创建对象
Sons=newSon();
System.out.println("------------");
Sons2=newSon("林青霞");
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 继承 基础 概述