十、抽象类


1.抽象类出现的原因
当多个类中出现相同的功能,但是功能主体部分不同,这时可以向上抽取的【只抽取功能的定义部分-----方法的声明部分,而不抽取功能的主体部分-----方法的实现部分】

明确的说,抽象的存在的意义是:就是为了被继承

2.抽象类的使用【见代码AbstractUsageDemo.java】

class AbstractUsageDemo 
{
    public static void main(String[] args) 
    {
        //3.抽象类不能实例化对象
        //错误: Check是抽象的; 无法实例化
        //Check c = new Check();
        //c.show();

        SubCheck sc = new SubCheck();
        sc.show();
        sc.display();

        //Check.show11();

    }
}
//1.定义一个抽象类
//父类
abstract class Check
{    
    //8.抽象类中可以定义成员变量,为了给子类提供
    String name;
    int age;

    //2.在抽象类中使用abstract关键字修饰的方法被称为抽象方法
    //抽象方法的特点:只有声明,没有实现
    abstract public void show();

    //6.如果一个抽象类中有多个抽象方法,但是在子类中只重写了部分抽象方法,那么子类仍然是一个抽象类,无法实例化对象
    //错误: SubCheck不是抽象的, 并且未覆盖Check中的抽象方法show22()
    abstract public static void show11();
    abstract public void show22();

    //5.抽象类中也可以定义普通方法
    public void display() {

    }

    //7.抽象类有构造方法,存在的作用:为了被子类的构造方法调用
    public Check() {}
    public Check(String name,int age) {
        this.name = name;
        this.age = age;
    }
}

//子类
class SubCheck extends Check
{
    //4.如果一个子类对象要调用抽象类【父类】中的抽象方法,则必须在子类中重写这个抽象方法
    @Override
    public void show() {
        System.out.println("hsugh");
    }
    @Override
    public void show11() {
        System.out.println("hsugh");
    }
    @Override
    public void show22() {
        System.out.println("hsugh");
    }

    //构造方法
    public SubCheck() {}
    public SubCheck(String name,int age) {
        super(name,age);
    }
}

 


3.总结
1>抽象类的特点
a.使用关键字abstract修饰的类
b.不可以使用new关键字实例化对象
c.可以定义抽象方法,也可以定义普通方法
d.抽象类中方法如果想要被调用,只能子类中重写这个方法,然后创建子类对象进行调用
e.子类必须重写父类中所有的抽象方法,否则,子类仍然是一个抽象类
f.抽象类就是为了继承而生,所以一般情况下,抽象类在程序中扮演者父类的角色
g.抽象类是由自己的构造方法【成员变量】的,但是这些构造方法的作用主要为了提供给子类的构造方法调用

2>抽象方法的特点
a.抽象方法只能存在于抽象类中
b.在抽象类中,被abstract修饰的方法
c.只能声明,没有实现

3>抽象类和普通类的区别【面试题】
a.相同点:都是用来描述事物的,都可以定义成员变量和构造方法,普通方法
b.抽象类中除了普通方法之外,还可以定义、抽象方法
c.普通类可以继承也可以不被继承,但是抽象类一定要被继承,否则其中的抽象方法将永远无法实现
d.普通类可以使用new实例化对象,但是抽象类不行

扩展:abstract和哪些修饰符不能共存?
a.final 原因:final修饰类意味着这个类不能被继承,但是抽象类存在的意义就是为了被继承【final修饰的方法不能被重写,但是抽象方法只能被重写之后子类对象调用】
b.private 原因:private修饰方法意味着这个方法只能在当前类中能被调用,但是抽象方法不能实现的就要靠子类来实现
c.static 原因:使用static修饰的方法可以使用对象. 和类名. 的方式调用【对象.直接排除】,调用一个方法的目的为了实现相应的方法体,但是抽象方法没有方法体,抽象类直接使用类名调用静态抽象方法没有任何意义

posted @ 2017-08-20 11:34  又等风来  阅读(163)  评论(0编辑  收藏  举报