目录
一、抽象类
1. 初识抽象类
一般来说,类的存在是为了定义对象的,但是也有不用定义对象的类,就是抽象类,抽象类可以不用写出具体的方法,只存在于一个抽象的概念。对于一些需要继承父类方法的子类来说,父类方法并不一定完全适用于每个子类,所以父类在定义完抽象方法后需要子类来重写父类方法。
我们知道鸟与猫同属动物类,但是在习性方面有很大的不同,如果我们想要描述鸟和猫的各自行为,我们只需要在动物类中定义一个抽象方法再在鸟类和猫类中重写各自的方法即可。
public abstract class Animal {
String name;
abstract void bark();//定义一个抽象方法
}
public abstract class Bird extends Animal {
String name = "圆圆";
@Override
void bark() {
System.out.println("叽叽");//重写父类抽象方法
}
}
public class Cat extends Animal{
String name = "妮妮";
@Override
void bark() {
System.out.println("喵喵喵");//重写父类抽象方法
}
}
2. 抽象分类
抽象修饰符是abstract,使用abstract修饰的类称为抽象类,使用abstract修饰的方法称为抽象方法。
public abstract class Animal { // 抽象类
String name; //抽象类中可以定义普通的属性
abstract void bark(); //抽象方法 抽象方法不需要进行具体的方法描述
public void eat(){ //抽象类中可以定义普通的方法
System.out.println("吃东西");
}
}
抽象类不能直接进行实例化
抽象方法也不能使用final和static修饰,原因很简单,被private修饰的方法不可以被修改,但是abstract作为抽象类必须要子类来重写父类方法。抽象方法也不能使用private修饰。
抽象类必须要被继承并重写才能实例化对象,如果子类不进行重写,则子类也是一个抽象类并使用abstract修饰。
抽象类和抽象方法的注意事项:
1.含有抽象方法的类必须是抽象类。
2.抽象类中可以定义普通方法和普通属性。
3.抽象类中可以定义构造方法,由继承的子类进行初始化父类的成员变量。
二、接口
1.初识接口
接口对于我们来说并不陌生,生活中的接口比比皆是,比如说usb接口、type-c接口等都是接口,我们虽然使用不同的手机,但是有的手机充电线却是一样的,这就是因为有接口的存在。我们想要给手机充电,只要遵守不同的接口协议,就可以给对应的手机充电了。
2. 接口格式
public interface 接口名
接口名一般首字母I大写
3. 接口特点
接口的实现需要一个实现类,并实现接口中所有的抽象方法
public interface Ihabit {
void eat();
void sleep();
}
在接口中存放的都是抽象方法,不可以直接new一个接口对象,因为接口是一个引用类型
接口的成员变量默认是public static final修饰,而成员方法是public abstract修饰
public interface Eat {
double number = 3.0; // 默认被:final public static修饰
void eat();
void sleep();
}
Java中支持实现多个接口,中间使用,分割
class Frog extends Animal implements IRunning, ISwimming {
public Frog(String name) {
super(name);
}
@Override
public void run() {
System.out.println(this.name + "正在往前跳");
}
@Override
public void swim() {
System.out.println(this.name + "正在蹬腿游泳");
}
}
注意在实现多个接口的时候,每个接口中的抽象方法都要实现,否则要设置为抽象类
抽象类和引用的区别
抽象类中可以包含普通方法和普通字段, 这样的普通方法和字段可以被子类直接使用(不必重写), 而接口中 不能包含普通方法, 子类必须重写所有的抽象方法