A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 毕延平 初级黑马   /  2015-3-8 22:58  /  842 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

http://bbs.itheima.com/thread-3077-1-1.html
(一)抽象类
1、抽象类的概念:
        1.如果父类会规定出一些成员方法,需要子类去重写,那么在父类中就可以只定义这个方法,不实现它。这种方法叫:抽象方法。使用一个关键字:abstract
        2.抽象方法没有方法体:
          abstract void show();//没有大括号,只有方法声明
        3.当一个类中包含了一个抽象方法时,那么这个类必须是一个抽象类,仍然使用关键字:abstract修饰;
        4.当一个类是抽象类时,说明:
          1).此类不能被实例化;就是用来被继承;
          2).如果一个类继承了一个抽象类,那么子类必须实现父类中所有的抽象方法;否则子类也必须是个抽象类;也就是:一个抽象类可以继承自另一个抽象类;
          3).继承自抽象类仍然使用关键字:extends
          4).Java中是单继承,一个类只能同时继承自一个类;抽象类也是一样,一个类也是只能同时继承自一个抽象类;
       
        抽象类反而形成了一种规定:
        1.要求所有的人员类,都具有void show()方法,怎么规定呢?
          1).定义一个抽象类,里面定义一个抽象方法:abstract void show();
          2).要求所有的具体的人员,都继承自那个抽象类,那么在语法上,就必须重写父类的方法;所以这样达到一个所有人员类都具有了void show()方法。
        项目经理先定义一个抽象类:
        abstract class AbstractService{
                abstract void save();//
                abstract void delete();//
                abstract void update();//
                abstract void find();//
        }
        要求各小组,所有对数据库操作的类,都必须继承自这个类;
/3、抽象类的特点:
        1.一个抽象类中可以不包含抽象方法;
          可以包含:成员变量、抽象方法、实现的方法;
        2.抽象类不能被实例化:
        3.抽象类的子类可以是个抽象类,也可以是个普通类,如果是普通类必须全部实现抽象类中抽象方法;
abstract class Person{
        String name;
        int age;
        Person(){
                System.out.println("抽象类Person的构造函数");
        }
        Person(String name,int age){
                this.name = name;
                this.age = age;
        }
        /*
        void show(){
                System.out.println("大家好,我是好程序班的一员");
        }
        */
        //show()做为一个抽象方法
        abstract void show();
}
class Student extends Person
{
        Student(String name,int age){
                super(name,age);//nameage传给抽象的父类;
        }
        //重写父类show
        void show(){
                System.out.println("大家好,我是好程序班的一名学生");
        }
}
class Teacher extends Person
{
        void show(){
                System.out.println("大家好,我是好程序班的一名教师");
        }
}
class Demo
{
        public static void main(String[] args)
        {
                Student stu = new Student();
                stu.show();//大家好,我是好程序班的一员
                Teacher tea = new Teacher();
                tea.show();//大家好,我是好程序班的一员
        }
}
3abstract不能和哪些关键字共存:
        1.private:
                一个abstract方法就是用来被子类重写的,所以子类必须能访问父类的抽象方法,所以父类的抽象方法不能是private;
        2.final:
                一个abstract方法是用来被子类重写的,被声明为final的方法是最终方法,不允许重写。所以冲突;一个abstract类是用来被继承的,被声明为final的类是最终类,不能被继承。所以冲突;
        3.static:
                一个abstract方法没有方法体。而一个static的方法在第一次使用类的时候就会被分配空间,而此时,抽象类的方法没有方法体,所以也就无法为其分配空间。所以不能是abstract又是static.
4、使用抽象类作为方法形参:
        1.一个方法的形参可以接收一个抽象类类型的;
        2.此方法接收一定要是抽象类的子类对象的引用;因为抽象类本身不能被实例化;
        3.到方法体内,实际上就是一种多态的表现形式。父类的引用指向子类的对象;
        了解一下事情:
        1.抽象类类型可以作为方法形参;
        2.当传递实参时,传递的一定要是抽象类的子类的对象的引用;
        3.在方法内部,实际上就是父类的引用指向了子类的对象。实际就是多态的形式
abstract class AbstractA
{
        void show();
}
class SubA extends AbstractA
{
        void show(){
                System.out.println("show()");
        }
}
class SubB extends AbstractA
{
        void show(){
                System.out.println("SubB-->show()");
        }
}
class C
{
}
class B
{
        void print(AbstractA aObj){//0x7788    多态的形式。父类的引用指向之类对象
                aObj.show();
        //  0x7788.show();
        }
}
class Demo
{
        public static void main(String[] args)
        {
                B b = new B();
                SubA aObj = new SubA();//0x7788
                b.print(aObj);//0x7788
                SubB aObj2 = new SubB();
                b.print(aObj2);
                C c = new C();
        //        b.print(c);//编译错误。C不是AbstractA的子类;
        }
}

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马