多态抽象类接口
1:final关键字可以干什么?有什么特点?
修饰类、方法、属性和变量
- final 修饰类,则该类不允许被继承,为最终类
- final 修饰方法,则该方法不允许被覆盖(重写)
- final 修饰属性:则该类的属性不会进行隐式的初始化(类的初始化属性必须有值)或在构造方法中赋值(但只能选其一)
- final 修饰变量,则该变量的值只能赋一次值,即常量
2:final关键字的面试题?
A:修饰局部变量
B:初始化时机
a:基本类型 值不能发生改变
b:引用类型 地址值不能发生改变,但是对象的内容是可以改变的
a:只能初始化一次
b:常见的给值
定义的时候(推荐)
构造方法中
3:多态是什么,前提是什么?
- 允许不同类的对象对同一消息做出响应
- 同一个对象在不同时刻体现出来的不同状态
A:有继承或者实现关系
B:有方法重写
C:有父类或者父接口引用指向子类对象 (向上转型)
4:多态中成员访问的特点?
成员变量
成员方法
静态方法
A:成员变量
编译看左边,运行看左边
B:构造方法
子类的构造都会默认访问父类构造
C:成员方法
编译看左边,运行看右边
D:静态方法
编译看左边,运行看左边
为什么?
因为成员方法有重写
5:多态的好处及弊端?如何解决多态的弊端?
多态的好处:
A:提高代码的维护性(继承体现)
B:提高代码的扩展性(多态体现)
多态的弊端:
父不能使用子的特有功能
现象:子可以当作父使用,父不能当作子使用
6:什么是向上转型?什么是向下转型?
A:向上转型
从子到父
B:向下转型
从父到子
强转符 ()
Man m = (Man)p;
可能ClassCastException异常
使用instanceof在进行向下转型前判断
if(p instnceof Man) {
Man m = (Man)p;
}
7:多态练习
class Animal {
//父类方法
public void bark() {
System.out.println("动物叫!");
}
}
class Dog extends Animal {
//子类重写父类的bark方法
public void bark() {
System.out.println("汪、汪、汪!");
}
//子类自己的方法
public void dogType() {
System.out.println("这是什么品种的狗?");
}
}
public class Test {
public static void main(String[] args) {
Animal a = new Animal();
Animal b = new Dog();
Dog d = new Dog();
a.bark();
b.bark();
//b.dogType();
//b.dogType()编译不通过
d.bark();
d.dogType();
}
}
8:抽象类概述及其特点?
在定义类时,前面加上 abstract 关键字修饰的类叫抽象类
抽象就是看不懂的
A:抽象类和抽象方法必须用关键字abstract修饰
B:抽象类中不一定有抽象方法,但是有抽象方法的类一定是抽象类
C:抽象类不能实例化
D:抽象类的子类
a:是一个抽象类
b:是一个具体类这个类必须重写抽象类中的所有抽象方法
9:抽象类成员特点?
A:成员变量
有变量,有常量
B:构造方法
有构造方法
C:成员方法
有抽象,有非抽象
10:抽象类练习?
// 抽象方法
public abstract class TelePhone {
public abstract void call(); //抽象方法,打电话
public abstract void message(); //抽象方法,发短信
}
// 构建子类,并实现抽象方法
public class CellPhone extends TelePhone {
@Override
public void call() {
System.out.println("我可以打电话!");
}
@Override
public void message() {
System.out.println("我可以发短信!");
}
public static void main(String[] args) {
CellPhone cp = new CellPhone();
cp.call();
cp.message();
}
}
11:抽象类的小问题
A:一个类如果没有抽象方法,可不可以定义为抽象类?如果可以,有什么意义?
B:[abstract不能和哪些关键字共存](https://blog.csdn.net/qq_29842929/article/details/53536807)
可以 不让创建对象
a:final 冲突
b:private 冲突
c:static 无意义
12:接口的概述及其特点?
接口用于描述类所具有的功能,而不提供功能的实现,
功能的实现需要写在实现接口的类中,并且该类必须实现接口中所有的未实现方法
A:接口用关键字interface修饰
interface 接口名 {}
B:类实现接口用implements修饰
class 类名 implements 接口名 {}
C:接口不能实例化
D:接口的实现类
a:是一个抽象类
b:是一个具体类,这个类必须重写接口中的所有抽象方法
13:接口的成员特点?
A:成员变量
只能是常量
默认修饰符:public static final
B:构造方法
没有构造方法
C:成员方法
只能是抽象的
默认修饰符:public abstract
14:接口的练习
// Cat.java
public class Cat implements Animal{
public void eat(){
System.out.println("Cat eats");
}
public void travel(){
System.out.println("Cat travels");
}
public static void main(String[] args) {
Cat cat = new Cat();
cat.eat();
cat.travel();
}
}
15:抽象类和接口的区别?
区别
A:成员区别
抽象类:
接口:
B:关系区别:
类与类:
类与接口:
接口与接口:
C:设计理念不同
抽象类:is a,抽象类中定义的是共性功能
接口:like a,接口中定义的是扩展功能
相同:
都不能创建对象
都可以定义抽象方法,并且一定要在子类中重写
不同:
关键字不同abstract interface
抽象方法中既可以有抽象的方法也可以有普通的方法
接口中中所有的方法都是抽象方法
抽象类的方法可以任意权限,接口中方法只能是public
抽象类只能单继承,接口可以多实现
16:案例
[猫狗案例,加入跳高的额外功能](https://blog.csdn.net/dai_ma_dong/article/details/95896248)
[老师和学生案例,加入抽烟的额外功能](https://blog.csdn.net/qq_23973805/article/details/79121017)
[教练和运动员案例(学生分析然后讲解)](https://blog.csdn.net/lcn_Lynn/article/details/74989842)