黑马程序员技术交流社区

标题: 抽象类可以new 对象吗? [打印本页]

作者: 张业婷    时间: 2014-10-2 23:06
标题: 抽象类可以new 对象吗?
本帖最后由 张业婷 于 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这个抽象类怎么可以创建对象呢有点不解?


作者: 杨佳名    时间: 2014-10-2 23:20
本帖最后由 杨佳名 于 2014-10-2 23:40 编辑

答错了。
作者: 罗林军    时间: 2014-10-2 23:35
楼主,抽象类是不可以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:51
罗林军 发表于 2014-10-2 23:35
楼主,抽象类是不可以new对象的,楼主的代码中实际上并不是抽象类在new对象,public class TestPerson{

   ...

假如Person类不是抽象类!
new Person(){}这又代表什么?
作者: 罗林军    时间: 2014-10-3 00:03
还是代表的是Person类的匿名子类对象,一般我们new对象的时候都是new+构造方法,如果构造方法后面还跟有大括号的内容的话,就是匿名子类对象了,{}里面的内容就是匿名子类的特有方法
作者: 罗林军    时间: 2014-10-3 00:04
张业婷 发表于 2014-10-2 23:51
假如Person类不是抽象类!
new Person(){}这又代表什么?

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

那么花括号中是否可以定义方法 //我感觉既然是子类就可以定义自己的方法
{
      public void test(){
           return 5;
      }
}
但是调用的是后出错了!你试试
作者: 罗林军    时间: 2014-10-3 00:17
张业婷 发表于 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
{
}

多态的情况下如何调用子类的特有方法,当父类引用指向该子类对象的情况下,可以将其向下转型为子类引用,即强制类型转换,但需注意转换时必须是该父类引用指向相应子类对象的情况下方可,但是匿名子类对象因为匿名,所以只能使用一次,因此不能进行强制类型转换,只能在匿名对象建立那里进行特有方法的调用。




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