请问:Java中的抽象类有没有对象?(一道大唐移动面试题)

解决方案 »

  1.   

    抽象类可以声明对象,但是不能使用自身的构造方法创建对象,但是可以使用子类的构造方法进行创建。
    public abstract class A{}
    public class B extends A{}A a = new B();
      

  2.   

    抽象类是不能有对象的。虽然有时候看到使用抽象的方法(如List.xxx),这时只不过是指向他子类的对象。抽象类一般使用工厂方法来获得其子类对象,例如日历类。
      

  3.   

    这道题目其实考的是你对java的理解。
    2楼的回答可以看做是官方的正解,如果你是在笔试,姑且勉强给你个满分;但如果是面试中这样回答的话,估计很难让人满意。按照java的编程思想“一切皆对象”,那么当你创建一个抽象类时,它本身就是一个对象;在面向对象的编程中,出现“抽象类”这一东东,本身就是很尴尬的,至于为什么有它,我想深入后,大家都知道了。
      

  4.   


    顺便问一下,有没有大唐移动的朋友?大唐移动招java程序员做哪方面的开发?
      

  5.   

    如果你真想直接实例。
    你就在后面将它里面的abstract方法实现就OK了。
    可以这么写:
    public abstract class A{
     public abstract void B();
    }A a = new A(){
      public void B(){
      }
    };其实这样子的效果就是一个子类的概念了。
      

  6.   

    大家看一下下面的程序:public abstract class A {
    private String ss="22332";
    public A(String a){
    System.out.println(a);
    }
    public String getSs(){
    return ss;
    }}public class B extends A { public B() {
    super("123123");
    System.out.println(super.getSs());
    // TODO Auto-generated constructor stub
    }
    /**
     * @param args
     */
    public static void main(String[] args) {
    System.out.println(new B().getSs()); }}
    我们的super.getSs()就是显示的调用了A的getSS()方法,只不过这个对象是匿名的,我们用关键字super调用了。并且这只能在子类中做到.
    super("123123");就是创建了父类的对象,只不过也必须在子类中
      

  7.   

    抽象类有对象因为继承抽象类的子类可以使用 super...
      

  8.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【zhu_apollo】截止到2008-06-28 13:30:06的历史汇总数据(不包括此帖):
    发帖数:37                 发帖分:343                
    结贴数:21                 结贴分:181                
    未结数:16                 未结分:162                
    结贴率:56.76 %            结分率:52.77 %            
    楼主加油
      

  9.   

    谢谢大家的回答我觉得有争议的问题提出来让大家讨论才有意思,这个题目问的没有问题,主要看你如何回答?不能肯定的回答“是” 或者 “否”。这就是考官要考你的分析能力,看下面的程序abstract class BaseClass
    {
    private int a = 5;
    public BaseClass()
    {

    }
    public void baseFun()
    {
    System.out.println("基类方法");
    }
    }class DerivedClass extends BaseClass
    {
    private int b = 6;
    public DerivedClass()
    {

    }
    public void derivedFun()
    {
    System.out.println("子类方法");
    }
    }
    public class TestAbstractClass { /**
     * @param args
     */
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    BaseClass base ;//可以声明一个基类对象
    base = new DerivedClass();//利用子类构造一个对象,让base指向它,因为是"is-a"关系,
                                              所以子类对象也是父类对象,此时可以认为父类(抽象类有对象)
    }}总结:(1)抽象类可以“声明”(注意:并不是创建)一个对象,然后利用子类构造一个对象,抽象类如果有对象,
    这个对象也是用它的子类创建的,子类对象也是父类对象(is-a关系),故此时可以认为父类(抽象类)有对象。(2)抽象类,就是因为是抽象的,表示未完全实现的,因此不能实例化,即:没有实例。虽然抽象类也有自己的构造方法,但是不能用自己的构造方法来构造一个实例。
      

  10.   

    抽象类是不能创建对象的,也就是不可以new一个对象,但是它可以创建一个引用,用来指向子类的实例!
    abstract class A{
    }
    class B extends A{
    }
    A a=new B();
      

  11.   

    其实可以准确地回答面试官:没有!
    因为抽象类是不能实例化的,而对象是类的实例化.
    另外,为什么大家都觉得2楼是完美的答案呢?public abstract class A{}
    public class B extends A{}A a = new B(); 
    这里,A a是在声明一个A类的reference,而非声明A类的一个对象,所以在这种情况下,也是没有类A的对象的.
    因此大家不用质疑出题者的水平了.
      

  12.   

    抽象类和接口都可以声明一个对象,但是只声明了对象的引用
    即可以这样
    List list = null;(抽象类)
    List<String> list = null; (接口)这两个例子分别演示了抽象类和接口声明对象的过程。但是这只是声明了对象的一个引用,并不能指向任何实例。
    具体实例需要其非抽象的子类或者是实现类来声明。如下:list = new ArrayList();(抽象类)
    list = new ArrayList<String>();(接口)这两句的意思是,创建实例,并且将刚刚创建的引用指向这个新的实例。也就是说,平常连着写 List list = new ArrayList(); 其实包括几部分内容:
    1,创建对象引用,存放于堆栈中。
    2,创建对象实例,存放于堆中。
    3,将引用指向刚刚创建的实例。基本是这样的