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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 乔红超 中级黑马   /  2013-5-15 12:58  /  2421 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 乔红超 于 2013-5-24 17:38 编辑

请问抽象类和抽象方法有什么区别?通常在什么情况下用到抽象方法和抽象类啊?

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

4 个回复

倒序浏览
接口有严格的定义要求,其中的方法只能是public abstract修饰的抽象方法,其中的变量只能是public static final 修饰的常量
而抽象类没有这些要求,我们只要求一个类中如果有抽象方法,那么这个类必须申明为抽象类
另外,没有抽象方法的类也可以声明为abstract,这样做的目的是可以使这个类不能被实例化
回复 使用道具 举报
方法存在于类中,这是两个不同的概念.
关于这点你可以去仔细研读下面向对象的文字定义,方法是类中的一个成员, 通过创建类的对象来调用方法,
方法有public的: 访问权限最大
private的: 仅当类对象可以访问
protected:当类和子类对象可以访问
abstract: 抽象的,没有具体的方法内容, 当子类继承时必须要重写
而抽象类,就是具有抽象方法的类, 该类中可以有非抽象的成员.
接口中的所有方法都是抽象的public abstract的, 所有成员变量都是public static final...
楼主平时手机上存些定义文本,没事看看很有用的
回复 使用道具 举报
抽象类定义时需在class前面加abstract修饰,抽象类是没有实例的,也就是不能创建该抽象类的对象。抽象类中可有也可没有抽象方法。如果有的话,抽象方法要用 abstract 修饰,abstract 需置于访问权限修饰符后面。抽象类中的抽象方法是没有方法体的(注意:不是方法体为空),形参表后面跟个; 即可。
如果该类有抽象方法,则该类必须是抽象类,否则编译时报错。在多态中,一个父类有多个子类,每个子类都有一些相似的特性和行为,涉及到多种形态。
如果知道一个抽象类的方法能干什么,却不知道怎么干,就可以把该方法指定为抽象方法。父类中的抽象方法往往在子类中得到不同的具体实现。下面举一个例子:

abstract  class  Person{ //Person类是抽象类
    abstract void eat(); //人自然会吃东西,但不同地区的人吃东西用不同的餐具,因为不知道是什么人,所以将eat方法定义为抽象的,由子类将eat方法补充完整
}

class Chinese extends Person{ //Chinese类继承了Person类,也继承了Person类的抽象方法abstract  void  eat(); ,该方法需在Chinese类中补充完整,否则Chinese
                                               //类仍是抽象类,无法创建Chinese类的实例
       void eat(){ System.out.println("用筷子吃东西“);} //将父类中的抽象方法eat补充完整
}

class West extends Person{
       void eat(){ System.out.println("用叉子和小刀吃东西“);} //将父类中的抽象方法eat补充完整
}
回复 使用道具 举报
这是我的日记,现在弄出来你可以看一下  

抽象成员和抽象类
抽象成员是设计来被覆写的函数成员。它有以下几点特征:
1它被abstract修饰符标记
2.没有实现代码块。在括号后加分号;
3.抽象成员只包括方法,属性,索引,事件。不包括字段
4.抽象成员只能在抽象类中使用。
5.抽象成员必须在继承它的类中实现。除非那个类是也是抽象类。
6.就像虚成员一样,实现抽象成员的时候必须加上override。

抽象类是被设计来被继承的。也应该注意以下几点:
1它也被abstract修饰符标记。
2,抽象类不能被实例化。
3抽象类中可以有抽象成员和非抽象成员。但是抽象成员一定在抽象类中。
4抽象类可以派生另一个抽象类。
5.派生自抽象类的类必须要使用override实现所有该类的所有成员。

我还是认为看几个例子会比较清晰明了;
实例1:
class Program
    {
        static void Main(string[] args)
        {
            Person p = new Chinese();
            p.Name = "Chinese";
            Console.WriteLine(p.Name);
            p.MyMethod();
            p.SayHello();
           
            Console.ReadKey();
        }
    }
    abstract class Person           //抽象类
    {
        public string Name { set; get; }            //非抽象属性
        public abstract void MyMethod();       //抽象方法
        public abstract void SayHello();        //抽象方法
      
    }
    class Chinese : Person
    {
        public override void MyMethod()       //实现了MyMothod()方法
        {
            Console.WriteLine("我是中国人");
        }
        public override void SayHello()       //实现了SayHello()方法
        {
            Console.WriteLine("你好!吃饭没?");
        }

}


实例2


  class Program
    {
        static void Main(string[] args)
        {

            BaseClass b = new DerivedClass();
           Console.WriteLine(b.Area());
            b.Name = "柳传智";
            b.PrintArgument("杨中科");
            Console.WriteLine(b.Name);

           
            Console.ReadKey();
        }
    }
    abstract class BaseClass
    {
        public abstract string Name { set; get; }  
        public abstract void PrintArgument(string s);
        int width = 3,height=4;     //抽象类中的非抽象成员
        public int Area(){return width*height;} //非抽象方法
    }
    class DerivedClass : BaseClass
    {

        string name;
        public override string Name
        {
            get
            {
                return name;
            }
            set
            {
                name = (value !="")? value : "无名氏";
            }
        }

        public override void PrintArgument(string s)
        {
            Console.WriteLine(s);
        }
    }




评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马