java 第四大特征 抽象性(abstract 关键字的使用)
一、抽象类
概念:有时将父类设计得非常抽象,以至于没有具体的实例,这样的类叫做抽象类
二、abstract 关键字的使用
abstract 可以用来修饰的结构:方法,类
abstract 修饰类 (抽象类)
- 此类不能被实例化
- 抽象类中一定有构造器,便于子类对象实例化时调用(涉及子类对象实例化的全过程)
- 开发中 ,都会提供抽象类的子类 ,让子类对象实例化 ,完成相关操作
abstract 修饰方法 (抽象方法)
- 即只有方法的声明,没有方法体
- 包含抽象方法的类一定是抽象类(防止创建方法后,调用抽象方法),反之,抽象类中不一定要有抽象方法
- 若父类是抽象类,且含有抽象对象,则子类中必须重写这些抽象对象
三、abstract 使用上的注意点:
abstract 不能修饰:属性、构造器、代码块等结构
abstract 不能修饰私有方法(私有方法不能被重写)、静态方法(静态方法不能被覆盖) 被final 修饰过的类和方法
四、抽象类的匿名子类
- 匿名对象
methodA(new OrderA());
- 非匿名的类 非匿名对象
OrderB o1 = new OrderB();
methodB(o1);
- 匿名对象 非匿名的类
methodB(new OrderB());
- 匿名的类 匿名的对象
Order o2 = new Order(){
//创建了一个匿名子类的对象
//注意重写抽象方法
@Override
public void eat() {}
};//注意分号
methodA(o2);
五、完整示例
1、示例1
public class AbstractTest {
public static void main(String[] args) {
//Person p1 = new Person();
//报错,Person被abstract修饰,不能被实例化
}
}
abstract class Person{
String name;
int age;
//构造器
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
//抽象方法
abstract public void eat();
public void walk(){
System.out.println("走路");
}
}
class Student extends Person{
public Student(String name,int age){
super();
}
public void eat(){//
}
}
2、示例2
public class ProsenTest {
public static void main(String[] args) {
//匿名对象
methodA(new OrderA());
//非匿名的类 非匿名对象
OrderB o1 = new OrderB();
methodB(o1);
//匿名对象 非匿名的类
methodB(new OrderB());
//匿名的类 匿名的对象
Order o2 = new Order(){
//创建了一个匿名子类的对象
//注意重写抽象方法
@Override
public void eat() {
}
};//注意分号
methodA(o2);
}
public static void methodA(Order o){
o.eat();
}
public static void methodB(OrderB o){
o.eat();
o.sleep();
}
}
abstract class Order{
public Order() {
}
public abstract void eat();//注:抽象方法没有方法体
}
class OrderA extends Order{
@Override
public void eat() {
}
}
class OrderB extends Order{
@Override
public void eat() {
}
public void sleep(){
System.out.println("睡觉");
}
}