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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 你为谁归来 中级黑马   /  2014-4-25 21:10  /  1165 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. abstract class jzl
  2. {
  3.         private jzl(){};
  4.         public abstract void day();
  5.         public abstract void day2();

  6.         public  void day3()
  7.         {
  8.                 System.out.println("123456789");
  9.         }
  10.         public static jzl a=new jzl(){

  11.                 public void day()
  12.                 {
  13.                         // TODO Auto-generated method stub
  14.                        
  15.                 }

  16.                 public void day2()
  17.                 {
  18.                         // TODO Auto-generated method stub
  19.                        
  20.                 }
  21.                
  22.         };
  23.        

  24. }
  25. public class Demo4
  26. {

  27.         /**
  28.          * @param args
  29.          */
  30.         public static void main(String[] args)
  31.         {
  32.                 // TODO Auto-generated method stub
  33.                
  34.        
  35.                 jzl.a.day3();
  36.         }

  37. }
复制代码


new出来的那个是什么?内部类吗?为什么还要覆写抽象类中的方法?

5 个回复

倒序浏览
  1.     public static jzl a=new jzl(){

  2.                 public void day()
  3.                 {
  4.                         // TODO Auto-generated method stub
  5.                         
  6.                 }

  7.                 public void day2()
  8.                 {
  9.                         // TODO Auto-generated method stub
  10.                         
  11.                 }
  12.                
  13.         };
复制代码


这是一个匿名内部类,也相当于jzl的一个子类,创建匿名内部类,父类中如果是抽象的话,就要覆盖父类中抽象的方法。
正如你上面的代码
jzl是个抽象类,有
public abstract void day();
        public abstract void day2();
两个抽象方法,要使用匿名内部类,必须覆盖父类抽象方法。酱紫

评分

参与人数 1技术分 +1 收起 理由
SyouRai_Tsk + 1

查看全部评分

回复 使用道具 举报
abstract class jzl{
        private jzl() {};
        public abstract void day();
        public abstract void day2();
        public void day3(){
                System.out.println("123456789");
        }
        /*
         * 1、下面这段代码的意思是创建一个内部类并将内部类的对象引用赋值给jzl这个抽象类类型的变量
         *   这个使用的是标准的多态特性。
         * 2、一个类要继承于一个抽象类,那么这个类就必须要实现抽象类中所有的抽象方法,也就是覆盖抽
         *   象类中的抽象方法
         */
        public static jzl a = new jzl() {
                public void day(){
                }
                public void day2(){
                }
        };
}
public class Demo4{
        public static void main(String[] args){
                jzl.a.day3();
        }
}

评分

参与人数 1技术分 +1 收起 理由
SyouRai_Tsk + 1

查看全部评分

回复 使用道具 举报
  1. abstract class jzl
  2. {
  3.         private jzl(){};
  4.         public abstract void day();
  5.         public abstract void day2();

  6.         public  void day3()
  7.         {
  8.                 System.out.println("123456789");
  9.         }
  10.         public static jzl a=new jzl(){      
  11. //[color=Red]因为抽象的类是不能建立对象,这里实际上是用匿名内部                                                                                    类的的方式指向了一个子类的对象。因为匿名内部类必须是有继承或实现才能用父类名建立对象。[/color]

  12.                 public void day()
  13.                 {
  14.                         // TODO Auto-generated method stub
  15.                         
  16.                 }

  17.                 public void day2()
  18.                 {
  19.                         // TODO Auto-generated method stub
  20.                         
  21.                 }
  22.                
  23.         };
  24.         

  25. }
  26. public class Demo4
  27. {

  28.         /**
  29.          * @param args
  30.          */
  31.         public static void main(String[] args)
  32.         {
  33.                 // TODO Auto-generated method stub
  34.             
  35.                jzl.a.day3();
  36.         }

  37. }
复制代码
回复 使用道具 举报
能够复写jzl类的两个方法的就只有是它的子类了,所有new出来的是jzl的子类,这是匿名内部类。因为抽象类是不能直接建立对象的,它只有通过继承给子类并且覆盖里面的抽象方法才能建立对象。
回复 使用道具 举报
abstract class jzl
{
        private jzl(){};
        public abstract void day();
        public abstract void day2();
        public  void day3()
        {
                System.out.println("123456789");
        }
        public static jzl a=new jzl(){          //这是jzl的匿名内部类,因为私有化了构造方法,外部类不能创建类的对象,所以在类的内部创建一个静态的匿名对象
                                                             //这样,就可以通过类名调用类的实例对象了。
                                                             // 因为day、day2方法是抽象的,所以在创建类的实例对象的时候必须实现抽象方法,所以这里将抽象方法的实现写在内部类中
                public void day()
                {
                        // TODO Auto-generated method stub
                        
                }
                public void day2()
                {
                        // TODO Auto-generated method stub
                        
                }
               
        };
        
}
public class Demo4
{
        /**
         * @param args
         */
        public static void main(String[] args)
        {
                // TODO Auto-generated method stub
               
        
                jzl.a.day3();
        }
}

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马