抽象方法和抽象类概述
抽象方法的概念:被 abstract 修饰的,没有方法体,只有方法声明的对象.
格式:修饰符 abstract返回值类型(参数列表 可无参)
抽象类
作用: 用来描述一种数据类型应该具备的基本特征(成员变量)和行为(成员方法)。如何实现这些功能是由子类通过方法重写完成。
特点:* 抽象类和抽象方法都必须使用abstract关键修饰。
* 子类继承抽象类时,要重写抽象类中的所有抽象方法,如果没有重写所有的抽象方法,则该子类也必须定义为抽象类。
* 抽象类不能直接创建对象,原因:因为调用抽象方法没有任何意义。
抽象类常见问题
抽象类不能创建对象,抽象类中有没有构造方法,如果有,构造方法有什么意义?
答:有,抽象类中的构造方法可以让子类间接访问,传递参数给父类的成员变量赋值。
抽象类一定是一个父类吗?
答:一定是父类,要不该类就没有意义。
抽象类中可以没有抽象方法吗?
答:可以没有抽象方法。使用场景:适配器模式
抽象类中可以有普通方法(有方法体的方法)吗?
答:可以
抽象关键字(abstract)不可以和哪些关键字一起使用?
答:不能和private关键一起使用。因为private修饰的方法不能被子类重写,而abstract修饰的方法必须由子类重写,这样就相互矛盾。
接口的概述
概念
接口可以当成一种数据类型,可以当成类使用,
是比抽象类更加抽象类数据类型。
接口是功能的集合,只描述功能应该具备的方法,方法是没有实现的,如何实现接口中的方法由实现类(可以理解接口的子类)通过方法重写完成。
格式
定义格式
public interface 接口名{
// 抽象方法1
// 抽象方法2
….
}
使用格式
public class 类名 implements 接口名{
// 重写接口中抽象方法
}
注意事项
* 实现类实现接口时要重写接口中的所有抽象方法,否则该类必须定义抽象类
* 一个类在继承一个类的同时可以实现多个接口。(单继承,多实现)
* 接口可以继承接口,而且可以多继承。
特点
* 接口中没有构造方法
* 在JDK1.8之前,接口中的所有方法都是抽象方法,在在、JDK1.8(包括1.8)后,接口中的方法可以有默认实现。
* 接口中定义的变量是常量了。ll
* 接口中的成员都有默认的修饰符
* 抽象方法:public abstract (实现类重写接口方法时,权限修饰符必须是public)
* 成员变量(常量): public static final
接口和抽象类的区别(面试题)
相同点
都不能创建对象。
都可以定义抽象方法。
不同点
抽象类可以定义构造方法,接口不能定义构造方法。
抽象类只能单继承,接口可以多继承接口。
抽象类可以有普通方法,在JDK1.8之前,接口中的所有方法都是抽象方法,在在、JDK1.8(包括1.8)后,
接口中的方法可以有普通方法。
抽象类可以定义成员变量,接口中的变量就变成了常量。
抽象类的成员没有默认的修饰符,接口中的成员有默认的修饰符。
抽象类可以实现接口,接口不能继承抽象类。
如何选择抽象类和接口?
先判断方法(功能)是否是该种数据类型及其子类类型共性内如果是该数据类型及其子类类型都具备的,则该方法就应该定义在父类中,然后再判断该方法是否会被所有子类类型重写,如果是,则就应该将该方法定义为抽象方法,那么该类就必须定义抽象类。如果不是该种数据类型及其子类类型共性的,那么该方法就应该定义在接口中,然后需要该功能了类来实现接口重写方法即可。
*多态
概述: 面向对象的三大特征之一,同一种事物表现出多种形态
前提:
*必须有子父类或实现接口的关系
*方法的重写
*父类应用指向子类对象
格式: Father s=new Son();
注意事项:
* 在多态情况下,如果父类和子类出现同名的成员变量时,访问成员变量时访问的是父类成员变量。
* 在多态情况下, 如果父类和子类出现方法声明一样的方法,调用方法时调用的是子类重写后的方法
成员变量,编译看左边,运行看左边。
成员方法,编译看左边,运行看右边
*成员变量属于静态绑定
* 成员方法属于动态绑定
多态的优点和缺点
优点:
提高了代码的复用性。
提高了代码的维护性。
提高了代码的扩展
缺点:不能访问子类特有的成员(成员方法和成员变量)
多态的使用场景
作为方法的形式参数
多态作为方法的形式参数,可以接受更多的数据类型的对象。
作为方法的返回值类型
多态作为方法的返回值类型,可以返回更多数据类型的对象。
多态的转型
分类
* 向上转型:父类引用指向子类对象的过程就是向上转型的结果。
* 比如:Animal a = new Dog();
* 向下转型: 将已经向上转型的类型,强制转换为子类类型的过程。
* 基本数据类型强制格式:long a = 100L; int b = (int)a;
* 向下转型格式: 子类类型 对象名 = (子类类型)父类引用;
* 比如:Animal a = new Dog(); ==> Dog d = (Dog)a;
** java.lang.ClassCastException:类型转换异常
instanceof关键字
作用: 用来判断多态后父类引用到底指向哪个子类类型的对象。
格式: boolean b = 父类引用 instanceof 类名或接口名;
注意事项:如果instanceof关键字 右边是类名,则要求 父类引用的对象和类之间必须是父子关系。