黑马程序员技术交流社区

标题: 抽象类无法实例化深入讨论 [打印本页]

作者: 杨华东    时间: 2012-10-15 22:13
标题: 抽象类无法实例化深入讨论
本帖最后由 杨华东 于 2012-10-21 20:11 编辑

/*整个抽象类中没有抽象方法*/
abstract class Demo
{
    void method()
    {
     System.out.println("调用我有意义!!!!");
    }
}
class Test2
{
public static void main(String[] args){
  Demo d=new Demo();//编译错误,老毕说过抽象类不可以创建对象原因是:调用抽象方法说没意义。
  d.method();//编译没有错误。因为该方法有意义。。。。无语啊。。。谁能解释一哈????
}
}
关于抽象类不能实例化的深入原因到底是啥玩意造成的??
现在看来不是抽象方法造成的!!绝对不是!!!
希望大神门 努力努力  解决我的疑虑。。。。谢谢谢谢
作者: 马磊    时间: 2012-10-15 23:10
本帖最后由 马磊 于 2012-10-15 23:17 编辑

不太懂你的问题,Demo d=new Demo(); 这一句就已经编译错误了,不能初始化Demo类,那对象d根本就不存在,更不用说使用d的方法了。
因为Demo是抽象类,必须要有子类继承之后创建子类的对象才可以调用其内部的方法。
你可以这样写一个子类:
class SubDemo extends Demo()
{
}
然后new 一个SubDemo,就可以使用method了。
作者: 廖智    时间: 2012-10-15 23:30
本帖最后由 廖智 于 2012-10-15 23:33 编辑
马磊 发表于 2012-10-15 23:10
不太懂你的问题,Demo d=new Demo(); 这一句就已经编译错误了,不能初始化Demo类,那对象d根本就不存在,更 ...


在java中只要是抽象类都是不能被实例化的。

作者: 焦志鹏    时间: 2012-10-15 23:31
所谓抽象类不可以创建对象,是因为抽象类中一定含有抽象函数方法,
而如果你抽象类能定义一个对象,那么这个对象如何去调用这个抽象的方法?

例如:
abstract class Demo
{
    void method()
    {
     System.out.println("调用我有意义!!!!");
    }

abstract  void method1(); // 假如我定义一个抽象方法
  
}

这个时候,如果定义一个对象 Demo D = new Demo();
那么D.method1() 是干嘛的?
你让D情何以堪啊......
作者: 廖智    时间: 2012-10-15 23:34
本帖最后由 廖智 于 2012-10-15 23:37 编辑

1、首先你写的Demo类上加了abstract关键字。说明这是一个抽象类,不管这个类中有没有抽象方法,这个类还是抽象类。
2、只要是抽象类,在java中是不能被实例化的。 所以你大可不管这个抽象类中有没有抽象方法。
3、在java中也存在没有抽象方法的抽象类,这样的设计仅仅是为了不让该方法被实例化。
作者: 林志进    时间: 2012-10-15 23:39
[img]%5Battachimg%5D8294[/attachimg][/img] 实践显示Demo d=new Demo();这里就编译不成功了。 抽象类是一些抽象概念上的东西,是我们设计人员独立出来而现实不存在的东西。
作者: 杨华东    时间: 2012-10-16 00:31
抽想到这里  有木有感觉 被Java机制 强行强迫做了这么一件事:就是不让你建立对象!!!
底层的东西很可怕 。有同意的不????
就像老毕说的那样 抽象类与普通类真的区别太小了,就那么一点区别 Java低层机制就强行不让俺们建立对象。。。。。
我们还有很长路要走啊。。。。一起努力进黑马
作者: 马州州    时间: 2012-10-16 01:41
说白了就是安全问题,如果你一个抽象方法都没有的话,你还定义成抽象类干啥?
如果有抽象方法的话,创建对象之后的调用就会出问题
这样的规则还是有好处的,直接避免了很多安全问题
作者: 杨华东    时间: 2012-10-16 10:29
本帖最后由 杨华东 于 2012-10-16 10:38 编辑
马州州 发表于 2012-10-16 01:41
说白了就是安全问题,如果你一个抽象方法都没有的话,你还定义成抽象类干啥?
如果有抽象方法的话,创建对 ...


这位兄弟,你忘了一件事
一个类被抽象就算没有抽象方法,但是还可以有一个作用:不让别人建立我的对象。
这与构造函数私有化有类似的作用。不过比构造函数私有化更好用!!
一个例子:
1,如果是把普通类的构造函数私有化了那么其子类就无法复用其构造函数。
如:
class Demo
{
    int age ;
    String name;
   private Demo(int age,Strng name)
    {
           this.age=age;
           this.name=name;
     }
}

class Test extends Demo
  {
       Test(int age,String name)
          {
             super(age,name);//编译绝对错误!!!!因为父类Demo的构造函数私有化了。。
           }
   }
2,如果把普通类抽象一哈就是加一个修饰符abstract而已,此时我们同样可以不让别人建立我的对象。
      同时呢我的构造函数不会受到任何影响,可以被我的子类继续使用!!!
      这样一来我们可以实现两个目的:一,别人无法建立我的对象。二,我的构造函数又可以被我的子类继续使用
      一举两得啊。。。。。。有同意的不????
     如:
   abstract class Demo
    {
       int age;
       String name;
       Demo(int age,String name)
        {
            this.age=age;
            this.name=name;
         }
     classs Test extends Demo
      {
          Test(int age,String name)
           {
             super(age,name);//完全没错误。。。。
            }
       }

其实大家在这里就可以得出结论了:在Java中一个类被abstract修饰后就会被强制的不让别人建立其对象。。。是一种手段而已
这种手段恰好又不会影响到我正常使用其中的内容比如构造函数等。。。
这种手段到底是怎么做到的有点神秘!!!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2