package com.abstracttest;abstract class A {
    public abstract void doSomething();
}class B extends A {
    public void doSomething() {
        System.out.println("do B");
    }
}class C extends A {
    public void doSomething() {
        System.out.println("do C");
    }
}public class TestAbstract {
    public static void main(String[] args) {
        A a1 = new B();
        A a2 = new C();
        B b = new B();
        C c = new C();
        doSomething(a1); //这里
        doSomething(a2); //这里
        doSomething(b); //这里,如果下面的方法不是用抽象类作参数,比如用C c做参数,这里会有什么问题?
        doSomething(c); //这里
    }    public static void doSomething(A a) {//这里,用抽象类,为什么,LZ自己思考
        a.doSomething();
    }
}将上面的抽象类A改成这样,也能实现同样的功能,求这两个之间的区别?那个更好class A{
   public void doSumthing(){}
}

解决方案 »

  1.   

    楼猪,如果用上面的方式, 加了abstract 表示这个方法是抽象方法,  他自己里面是不能有方法体只是一个“空壳子”   具体的实现由他的子类去实际,就是你的B,C 你会发现,只要继承至A,就一定要实现他的doSomething()
    如果你改了以后,那就重写 子类与父类有同样的方法那叫重写。。麻烦楼主,自己多看下书把面向对象,反反复复的看上10遍。。所有的例子都敲一下。
      

  2.   

    它们的区别是,第一种形式,如果你继承了class A那么就必须要将里面的方法实现,而第二种形式,继承了Class A也可以不实现里面的doSomething方法。具体使用还要看你的目的,效率上应该没有什么大的差别
      

  3.   

     接口所有方法需要全部实现,就是你的第一个!
    下边那个只能当做父类,直接继承可以,可以不实现!我也是新手,就我的理解来看,比较重要的地方是,一个类只能继承一个父类,所以,如果你写的某个类已经继承了非OBJ的另外一个类,就不能继承你自己写的这个类。但是作为一个接口话,implements 实现
    只是新手,探讨一下
      

  4.   

    不想实例化,直接加abstract
     abstract class A
    {
        public void doSumthing(){}
    }
      

  5.   

    [Quote=引用 1 楼 amos1989 的回复:]
    楼猪,如果用上面的方式, 加了abstract 表示这个方法是抽象方法, 他自己里面是不能有方法体只是一个“空壳子” 具体的实现由他的子类去实际,就是你的B,C 你会发现,只要继承至A,就一定要实现他的doSomething()
    如果你改了以后,那就重写 子类与父类有同样的方法那叫重写。。麻烦楼主,自己多看下书把面向对象,反反复复的看上10遍。。所有的例子都敲一下……
    [顶
      

  6.   

    将上面的抽象类A改成这样,也能实现同样的功能,求这两个之间的区别区别是
    上面的静态方法表现出多态性,当增加D、E等其他子类时不需要修改原有代码,可维护性更好。
    下面的A只有一种行为,也即doSumthing();当A的行为需要被B、C类等与之有同样的doSumthing()行为的类取代时需要修改代码;//这里,如果下面的方法不是用抽象类作参数,比如用C c做参数,这里会有什么问题?doSomething(A a)向其中传递A子类对象参数时不会出现问题,但如果是C等子类签名,那么传递参数对象时应该是C或其子类,这里需了解向上转型和向下转型的区别和面向对象设计里面的可替换原则;
      

  7.   

    doSomething(a1): 
     doSomething(a2);        
     doSomething(b);
    doSomething(c); 
    我初学者,请教可以这样写吗?doSomething是一个方法,定义时没有形参,可以将对象作为参数传给doSomething吗
      

  8.   


    TestAbstract类里面有个静态的 doSomething(A a)
    调用的是这个方法