asbtract Person {
   public abstractvoid  eat ();
}
public class Demo {
   public static void main(String[] args){
      Person p = new Person (){
        public  void eat (){
          system.out .println(“hello”)
    }
  }
 }
}

解决方案 »

  1.   

    Person p = new Person (){
             public  void eat (){
               system.out .println(“hello”)
         }
    实际上生成了一个继承Person,并实现了eat方法的匿名类的实例
    匿名类,就是这个类没有显式的名字,但是继承父类并实现了所有的抽象方法,或者实现了接口方法
      

  2.   

    对java来说,类是可以实例化的,不管你是子类,父类,还是抽象类;就如同1+1=2,你问为什么等于2,这个真的不容易有答案?
      

  3.   

    1楼正解,2楼瞎说。 
    仔细理解我下面这段话:
    1. new 关键字可以理解为在堆内存分配一块存储区域,这块区域长什么样由new关键字后面的东西决定,
    2. 然后这块区域的入口地址赋给连着等号左边的的变量,以后拿这个变量就可以对这块区域进行操作,
    3. 但是能做什么操作,取决于这个变量左边的类型。
    如果还有问题可以来我空间提问(www.java123.vip)
      

  4.   


    你确定楼主的代码可以编译?不能编译说什么都是白搭,反正我是怎么改都不能通过编译的。楼主这笔误真够多的package test.gt50;abstract class Person {
    public abstract void eat();
    }public class Demo {
    public static void main(String[] args) {
    Person p = new Person() {
    public void eat() {
    System.out.println("hello");
    }
    };
    }
    }
     

      

  5.   

    楼主只是拼错了几个单词,写错了一些大小写,和全角半角双引号,少了一个分号。
    改成下面就可以了,用接口或抽象类new一个匿名类语法上没什么好说的,自己查查资料。abstract class Person {
       public abstract void  eat ();
    }public class Demo {
       public static void main(String[] args){
          Person p = new Person (){
            public  void eat (){
              System.out.println("hello");
            }
          };
          
          p.eat();
     }
    }
      

  6.   

    抽象类不能实例化。   抽象类在你new的时候,会在类中出现你未实现的方法,默认返回null,为什么不可以实例呢?楼主问的问题是:为什么抽象类可以实例化,我看到很多回答说的是:实例化的过程和以及对象在jvm的分布,这难道是为什么可以实例化的原因么?
      

  7.   

    抽象类不能实例化。   抽象类在你new的时候,会在类中出现你未实现的方法,默认返回null,为什么不可以实例呢?楼主问的问题是:为什么抽象类可以实例化,我看到很多回答说的是:实例化的过程和以及对象在jvm的分布,这难道是为什么可以实例化的原因么?
    new抽象类和new接口类似,实际上编译器是产生一个匿名类定义,实例化的时匿名类。
    可以说是通过匿名类实现间接的实例化。
    所以把抽象类和类的概念放一起是不对的,它实例化的方式更类似于接口。
      

  8.   

    楼上正解。
    接口和抽象类是不能实例化的,楼主的做法会在编译后产生匿名类class文件。
    如果说抽象类和普通类一样是可以实例化的,何必要产生这样一个匿名类呢。
    另外一个朋友可以去反编译看看这个匿名类,看是不是继承于这个抽象类就知道了。
      

  9.   

    你甚至还可以在这个匿名类里面定义一些方法,用Class对象反射获取调用
      

  10.   

    Person p = new Person(); 这样才叫实例化Person,显然这样是不行的,抽象类不能实例化。
    而 Person p = new Person(){ public  void eat (){ } }; 这样实例化的是一个继承自Person的匿名类(实现了方法eat),而不是实例化Person
      

  11.   

    Person p = new Person (){
             public  void eat (){
               system.out .println(“hello”)
         }
    实际上生成了一个继承Person,并实现了eat方法的匿名类的实例
    匿名类,就是这个类没有显式的名字,但是继承父类并实现了所有的抽象方法,或者实现了接口方法
      

  12.   

    1. new 关键字可以理解为在堆内存分配一块存储区域,这块区域长什么样由new关键字后面的东西决定,
    2. 然后这块区域的入口地址赋给连着等号左边的的变量,以后拿这个变量就可以对这块区域进行操作,
    3. 但是能做什么操作,取决于这个变量左边的类型。
      

  13.   

    接口不能实例化,那么new一个接口实际是找他的实现类
      

  14.   


    你确定楼主的代码可以编译?不能编译说什么都是白搭,反正我是怎么改都不能通过编译的。楼主代码确实不能编译通过,基础性错误一大把:
    1、abstract 写成 asbtract
    2、定义抽象类没有写 class 关键字
    3、Person 类里的 abstract void 两个关键字中间没有空格
    4、用全角双引号
    5、System 写成 system,Java 是大小写敏感的语言
    6、System.out.println 语句后面没有加分号结束
    7、new 了之后没有分号结束不过,楼主的问题是,为什么抽象类可以被实例化
      

  15.   


    你确定楼主的代码可以编译?不能编译说什么都是白搭,反正我是怎么改都不能通过编译的。楼主代码确实不能编译通过,基础性错误一大把:
    1、abstract 写成 asbtract
    2、定义抽象类没有写 class 关键字
    3、Person 类里的 abstract void 两个关键字中间没有空格
    4、用全角双引号
    5、System 写成 system,Java 是大小写敏感的语言
    6、System.out.println 语句后面没有加分号结束
    7、new 了之后没有分号结束不过,楼主的问题是,为什么抽象类可以被实例化我本来想说的是语句本来都有问题,楼主是怎么得出 抽象类可以实体化的结果的。
      

  16.   

    我说一说我的想法吧。
    猫是个类。
    class Cat(){
         public void eat(){syso("猫吃鱼")};
    }
    狗是个类。
    class Dog(){
         public void eat(){syso("狗吃肉")};
    }然后我们把猫和狗的eat的共性抽取出来,成一个类Animal,用abstract修饰.
    public abstract class Animal{
              public void eat();
    }
    而使用的话,就是
    class Cat() extends Animal{
         public void eat(){syso("猫吃鱼")};
    }
    还要重写抽象类中的方法。在我们声明一个猫实例的时候,
    可以这样,Cat cat=new Cat();
    也可以这样 ,  Animal animal=new Cat();父类引用指向子类的对象。
    但是你要这样  Animal animal =new Animal();  那么这句话的意思就是:通过动物这个模板产生一个动物的实例,那么,这个动物的实例具体指的是啥?我们说的实例一般都是具体的,比如说,猫,狗,兔子,pig,而动物这个词是从这些类抽象而来,你说,猫是动物,狗是动物,这是可以的。但是要说,动物是动物,这是不符的。这是个  "is a "的哲学问题。抽象类本来就是用来定义一些规则的。抽象类中有抽象方法,你要用它,就要继承它,进而必须实现它内部的抽象方法。 哈哈。纯手打。个人理解。
      

  17.   

    抽象类是不能实例化的,实例化是在栈内存和堆内存中划分一定的空间,而抽象的类或者接口在编译器编译的时候就直接pass了,所以不能实例化,JDK1.8以后的接口可以有static的方法,但是我知道怎么用
      

  18.   

    匿名类重写person的eat方法,涨知识了package test;public abstract class Person {
    public abstract void eat();
    }package test;public class Demo {
    public static void main(String[] args) {
    Person p = new Person(){
    public void eat() {
    System.out.print("hello");
    }
    };
    p.eat();
    }
    }
      

  19.   

    实例化的是一个匿名内部类,是person的一个子类,重写了抽象方法,所以可以创建对象
      

  20.   

    虽然Person是抽象类,但是你在Demo中重写类Person的eat()方法,相当于继承了Person类。
    下面是我测试的代码,楼主有一些语法错误也改回来了哈哈哈。
    Person类:测试主类:
      

  21.   

    你实际看编译后的class。。
      

  22.   

    楼主只是拼错了几个单词,写错了一些大小写,和全角半角双引号,少了一个分号。
    改成下面就可以了,用接口或抽象类new一个匿名类语法上没什么好说的,自己查查资料。abstract class Person {
       public abstract void  eat ();
    }public class Demo {
       public static void main(String[] args){
          Person p = new Person (){
            public  void eat (){
              System.out.println("hello");
            }
          };
          
          p.eat();
     }
    }
    正解,匿名内部类语法问题