1、使用abstract修饰的类就是抽象类
普通类有的实例变量/实例方法/静态变量/静态方法/构造方法等所有成员都可以在抽象类中定义
public abstract class Animal {
String color;//在抽象类中定义实例变量
static int xx = 123;//静态变量
public void eat() { //实例方法
System.out.println("动物吃饭");
}
public static void sleep() { //静态方法
System.out.println("动物睡觉");
}
public Animal(){ //构造方法
}
public Animal(String color) {
super();
this.color = color;
}
}
public class Dog extends Animal{
@Override
public void eat() {
System.out.println("小狗喜欢吃骨头");
}
}
public class Cat extends Animal{
@Override
public void eat() {
System.out.println("小猫吃鱼");
}
}
/*
* 抽象类也是一种引用数据类型,定义变量
* java数据类型包括基本类型与引用类型,其中引用类型包括:类,接口,数组,枚举
* 抽象类不能实例化对象
*/
public class Test {
public static void main(String[] args) {
//定义变量
Animal animal;
//抽象类不能实例化对象
//animal = new Animal();
//抽象类的引用需要赋值子类
animal = new Dog();
animal.eat();//当前animal引用的是Dog对象
animal = new Cat();
animal.eat();//当前animal引用的是Cat对象
//抽象类可以匿名赋值内部类对象
animal = new Animal() {
};
}
}
2、案例
/*
*宠物卖萌,小猫/小狗/小猪是宠物
*主人喂宠物,宠物卖萌
*/
public class Test {
public static void main(String[] args) {
Master master = new Master();
Pet pet = new Dog();//Dog类
//pet.maimeng();
master.feed(pet);
pet = new Cat();//Cat类
//pet.maimeng();
master.feed(pet);
//feed()方法的形参是Pet抽象类引用,在调用方法时,需要传递子类对象
//也可以传递匿名内部类对象
master.feed(new Pet() {
//在匿名内部类中重写抽象类中的抽象方法
@Override
public void maimeng() {
System.out.println("小猪卖萌");
}
});
}
}
/*
* 子类继承了抽象类,需要重写抽象类的抽象方法
*/
public class Dog extends Pet{
@Override
public void maimeng() {
System.out.println("小狗卖萌");
}
}
public class Cat extends Pet{
@Override
public void maimeng() {
System.out.println("小猫卖萌");
}
}
/*
* 宠物有卖萌的行为,不同宠物卖萌的方式不同,在宠物类中,卖萌这个行为没法具体实现
* 当一个类的操作无法具体实现时,这个操作可以定义为抽象方法
* 使用abstract修饰的方法,只有声明部分,没有方法体
* 含有抽象方法的类必须定义为抽象类
*/
public abstract class Pet {
public abstract void maimeng();
}
public class Master {
//喂宠物
public void feed(Pet pet) {
pet.maimeng();//主人喂宠物,宠物卖萌
}
}
3、总结
1.为什么定义抽象类
对事物进行进一步抽象可以形成抽象类
含有抽象方法的类必须定义为抽象类
2.如何定义抽象类
使用abstract修饰的类
3.为什么定义抽象类
当一个类的某个操作无法具体实现时,这个操作可以定义为抽象方法
使用abstract修饰方法,只有方法的声明,没有方法体
4.如何使用抽象类
抽象类一般作为其他的父类存在
子类继承了抽象类,子类需要重写抽象类中的所有的抽象方法,如果子类没有重写抽象类中的所有抽象方法,子类也需要定义为抽象类
注:抽象类中不一定只含有抽象方法
5.抽象类不能实例化对象,需要赋值子类对象
6.抽象类的引用而已赋值匿名内部类对象