不知道这些你就 OUT 了,2019 年最常见又实用的 Android 开发面试题
如果仅是这么写程序,还不是多态,记住实现多态的三要素:继承 重写 父类引用指向子类对象
之后,如果你调用 persion.guitar(),此时在代码的编译阶段,persion 调用的仍然是自己的 guitar(),不是儿子的。而当程序运行时,就是 java XXX, persion 调用的却是儿子的 guitar()。这个动态的过程才是多态 。
Person person;
//父类的引用指向子类的方法;
person = new Student();
//person 类型引用做一个判断
//(1)if(person.eat().size==2 )
{
if(person instanceof Person)
{
person.eat();
}else if(person instanceof Student) {
Student stu = (Student)person;
stu.eat();
}
person.eat();//从代码角度看,此时是父类的引用调用的是父类中的 eat 方法
//(2)子类若覆盖了父类的方法,eat 动态绑定到父类的引用 Person 上,换个名字叫动态绑定
//父类的引用可以调用子类的方法,我们把这一现象成为多态
//从字面意思来理解 person 这个父类的引用一会是 person 一会是 student
//person 有多种状态;
//也叫方法的动态绑定
//继承是通向多态的入口
person.f2();
person.gotobed();
person.eat();
Student stu = new Student();
stu.eat();
stu.gotobed();
//父类的引用能够调用子类的方法
}
Java 中,父类的引用既可以指向父类的对象,也可以指向子类的对象。但子类的引用不能指向父类的对象。
引用类型也可以进行类型转换。
但转换的类型一定具有继承关系,即仅允许父子类之间进行转换。
如果尝试将毫无关联的两个类型进行转换,将会引发编译错误。可以使用 instanceof 来判断引用是否为指定的类型
##问题 4:什么是内部类?内部类的作用 ###答案【答案不唯一,可自己衡量】:
4.1 什么是内部类:将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。
4.2 内部类的作用:
①.成员内部类
成员内部类可以无条件访问外部类的所有成员属性和成员方法(包括 private 成员和静态成员)。当成员内部类拥有和外部类同名的成员变量或者方法时,会发生隐藏现象,即默认情况下访问的是成员内部类的成员。
②.局部内部类
局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内。
③.匿名内部类匿名内部类就是没有名字的内部类
④.静态内部类
指被声明为 static 的内部类,他可以不依赖内部类而实例,而通常的内部类需要实例化外部类,从而实例化。静态内部类不可以有与外部类有
相同的类名。不能访问外部类的普通成员变量,但是可以访问静态成员变量和静态方法(包括私有类型)一个 静态内部类去掉 static 就是成员内部类,他可以自由的引用外部类的属性和方法,无论是静态还是非静态。但是不可以有静态属性和方法、
作用
每个内部类都能独立的继承一个接口的实现,所以无论外部类是否已经继承了某个(接口的)实现,对于内部类都没有影响。内部类使得多继承的解决方案变得完整,
方便将存在一定逻辑关系的类组织在一起,又可以对外界隐藏。
方便编写事件驱动程序
方便编写线程代码
##问题 5:抽象类和接口区别 ###答案【答案不唯一,可自己衡量】:5.1.抽象类是什么:
抽象类不能创建实例,它只能作为父类被继承。抽象类是从多个具体类中抽象出来的父类,它具有更高层次的抽象。从多个具有相同特征的类中抽象出一个抽象类,以这个抽象类作为其子类的模板,从而避免了子类的随意性。
①抽象方法只作声明,而不包含实现,可以看成是没有实现体的虚方法
② 抽象类不能被实例化
③ 抽象类可以但不是必须有抽象属性和抽象方法,但是一旦有了抽象方法,就一定要把这个类声明为抽象类
④ 具体派生类必须覆盖基类的抽象方法
⑤ 抽象派生类可以覆盖基类的抽象方法,也可以不覆盖。如果不覆盖,则其具体派生类必须覆盖它们
5.2.接口是什么:
①接口不能被实例化
② 接口只能包含方法声明
③ 接口的成员包括方法、属性、索引器、事件
④ 接口中不能包含常量、字段(域)、构造函数、析构函数、静态成员
5.3.接口和抽象类的区别:
①抽象类可以有构造方法,接口中不能有构造方法。
②抽象类中可以有普通成员变量,接口中没有普通成员变量
③抽象类中可以包含静态方法,接口中不能包含静态方法
评论