什么是抽象的?
顾名思义:很不具体,没有具体的执行,只是个概念
abstarct它可以修饰什么?
- 修饰类:用abstract修饰符修饰的类 叫做抽象类
- 修饰方法:用abstract修饰符修饰的方法 ,只有方法的结构(以;结尾),没有方法执行体叫做抽象方法
注意native修饰的方法虽然也没有方法体,但是不是抽象方法,只是执行的过程是其他语言写的(调用本地C/C++语言)
abstarct修饰的特点?
- 抽象类中不是必须含有抽象方法,可以全部为具体
- 如果方法用abstract修饰,则该类必须为abstract修饰的类(当我也可是接口implements),普通的类是不允许含有抽象的方法.
- 抽象类可以直接单继承抽象类
- 抽象类可以直接单继承具体类(但是一般不会这样写)
- 具体类不可以直接单继承抽象类,需要将父类中的有抽象的方法具体化(或者子类也变成抽象类,等下一个具体类去具体化)
抽象类与普通类区别?
- 抽象类中除了允许抽象方法外,其余的和普通类基本相同
- 抽象类含有构造方法,但是不能直接通过调用构造方法创建对象,它只能通过子类(普通类)继承来做事,通过调用子类构造方法默认调用super();(即默调用父类构造方法)创建父类抽象类对象来进行做事情
- 也可以通过匿名内部类来创建抽象类对象,前提是抽象类中有抽象方法,通过匿名类来对抽象类中的抽象方法具体化。
测试示例:
Animal抽象类
public abstract class Animal {
public Animal(){}
public abstract void eat();
public void sleep(){
System.out.println("sleep方法。。。");
}
}
子类Person继承Animal抽象类
public class Person extends Animal{
@Override
public void eat() {
System.out.println("eat方法。。。。");
}
}
测试类:
public class TestMain {
public static void main(String[] args) {
//通过匿名内部类创建抽象类对象
Animal animal = new Animal() {
@Override
public void eat() {
System.out.println("匿名方法。。。");
}
};
//执行是匿名类重写父类中的抽象的方法
animal.eat();
//Animal中普通的方法
animal.sleep();
//创建子类的对象
Person person = new Person();
//可以使用父类独有的方法
person.sleep();
//执行的是子类中重写父类中抽象的方法
person.eat();
}
}
测试结果: