抽象类及抽象方法
概念:一个类中没有包含足够的信息来描绘一个具体的对象,这种类被定义为抽象类,含有抽象方法的类也被称为抽象类。
用通俗的话来说就是当一个类的某个功能(方法)实现不确定时,我们就将该功能(方法)用abstract修饰,让其变为抽象方法,这个方法所在的类就称为抽象类,我们让某个类来继承这个抽象类,称为该抽象类的子类,让这个子类来具体实现这个方法。当然,这个子类可以不实现这个抽象方法,但是这个子类也要成为一个抽象类。
抽象方法的声明
语法格式:[访问权限修饰符] abstract 返回值类型 方法名(参数列表) [throws 异常列表];
public abstract void eat();
注意:
- 抽象方法不能被private,final,static修饰。
- 抽象方法不能有方法体。
抽象类的声明
语法格式:[权限修饰符] abstract class 类名{ }
public abstract class Test{}
注意:
- 抽象类中可以包含五种成分,成员变量,方法,初始化块,构造器,内部类。
- 抽象类中不一定要有抽象方法。
抽象类的局限性
- 抽象类有时候会出现代码冗余的问题
- 类的继承是单根继承,一个类只能直接继承一个类。
代码实现:
abstract class Animal {
String name;
int age;
public abstract void eat();
}
class Cat extends Animal {
@Override
public void eat() {
System.out.println("小猫吃鱼");
}
}
class Dog extends Animal {
@Override
public void eat() {
System.out.println("小狗啃骨头");
}
}
public class Test01 {
public static void main(String[] args) {
Cat cat = new Cat();
cat.eat();//输出小猫吃鱼
Dog dog = new Dog();
dog.eat();//输出小狗啃骨头
}
}
注意:抽象类不能创建对象!
public abstract class Person {
public abstract void eat();
}
测试类:
public class Test02 {
public static void main(String[] args) {
Person person = new Person() {
@Override
public void eat() {
System.out.println("印度人喜欢吃咖喱");
}
};
person.eat();//输出:印度人喜欢吃咖喱
}
}
代码分析:
- 底层创建匿名类,继承Person类,重写eat()
- 创建匿名类的对象
- 将匿名类对象的内存地址赋值给父类的引用
内存分析:
总结
- 抽象类中只能有抽象方法?
抽象类中可以有构造方法、静态方法、成员方法、抽象方法 - 抽象类中不可以没有抽象方法?
可以,但是毫无意义 - 如果父类是抽象类,则子类必须实现父类的抽象方法?
不一定,子类如果是抽象类,可以不实现父类的抽象方法 - 抽象类不能有构造方法?
可以有 - 可以使用new关键字来创建抽象类对象?
不能,创建的是匿名内部类的对象