JAVA面试0823Word文件下载.docx
《JAVA面试0823Word文件下载.docx》由会员分享,可在线阅读,更多相关《JAVA面试0823Word文件下载.docx(21页珍藏版)》请在冰豆网上搜索。
.
Java只支持单继承,不支持多继承。
一个类只能有一个父类,不可以有多个父类。
classSubDemoextendsDemo{}//ok
classSubDemoextendsDemo1,Demo2...//error
Java支持多层(重)继承(继承体系)
classA{}
classBextendsA{}
classCextendsB{}
不允许仅仅为了拿别人东西而继承,把要的抽出来.
所属关系:
isa关系
8.子父类中成员的体现
a.先看成员变量
子有就不找父!
子父类中成员变量的内存图解
这种同名情况开发时不会出现,面试时多见
子类不能直接访问父类中私有的内容!
(继承过来了,但其他类不能直接访问)
面试喜欢考
b.成员函数
在子类覆盖方法中,继续使用被覆盖的方法可以通过super.函数名获取。
父类中的私有方法不可以被覆盖。
覆盖的应用
上图的改进,重复代码不用写
C.构造函数
子类中所有的构造函数默认都会访问父类中空参数的构造函数
注意上图中写了super(x)就没有默认的super()了
为什么子类实例化时要访问父类呢?
因为父类的构造函数对自己的东西初始化了!
(拿人家东西必须知道人家咋初始化的)
注意下图结果
classFu
{
Fu()
{
super();
show();
return;
}
voidshow()
System.out.println("
fushow"
);
}
上图中
intnum=8;
//显示初始化在super之后
调用fu的show发现子类有show就用子的,但是num还是默认的0,这样super完了才是num=9;
Zi()
分水岭//-->
通过super初始化父类内容时,子类的成员变量并未显示初始化。
等super()父类初始化完毕后,
//才进行子类的成员变量显示初始化。
ziconsrun...."
+num);
一个对象实例化过程:
Personp=newPerson();
1,JVM会读取指定的路径下的Person.class文件,并加载进内存,
并会先加载Person的父类(如果有直接的父类的情况下).
2,在堆内存中的开辟空间,分配地址。
3,并在对象空间中,对对象中的属性进行默认初始化。
4,调用对应的构造函数进行初始化。
5,在构造函数中,第一行会先到调用父类中构造函数进行初始化。
6,父类初始化完毕后,在对子类的属性进行显示初始化。
7,在进行子类构造函数的特定初始化。
8,初始化完毕后,将地址值赋值给引用变量.
10是从8过度来的
9.final关键字
继承弊端:
打破了封装性。
final关键字:
1,final是一个修饰符,可以修饰类,方法,变量。
2,final修饰的类不可以被继承。
3,final修饰的方法不可以被覆盖。
4,final修饰的变量是一个常量,只能赋值一次。
为什么要用final修饰变量。
其实在程序如果一个数据是固定的,
那么直接使用这个数据就可以了,但是这样阅读性差,所以它该数据起个名称。
而且这个变量名称的值不能变化,所以加上final固定。
写法规范:
常量所有字母都大写,多个单词,中间用_连接。
publicstaticfinaldoubleMY_PI=3.14;
10.抽象类
第三点的好处:
如果想成为犬科的一元,必须具备犬科的特点,否则不让实例化!
抽象类的五个问题
11.抽象类练习
12.接口
abstractclassAbsDemo
abstractvoidshow1();
abstractvoidshow2();
当一个抽象类中的方法都是抽象的时候,这时可以将该抽象类用
另一种形式定义和表示,就是接口interface。
//定义接口使用的关键字不是class,是interface.
对于接口当中常见的成员:
而且这些成员都有固定的修饰符。
1,全局常量:
publicstaticfinal
2,抽象方法。
publicabstract上面的两句可以省略,但是阅读性差
由此得出结论,接口中的成员都是公共的权限.
接口的实现
类与类之间是继承关系,类与接口直接是实现关系。
接口不可以实例化。
只能由实现了接口的子类并覆盖了接口中所有的抽象方法后,该子类才可以实例化。
否则,这个子类就是一个抽象类。
在java中不直接支持多继承,因为会出现调用的不确定性。
所以java将多继承机制进行改良,在java中变成了多实现。
一个类可以实现多个接口。
interfaceA
publicvoidshow();
interfaceZ
publicintadd(inta,intb);
classTestimplementsA,Z//多实现
{
publicintadd(inta,intb)
returna+b+3;
publicvoidshow(){}
一个类在继承另一个类的同时,还可以实现多个接口。
classQ
publicvoidmethod()
{}
abstractclassTest2extendsQimplementsA,Z
接口的出现避免了单继承的局限性。
接口与接口之间是继承关系,而且接口可以多继承
interfaceCC
voidshow();
interfaceMM
voidmethod();
interfaceQQextendsCC,MM//接口与接口之间是继承关系,而且接口可以多继承。
voidfunction();
classWWimplementsQQ
{//覆盖3个方法。
publicvoidshow(){}
publicvoidmethod(){}
publicvoidfunction(){}
支不支持多继承就是看有没有方法体
接口的特点:
(鼠标和笔记本)
●接口是对外暴露的规则。
(插座的插口)
●接口是程序的功能扩展。
(鼠标,硬盘,键盘都可以插)
●接口的出现降低耦合性(鼠标和笔记本的联系程度)
●接口可以用来多实现。
●类与接口之间是实现关系,而且类可以继承一个类的同时实现多个接口。
接口与接口之间可以有继承关系。
抽象类和接口的异同点:
相同点:
都是不断向上抽取而来的。
不同点:
1,抽象类需要被继承,而且只能单继承。
接口需要被实现,而且可以多实现。
2,抽象类中可以定义抽象方法和非抽象方法,子类继承后,可直接使用非抽象方法。
接口中只能定义抽象方法,必须由子类去实现。
3,抽象类的继承,是isa关系,在定义该体系的基本共性内容。
接口的实现是likea关系,在定义体系额外功能。
注意啥时候用抽象类,啥时候用接口!
分析下面的例子:
abstractclass犬
abstractvoid吼叫();
//abstractclass导盲
interface导盲
abstractvoid导盲();
class导盲犬extends犬implements导盲
publicvoid吼叫(){}
publicvoid导盲(){}
接口的应用
interfaceUSB//暴露的规则。
publicvoidopen();
publicvoidclose();
classBookPC
publicstaticvoidmain(String[]args)
useUSB(newUPan());
//功能扩展了。
useUSB(newUsbMouse());
//使用规则。
publicstaticvoiduseUSB(USBu)//接口类型的引用,用于接收(指向)接口的子类对象。
//USBu=newUPan();
if(u!
=null)
{
u.open();
u.close();
}
//一年后。
------------------------------
//实现规则。
/这些设备和电脑的耦合性降低了。
classUPanimplementsUSB
publicvoidopen()
upanopen"
publicvoidclose()
upanclose"
classUsbMouseimplementsUSB
UsbMouseopen"
UsbMouseclose"