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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 任艳旭 中级黑马   /  2012-9-7 11:03  /  4342 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 任艳旭 于 2012-9-7 18:42 编辑

抽象类里有抽象方法,类必须也要用abstract修饰为抽象类,抽象类里可以没有抽象方法,为什么不能创建对象呢?

8 个回复

倒序浏览
本帖最后由 焦晨光 于 2012-9-7 11:46 编辑

抽象类里的都是抽象方法,正因为它里面有抽象方法所以它才为抽象类
抽象类是不能被实例化的,只能子类继承该抽象类,并实现抽象类里的所有抽象方法
该子类可以被实例化,如果该子类继承了抽象类,并没有实现抽象类里的抽象方法
那么该子类一样也是抽象类,不能被实例化。
回复 使用道具 举报
本帖最后由 张飞年 于 2012-9-7 11:17 编辑

      抽象类不可以实例化,为什么不可以,这个与类的定义有关吧,类是对一种事物共同点的描述,有属性方法才能是一个对象,而抽象类可能会包含抽象方法,也就是不确定的属性,如果也能实例化为一个类,那就,,,无所不能了,至少这个对象就不是个确定的对象了。在这里可以站在设计者的立场上想想或许容易些,如果你是设计者,你会让他实例化吗?
    再者,对于相似的知识点也可以看看,或许对这个问题有更深的理解。建议有空看看老师的面试宝典,里面好多都是细节的东西,对我们很有用的。
    抽象类可以实现(implements)接口,抽象类是否可继承具体类。抽象类中可以有静态的main方法。 只有记住抽象类与普通类的唯一区别就是不能创建实例对象和允许有abstract方法。
回复 使用道具 举报
本帖最后由 武庆东 于 2012-9-7 11:29 编辑

     抽象类是一个不完整的类,因为抽象类中有些方法只进行声明而没有去时间!能够创建对象的类必须是一个完成类,这就需要考虑为什么会有抽象类!
抽象类:
     从多个具有相同特征的类中抽象出一个抽象类,以这个抽象类作为其子类的模版,从而避免了子类设计的随意性,抽象类体现的是一种模版模式的设计,抽象类作为多个子类的通用模板,子类在抽象类的基础上进行扩展、改造,但子类总体上会大致保留抽象类的行为方式!
回复 使用道具 举报
我的理解:抽象方法就是没有内容的方法。
抽象类就是单纯只是实现实体的需求,即使建立了对象的话就好像装不了任何东西的容器,完全没有意义。
2L,抽象类里面是可以没有抽象方法的。
凡是被abstract修饰的类都是抽象类,没有抽象方法的抽象类存在没有任何意义。
有抽象方法的抽象类的意义就是防止建立对象。
java底层就有完全没有抽象方法的抽象类。

回复 使用道具 举报
本帖最后由 马镱洵 于 2012-9-7 12:11 编辑

研究为什么一点意义都没有,这是高斯林那帮人硬性规定的,他们也可以让抽象类可以实例化,决定权在高斯林,我们要是什么都去问为什么,迟早会走火入魔.
现在纠正一下2楼的一句说法错误,抽象类可以有构造方法.
回复 使用道具 举报
1:抽象类
        (1)多个类有相同的方法声明,但是方法体不一样。这个时候,我们考虑把方法声明进行抽取。
           让子类继承后,自己去实现方法体。没有方法体的方法,我们需要用抽象标志下。
           抽象的关键字是:abstract。
        (2)抽象类:
                Java中可以定义没有方法体的方法,该方法的具体实现由子类完成,
                该方法称为抽象方法,包含抽象方法的类就是抽象类。
        (3)抽象类的特点:
                A:抽象类和抽象方法都要用abstract进行修饰
                B:抽象类不能被实例化
                C:抽象类中不一定有抽象方法,但是,有抽象方法的类一定是抽象类。
                D:抽象类的使用。通过子类对象来使用方法。
                        抽象类:Animal
                        子类:Dog

                        //不能用
                        //Animal a = new Animal();
                        Animal a = new Dog(); //多态
                        Dog d = new Dog();
        (4)抽象类中数据的特点
                A:成员变量
                        抽象类中可以有成员变量,也可以有常量。
                B:成员方法
                        抽象类中可以有抽象方法,也可以有非抽象方法。
                C:构造方法
                        抽象类是一个类,所以,它有构造方法。
                        虽然本身不能实例化。但是可以给子类实例化使用。
        (5)抽象类中的问题
                A:抽象类中是否有构造方法?能不能被实例化?如果不能,为什么有构造方法?
                  抽象类有构造方法。
                  抽象类不能被实例化。
                  抽象类中的构造方法供子类实例化调用。
                B:抽象关键字abstract不可以和哪些关键字共存?
                  **private:
                        私有内容子类继承不到,所以,不能重写。
                        但是,abstract修饰的方法,要求被重写。两者冲突。
                  **final
                        final修饰的方法不能被重写。
                        而abstract修饰的方法,要求被重写。两者冲突。                        
                  **static
                        假如一个抽象方法能通过static修饰,那么这个方法,就可以直接通过类名调用。
                        而抽象方法是没有方法体的,这样的调用无意义。所以,不能用static修饰。
                C:抽象类中可不可以没有抽象方法?如果可以,这样的类有什么用吗?
                  抽象类可以没有抽象方法。
                  抽象类不能被实例化。这个在awt中有体现。
======================
一个实例你看看:
abstract class Demo
{
        abstract void show();
        abstract void method();
}

class ZiDemo extends Demo
{
        void show()
        {
                System.out.println("ZiDemo-show");
        }
}

class AbstraceDemo2
{
        public static void main(String[] args)
        {
                //抽象类不能被实例化
                //Demo d = new Demo();

                //ZiDemo zd = new ZiDemo();
                //zd.show();

                //Demo d = new ZiDemo();
                //d.show();
        }
}
总之一句话:因为抽象类中的抽象方法没有具体的实现,通过对象调用没有意义。所以,抽象类不能被实例化。

评分

参与人数 1技术分 +1 收起 理由
王德升 + 1 很给力!

查看全部评分

回复 使用道具 举报
当多个类中出现相同功能,但是功能主体不同
这时可以进行向上抽取,这时,只抽取功能定义,而不抽取功能主体
抽象:所谓的看不懂,模糊,笼统
抽象类的特点:
1 抽象方法一定定义在抽象类中
2 抽象方法和抽象类都必须被abstract关键字修饰
3 抽象类不可以用new创建对象 因为调用抽象方法没意义
4 抽象类中的抽象方法要被使用,必须由子类复写其所有的抽象方法后,建立子类对象调用
如果子类只覆盖了部分抽象方法,那么该子类还是一个抽象类
父类的抽象方法是为了强制子类必须重写该方法

抽象类和一般类没有太大的不同
该如何描述事物 就如何描述事物,只不过,该事物出现了一些看不懂的东西
这些不确定的部分,也是该事物的功能,需要明确出来,但是无法定义主体
通过抽象方法来表示
抽象类比一般类多了抽象方法,就是在类中可以定义抽象方法
抽象类不可以实例化
特殊:抽象类中可以不定义抽象方法,这样做仅仅是不让该类建立对象

因为抽象类中的抽象方法没有方法体,所以实例化抽象类是没有意义的,因为实例化成功后,调用里面的抽象方法就不知道如何执行
抽象类中可以有非抽象方法,但是抽象方法只能放在抽象类中
所以当类中有抽象方法时,这个类就必须用abstract来修饰
所以抽象类不能实例化

评分

参与人数 1技术分 +1 收起 理由
王德升 + 1 赞一个!

查看全部评分

回复 使用道具 举报
这就是java语言的规定,这就是计算机语言,记住就行了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马