Java SE面向对象部分18面向对象高级06.docx
《Java SE面向对象部分18面向对象高级06.docx》由会员分享,可在线阅读,更多相关《Java SE面向对象部分18面向对象高级06.docx(11页珍藏版)》请在冰豆网上搜索。
![Java SE面向对象部分18面向对象高级06.docx](https://file1.bdocx.com/fileroot1/2022-11/16/90d99bae-5bfa-40d6-af97-de99987e62f8/90d99bae-5bfa-40d6-af97-de99987e62f81.gif)
JavaSE面向对象部分18面向对象高级06
JavaSE面向对象部分-18.面向对象高级(06)
上季内容回顾:
1、面向对象中接口与抽象类的具体应用。
可以通过对象的多态性,为父类实例化,之后一切的操作标准以父类为主。
本季主要知识点:
讲解抽象类与接口的关系。
1、一个抽象类中能否包含一个接口呢?
abstractclassA
{
publicabstractvoidfun();
interfaceB
{
publicvoidprint();
}
}
我们来验证测试下哈~发现生成A$B.class,表示B作为A的内部接口,证明一个抽象类中可以包含一个内部接口。
那怎么使用呢?
我们看下面哈~
首先我们先子类X覆写父类A方法但不覆写接口B中的方法
abstractclassA
{
publicabstractvoidfun();
interfaceB
{
publicvoidprint();
}
}
classXextendsA
{
//覆写父类fun()方法
publicvoidfun()
{
System.out.println("HelloWorld!
!
!
");
}
}
发现编译没有问题哈~
现在我们测试覆写接口方法哈~
abstractclassA
{
publicabstractvoidfun();
interfaceB
{
publicvoidprint();
}
}
classXextendsA
{
//覆写父类fun()方法
publicvoidfun()
{
Bb=newY();
b.print();
}
classYimplementsB
{
//覆写父类接口中的方法print()
publicvoidprint()
{
System.out.println("HelloJava!
!
!
");
}
}
}
现在我们加上主方法进行测试哈~
abstractclassA
{
publicabstractvoidfun();
interfaceB
{
publicvoidprint();
}
}
classXextendsA
{
//覆写父类fun()方法
publicvoidfun()
{
Bb=newY();
b.print();
}
classYimplementsB
{
//覆写父类接口中的方法print()
publicvoidprint()
{
System.out.println("HelloJava!
!
!
");
}
}
}
publicclassDemo01
{
publicstaticvoidmain(Stringargs[])
{
Aa=newX();
a.fun();
}
}
证明一个抽象类中可以包含一个接口,之后在抽象类的子类中可以有选择的是否实现抽象类中的接口。
2、一个接口中能否包含一个抽象类呢?
同上,都是可以选择是否实现
interfaceA
{
publicvoidfun();
abstractclassB
{
publicabstractvoidprint();
}
}
下面我们写上个子类,检验一下是否可以有选择实现抽象类B
interfaceA
{
publicvoidfun();
abstractclassB
{
publicabstractvoidprint();
}
}
classXimplementsA
{
publicvoidfun()
{
}
}
验证可以哈~
下面覆写抽象类B中print()方法
interfaceA
{
publicvoidfun();
abstractclassB
{
publicabstractvoidprint();
}
}
classXimplementsA
{
publicvoidfun()
{
newY().print();
}
classYextendsB
{
publicvoidprint()
{
System.out.println("HelloWorld!
!
!
");
}
}
}
publicclassDemo02
{
publicstaticvoidmain(Stringargs[])
{
Aa=newX();
a.fun();
}
}
3、观察以下的程序,验证输出结果
abstractclassA
{
publicA()
{
this.print();
}
publicabstractvoidprint();
}
classBextendsA
{
privateinti=30;
publicB(inti)
{
this.i=i;
}
publicvoidprint()
{
System.out.println("i="+i);
}
}
publicclassDemo03
{
publicstaticvoidmain(Stringargs[])
{
newB(50);
}
}
输出结果为0哈,这与子类对象实例化过程有关哈
回顾:
子类对象的实例化过程
·子类对象使用new关键字要调用构造方法
· 调用构造方法时的顺序:
先去调用父类中的构造方法(默认为无参构造),之后再调用子类中的构造方法。
·调用构造方法的目的:
为其内部的属性初始化
·子类中的属性在没有完成父类中的构造方法之前,所有的内容都是默认值,整型是“0”。
思考:
我们知道一个子类如果实现了一个接口则肯定要覆写接口中的全部抽象方法。
那问?
是否可以采用一种方式,让子类可以有选择的去覆写自己真正需要的方法。
interfaceDoor
{
//开门
publicvoidopenDoor();
//关门
publicvoidcloseDoor();
//维修
publicvoidrepairDoor();
//拆除
publicvoidremoveDoor();
//锁门
publicvoidlockDoor();
}
classDimplementsDoor
{
//子类现在肯定要覆写里面全部的抽象方法
}
矛盾点:
·子类不需要覆写全部的方法
·如果子类直接实现了接口则肯定要覆写全部的方法
·解决:
如果中间加入了一个过渡端呢?
接口 -->过渡端-->子类
|- 此过渡端不应该被直接使用。
-->抽象类
过渡端使用抽象类实现最合适,因为抽象类可以实现一个接口同时可以有一些抽象方