Java笔记 抽象类 和接口
一、抽象方法
1.、概念
只有方法声明,没有方法体的方法就是抽象方法。
抽象方法必须使用abstract关键字修饰
2、格式
修饰符 abstract 返回值类型 方法名(参数列表);
二、抽象类
1、 概念
被abstract修饰的类就是一个抽象类。
具有抽象方法的类就必须是一个抽象类。
2、 格式
public abstract class 类名{
}
3、作用
用来描述一种数据类型应该具备的基本特征和行为,如何实现该行为由子类通过方法重写完成。
4、特点
抽象类和抽象方法都必须使用abstract关键字修饰。
抽象类不能直接创建对象。原因:调用抽象方法没有任何意义。
子类继承抽象类之后,必须重写全部所有的抽象方法,否则该子类也必须定义为抽象类。
三、抽象类常见的问题
1.、抽象类不能创建对象,那么抽象类有没有 构造方法 呢?如果有?构造方法有什么意义?
可以有构造方法,抽象类的构造方法可以被子类调用传递参数值给父类,为父类的成员变量赋值。
2.、抽象类能不能不定义抽象方法?
可以不定义抽象方法。在适配器模式会使用到。
3.、抽象类可以定义普通方法吗?(有方法体的方法)
可以
4.、抽象类一定是父类吗?
一定
5.、抽象关键字不能和哪个关键字共存?
abstract不能和 private 一起使用,因为private修饰的方法不能被子类重写,而abstract方法要求必须被子类重写,相互矛盾。
四、接口
1、概念
接口也是一种引用数据类型,是比抽象类还要抽象的”类”。
接口就是功能(方法)的集合,只描述功能所具备的方法,如何实现方法由实现类(接口的子类)通过方法重写完成。
2、定义格式
public interface接口名{
// 抽象方法1
// 抽象方法2
…….
// 抽象方法n
}
接口名和类名的命名规则一致。
3、使用格式
public class 类名 implements 接口名{
}
比如:public class Manager implements Driverable{
// 重写接口中的所有方法
}
4、接口的特点
接口不能定义构造方法,不能创建对象。
接口中定义的成员变量是常量,一旦赋值不能再修改。
JDK1.8(包括1.8)之后,接口中可以定义有方法体的方法
JDK1.8之前,接口中所有方法都是抽象方法。
接口中的成员都有默认的修饰符
成员变量:public static final
成员方法:public abstract
5、接口注意事项
一个类在继承一个类的同时可以实现多个接口。
接口可以继承接口,而且可以多继承。
类实现接口时,必须重写所有接口中的抽象方法,否则该类必须定义为抽象类。
接口和抽象类中可以有方法声明一样的方法,子类在继承抽象类和实现接口时只需要重写一个即可。
6、接口和抽象类的区别(面试题)
相同点
都不能创建对象。
都可以定义抽象方法。
不同点
抽象类可以有成员变量,接口中的常用变量是常量。
抽象类成员变量和成员方法没有默认的修饰符,接口中的成员有默认的修饰符。比如常量默认修饰符:public static final 方法默认修饰符:public abstract
抽象类可以有构造方法,接口没有构造方法
抽象类只能单继承,接口可以多继承。
抽象类中可以有普通方法,接口在JDK1.8之前不能有普通方法,1.8之后可以有。
7、如何选择接口和抽象类
明确该方法是否是某种数据类型的共性内容。
如果是共性内容,该方法就应该放到该中类型的父类中。然后再考虑该方法父类知不道如何实现,如果父类不知道如何实现并且要求子类必须重写的,则将该方法定义为抽象方法,则该父类就必须定义为抽象类。
如果不是共性内容,该方法就应该定义到接口中,然后需要该功能的类实现接口重写方法即可。
五、 多态
1、概念
多态是面向对象的三大特征之一。
同一种事物表现出来的多种形态就称为多态。
2、前提条件
必须要有子父类关系或类实现接口的关系。
必须有方法重写
必须有父类引用指向子类对象。
3、多态的格式
父类类名 变量名 = new 子类类名(); 或
接口名 变量名 = new 接口实现类();
比如:
动物类:Animal
abstract class Animal {
public abstract void eat();
}
子类:Dog
class Dog extends Animal {
public void eat(){
syso(“狗吃骨头”);
}
}
// 创建狗对象
Animal d = new Dog();
4、多态的注意事项
多态情况下,子父类出现同名的成员变量时,通过父类引用访问时访问的是父类的成员变量。
多态情况下,子父类出现同名的成员方法时,通过父类引用调用成员方法时调用子类重写后的方法。
成员变量属于静态绑定
在程序运行之前就确定了访问的成员变量是哪个对象的。
成员方法动态绑定
在程序运行过程中才去确定调用哪个对象的,如果子类重写了,则调用子类的,否则调用父类的。
成员变量:编译看左边,运行看左边
成员方法:编译看左边,运行看右边
5、多态的好处和弊端
弊端:多态情况下,不能使用子类特有的成员。
优点
提高了代码的扩展性。
提高了代码的复用性。
提高了代码的维护性。
6、多态的使用场景
作为 形式参数
多态情况下,父类或接口类型作为形式参数可以接收更多的数据类型对象。
作为返回值类型
多态情况下,父类或接口类型作为返回值类型可以返回更多数据类型的对象。
7、多态的转型
向上转型:父类引用指向子类对象的过程就是向上转型的结果。
格式:Animal d = new Dog(); 将子类类型看成父类类型。
向下转型:将父类引用转换为子类引用的过程就是向下转型。
数据类型强制转换格式:小数据类型 变量名 = (小数据类型)大数据类型的变量名;
long b = 100l; int a = (int)b;
向下转型格式:子类类名 变量名 = (子类类名)父类引用变量名;
8、 instanceof 关键字
作用:用来判断父类引用指定的到底是哪一个子类类型的对象。
格式:boolean b = 变量名 instanceof 类名或接口名;
注意:如果instanceof右边的是类名,则要求对象名和类名之间是子父类关系。