黑马程序员技术交流社区

标题: 关于抽象类的一个疑问 [打印本页]

作者: fiend    时间: 2012-7-27 21:15
标题: 关于抽象类的一个疑问
本帖最后由 fiend 于 2012-7-27 21:37 编辑
  1. abstract class Test {
  2.         public Test() {
  3.                 System.out.println("Test Constructor");
  4.         }
  5.         public static void main(String[] args) {
  6.                 new Test(){
  7.                         
  8.                         };
  9.         }
  10. }
复制代码
我根据接口的经验,实例一个抽象类的子类对象。结果输出:Test Constructor。我就疑惑了,哪来的子类?如果不是子类,那难道是抽象类本身?显然不是。求解释。。。
作者: 王程    时间: 2012-7-27 21:32
abstract class Test {
        public Test() {
                System.out.println("Test Constructor");
        }
        public static void main(String[] args) {
                new Test(){

                        };
        }
}
//这是一个内部类,new Test()是建立了Test类的一个子类,由于Test类中没有方法,所以就不需要复写任何方法,这时子类自动调用了父类中构造方法,就输出了Test Constructor,
如果改成new Test();这时就会出错了

作者: 李菁    时间: 2012-7-27 21:33
抽象类可以有构造方法,只是它的构造方法不可继承。子类可以用super()调用
如果抽象类中写了有参构造函数,那么在子类租继承时就必须写一个构造函数来调用父类的构造函数。
作者: fiend    时间: 2012-7-27 21:37
王程 发表于 2012-7-27 21:32
abstract class Test {
        public Test() {
                System.out.println("Test Constructor") ...

我明白了,匿名内部类。。。我着相了。。。。晕,谢谢
作者: 王宝康    时间: 2012-7-27 21:45
发表于 9 分钟前 |只看该作者 abstract class Test {
        public Test() {
                System.out.println("Test Constructor");
        }
        public static void main(String[] args) {
                new Test(){

                        };
        }
}
//这是一个内部类,new Test()是建立了Test类的一个子类,由于Test类中没有方法,所以就不需要复写任何方法,这时子类自动调用了父类中构造方法,就输出了Test Constructor,
如果改成new Test();这时就会出错了

{:soso_e179:}
作者: 吴立杰    时间: 2012-7-27 22:29
  1. abstract class Test {
  2.         public Test() {
  3.                 System.out.println("Test Constructor");
  4.         }
  5.         public static void main(String[] args) {
  6.                 new Test(){
  7.                         
  8.                         };//这个地方是匿名内部类,返回的是子类对象。而你这个对象调用的是父类的空参构造,所以打印出那句话咯,没有什么奇怪的吧?
  9.         }
  10. }
复制代码

作者: 黑马王冬冬    时间: 2012-7-28 00:51
  1. abstract class Test {
  2.     public Test() {
  3.             System.out.println("Test Constructor");
  4.     }
  5.    
  6.     public static void main(String[] args) {          
  7.             new Test() {};//位置1匿名内部类
  8.     }
复制代码
1.位置1处创建了一个匿名内部类,相当于
  class extTest extends Test {}
  extTest et = new extTest();
2.创建任何对象总是从该类所在继承树的最顶层类的构造器开始执行,然后依次向下执行到本类构造器。
创建匿名内部类的对象时,会先调用父类的构造器,故而打印字符串Test Constructor。




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