目录
抽象类概述
在Java中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类。
抽象类的特点
a:抽象类和抽象方法必须用abstract关键字修饰
抽象类格式: abstract class 类名 {}
抽象方法格式: public abstract void eat();
b:抽象类不一定有抽象方法,有抽象方法的类一定是抽象类
c:抽象类中可以有构造方法,抽象类不能进行实例化,那么要构造方法有什么作用呢?
用于子类访问父类数据时的初始化
d:抽象类不能直接实例化那么,抽象类如何实例化呢?
按照多态的方式,由具体的子类实例化。其实这也是多态的一种,抽象类多态。
e:抽象类的子类
要么是抽象类
要么重写抽象类中的所有抽象方法
代码1如下:
//抽象类:一旦这个类中,有了抽象方法,此类必须为抽象类。
public abstract class Animal {
String name;
int age;
public Animal() {
System.out.println("抽象的父类,构造方法执行了");
}
//没有方法体的方法,就是抽象方法
public abstract void eat();
public abstract void sleep();
public void look(){
System.out.println("kan");
};
}
public class Cat extends Animal {
public Cat() {
super();
System.out.println("Cat类的构造方法执行了");
}
public void catchMouse() {
System.out.println("抓老鼠");
}
@Override
public void eat() {
System.out.println("猫吃鱼");
}
@Override
public void sleep() {
System.out.println("猫喜欢白天睡觉");
}
}
public class Dog extends Animal {
@Override
public void eat() {
System.out.println("狗吃骨头");
}
@Override
public void sleep() {
System.out.println("狗趴在狗窝里睡觉");
}
}
public class MyTest {
public static void main(String[] args) {
//抽象类,不能直接创建其对象
//抽象类,不能直接创建其对象,我们可以采用多态的形式,间接实例化
Animal an = new Cat();
an.eat();
//抽象类,他抽取各个子类的共性功能,并不给出这些共性功能的具体实现,
//而是交由子类根据自身的需求和差异,自己去重写这些抽象方法。而且带有强制性的。
}
}
代码2如下:
public class MyTest {
public static void main(String[] args) {
//抽象类的注意事项。
//1.抽象类中可以没有抽象方法,但是一旦一个类中有了抽象方法,此类必须为抽象类。
//2.抽象类中有构造方法,作用,可以间接通过多态的形式,实例化父类。
//3.抽象类,不能直接创建对象,你可以通过多态的方式间接实例化父类。
//4.作为抽象类的子类,有两种选择,一,你要重写抽象类中所有的抽象方法,二,你也是个抽象类
//5.抽象类中,既可以定义抽象方法,又可以定义非抽象方法。抽象方法,是带有强制性,强子类必须重写,非抽象方法,一般可以让子类继承下去用,当然子类可以重写非抽象方法。
}
}
abstract class AA {
public void show() {
}
//抽象方法,带有强制性,强制子类必须重写。
public abstract void hehe();
public abstract void haha();
public abstract void heihei();
}
class BB extends AA {
@Override
public void hehe() {
}
@Override
public void haha() {
}
@Override
public void heihei() {
}
}
abstract class CC extends AA {
public abstract void dd();
}
class DD extends CC {
@Override
public void hehe() {
}
@Override
public void haha() {
}
@Override
public void heihei() {
}
@Override
public void dd() {
}
}
抽象类的成员特点
抽象类的成员特点
a:成员变量:既可以是变量,也可以是常量。
b:构造方法:有。
用于子类访问父类数据的初始化。
c:成员方法:既可以是抽象的,也可以是非抽象的。
抽象类的成员方法特性
抽象方法 强制要求子类做的事情。
非抽象方法 子类继承的事情,提高代码复用性。
abstract不能和哪些关键字共存?
private 冲突
final 冲突
static 不能共存 无意义
代码如下:
public class MyTest2 {
public static void main(String[] args) {
//一个类如果没有抽象方法,可不可以定义为抽象类 ? 如果可以,有什么意义 ?
//可以,外界不能直接创建该类对象
//new AA();
//new BB();
// AA.bb();
// abstract不能和哪些关键字共存 ?
// private abstract 矛盾,抽象强制重写,private 子类无法继承重写。
//public abstract final 抽象强制重写 final 不能重写
// public abstract static void dd (); 静态方法不算重写,子类没有办法重写静态方法。
}
}
abstract class AA {
public void aa() {
}
public static void bb() {
}
//private abstract void hehe(); 报错
//
// public abstract final void cc();
// public abstract static void dd();
}
class BB {
private BB() {
}
}