Java的抽象类

在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法、初始化块和构造方法和普通类一样。
由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。
我们把一个不是具体的功能称为抽象的功能,而一个类中如果有抽象的功能,该类必须是抽象类。
抽象类的格式:
[修饰符] abstract 返回类型 方法名();
修饰符 (public protected private)三选一
抽象类的特点:
A:抽象类和抽象方法必须用abstract关键字修饰
B:抽象类中不一定有抽象方法,但是有抽象方法的类必须定义为抽象类
C:抽象类不能实例化
因为它不是具体的。
抽象类有构造方法,但是不能实例化?构造方法的作用是什么呢?
用于子类访问父类数据的初始化
D:抽象的子类
a:如果不想重写抽象方法,该子类是一个抽象类。
b:重写所有的抽象方法,这个时候子类是一个具体的类。
抽象类的实例化其实是靠具体的子类实现的。是多态的方式。
Animal a=new Cat();
抽象类的成员特点:
成员变量:既可以是变量,也可以是常量。
构造方法:有。
用于子类访问父类数据的初始化。
成员方法:既可以是抽象的,也可以是非抽象的。
抽象类的成员特性:
A:抽象方法 强制要求子类做的事情
B:非抽象方法 子类继承的事情,提高代码的复用性。
一个类如果没有抽象方法,可不可以定义为抽象类?如果可以,又有什么意义?
A:可以
B:不让创建对象
abstract不能和那些关键字共存?
private 冲突
final 冲突
static 无意义
下面通过一个案例来进一步理解抽象类
实现:
学员类
基础班学员
就业班学员
第一步:定义一个抽象学员类(作为父类)
public abstract class Student {
private String name;//姓名
private int age;//年龄
private String grand;//班级

public Student() {};
public Student(String name,int age,String grand) {
	this.name=name;
	this.age=age;
	this.grand=grand;
}

public String getName() {
	return name;
}
public void setName(String name) {
	this.name = name;
}
public int getAge() {
	return age;
}
public void setAge(int age) {
	this.age = age;
}
public String getGrand() {
	return grand;
}
public void setGrand(String grand) {
	this.grand = grand;
}
//学习
public abstract void study();
//吃饭
public void eat() {
	System.out.println("学习完了,就吃饭");
}

}
第二步:定义具体基础班学员类和就业班学员类,并且重写了父类的study方法
在这里插入图片描述
在这里插入图片描述

第三步:以测试基础班学员为例,用多态的方式进行测试
在这里插入图片描述

测试的结果为:
在这里插入图片描述

总结:

  1. 抽象类必须使用abstract修饰符来修饰,
    抽象方法不能有方法体。
  2. 抽象类不能被实例化,无法使用new关键字来调用抽象类的构造器创建抽象类的实例。
  3. 抽象类可以包含成员变量、
    方法(普通方法和抽象方法都可以)、
    构造器、初始化块、内部类(接 口、枚举)5种成分。
  4. 抽象类的构造器不能用于创建实例,主要是用于被其子类调用。
  5. 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类
  6. abstract static不能同时修饰一个方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值