一、抽象类的概述
- 抽象就是看不懂的
- 被
abstract关键字
所修饰的
类被称为抽象类
。 - 抽象类格式:
abstract class 类名 {}
2.抽象类的特点
- 1.
抽象类
和抽象方法
必须用abstract
关键字修饰
abstract class 类名 {}
public abstract void eat();
- 2.抽象类不一定有抽象方法,有
抽象方法
的类一定是
抽象类或者是接口 - 3.抽象类不能实例化,抽象类如何实例化呢?
- 按照多态的方式,由具体的子类实例化。其实这也是多态的一种,抽象类多态。
- 4.抽象类的子类
- 要么是抽象类
- 要么重写抽象类中的所有抽象方法
class Demo1_Abstract {
public static void main(String[] args) {
//错误: Animal是抽象的; 无法实例化
//Animal a = new Animal();
//父类引用指向子类对象,执行到这里已经运行了父类Animal的无参构造函数
Animal a = new Cat();
a.eat();
}
}
abstract class Animal { //抽象类
public abstract void eat();//抽象方法
public Animal() {
System.out.println("父类空参构造");
}
}
class Cat extends Animal {
public Cat() {
super();
}
public void eat() {
System.out.println("猫吃鱼");
}
}
输出:
父类空参构造
猫吃鱼
3.抽象类的成员特点
抽象类的成员特点
- 成员变量:既可以是变量,也可以是常量。
- abstract是否可以修饰成员变量?
- 不能修饰成员变量
- 构造方法:有。用于子类访问父类数据的初始化。
- 成员方法:既可以是抽象的,也可以是非抽象的。
案例演示
class Demo2_Abstract {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
abstract class Demo {
int num1 = 10;
final int num2 = 20;
public Demo() {
}
public void print() {
System.out.println("111");
}
public abstract void method();
}
class Test extends Demo {
public void method() {
System.out.println("111");
}
}
4.抽象类的成员方法特性:
- 抽象方法 强制要求子类做的事情。
- 非抽象方法 子类继承的事情,提高代码复用性。
5.面试题
class Demo4_Abstract {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
/*
* A:面试题1
* 一个抽象类如果没有抽象方法,可不可以定义为抽象类?如果可以,有什么意义?
* 可以
* 这么做目的只有一个,就是不让其他类创建本类对象,交给子类完成
* B:面试题2
* abstract不能和哪些关键字共存
1.abstract和static
被abstract修饰的方法没有方法体
被static修饰的可以用类名.调用,但是类名.调用抽象方法是没有意义的
2.abstract和final
被abstract修饰的方法强制子类重写
被final修饰的不让子类重写,所以他俩是矛盾
3.abstract和private
被abstract修饰的是为了让子类看到并强制重写
被private修饰不让子类访问,所以他俩是矛盾的
*/
abstract class Demo {
//public static abstract void print(); //错误: 非法的修饰符组合: abstract和static
//public final abstract void print(); //错误: 非法的修饰符组合: abstract和final
//private abstract void print(); //错误: 非法的修饰符组合: abstract和private
}
6.抽象类和普通类的区别
- 抽象类中可以有成员变量,成员方法,构造方法,静态方法,常量 有的话又有什么意义呢?
- 成员变量 --> 给子类使用
- 成员方法 --> 给子类使用
- 构造方法 --> 帮助子类初始化父类继承下来的成员
- 静态方法 --> 直接通过类名访问,防止创建对象的不建议访问方式
- 常量 --> 可以,方便访问
- 抽象类和普通类没有区别,只不过是抽象类多了抽象方法而已
- 抽象类的抽象方法强制子类重写
- 非抽象方法直接给子类使用
- 构造方法和成员变量直接给子类使用
- 抽象类是一个彻头彻尾的服务类,服务于所有的子类