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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张业婷 中级黑马   /  2014-10-2 23:06  /  6264 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张业婷 于 2014-10-3 00:13 编辑

抽象类不是不可以new对象的吗?
public  abstract class Person{      private String name;
      public Person(String name){
            this.name=name;
     }
      public abstarct int age();
}



public class TestPerson{

          public static void main(String[] args) {
                Person man=new Person("zhangsan"){
                        public int age() {
                                return 12;
                        }
                };
        }

}
Person这个抽象类怎么可以创建对象呢有点不解?

7 个回复

倒序浏览
本帖最后由 杨佳名 于 2014-10-2 23:40 编辑

答错了。
回复 使用道具 举报
楼主,抽象类是不可以new对象的,楼主的代码中实际上并不是抽象类在new对象,public class TestPerson{

          public static void main(String[] args) {
                Person man=new Person("zhangsan"){
                        public int age() {
                                return 12;
                        }
                };
        }

}
这里面的new Person(){}其实是一个Person类的匿名子类对象,它明显的复写了Person类中的抽象方法age()
回复 使用道具 举报
罗林军 发表于 2014-10-2 23:35
楼主,抽象类是不可以new对象的,楼主的代码中实际上并不是抽象类在new对象,public class TestPerson{

   ...

假如Person类不是抽象类!
new Person(){}这又代表什么?
回复 使用道具 举报
还是代表的是Person类的匿名子类对象,一般我们new对象的时候都是new+构造方法,如果构造方法后面还跟有大括号的内容的话,就是匿名子类对象了,{}里面的内容就是匿名子类的特有方法
回复 使用道具 举报
张业婷 发表于 2014-10-2 23:51
假如Person类不是抽象类!
new Person(){}这又代表什么?

还是代表的是Person类的匿名子类对象,一般我们new对象的时候都是new+构造方法,如果构造方法后面还跟有大括号的内容的话,就是匿名子类对象了,{}里面的内容就是匿名子类的特有方法
回复 使用道具 举报
罗林军 发表于 2014-10-3 00:04
还是代表的是Person类的匿名子类对象,一般我们new对象的时候都是new+构造方法,如果构造方法后面还跟有 ...

那么花括号中是否可以定义方法 //我感觉既然是子类就可以定义自己的方法
{
      public void test(){
           return 5;
      }
}
但是调用的是后出错了!你试试
回复 使用道具 举报
张业婷 发表于 2014-10-3 00:10
那么花括号中是否可以定义方法 //我感觉既然是子类就可以定义自己的方法
{
      public void test(){


Person man = new Person(){}这样的形式是父类引用指向子类对象,这是多态的一种体现形式,这个时候man不能调用子类的特有方法的。还有test()方法的返回值要是Int才能返回,楼主的代码应该改为:
class  H
{
        public static void main(String[] args)
        {
                int x=  new Person(){
                public int test(){
                          return 12;
                }
                }.test();
                //int x=man.test();
                System.out.println(x);
        }
}

class Person
{
}

多态的情况下如何调用子类的特有方法,当父类引用指向该子类对象的情况下,可以将其向下转型为子类引用,即强制类型转换,但需注意转换时必须是该父类引用指向相应子类对象的情况下方可,但是匿名子类对象因为匿名,所以只能使用一次,因此不能进行强制类型转换,只能在匿名对象建立那里进行特有方法的调用。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马