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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© fiend 中级黑马   /  2012-7-27 21:15  /  1996 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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。我就疑惑了,哪来的子类?如果不是子类,那难道是抽象类本身?显然不是。求解释。。。

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

6 个回复

倒序浏览
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();这时就会出错了

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

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

我明白了,匿名内部类。。。我着相了。。。。晕,谢谢
回复 使用道具 举报
发表于 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:}
回复 使用道具 举报
  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. }
复制代码
回复 使用道具 举报
  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。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马