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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© wangxinyu 初级黑马   /  2012-6-13 02:55  /  4287 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

抽象类不能被实例化,怎么我看见很多抽象类都可以使用getInstance()方法实例化呢?

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

7 个回复

倒序浏览
不能实例化的意思是说外部不能直接通过new创建对象,但是通过其本身提供的静态getInstance()来创建建对象。
回复 使用道具 举报
你说的是 class.newInstance() 这个方法吧?
任何抽象接口 或者类是不能实例化的,但是 他可以指向实现了该接口的对象 然后再来
就是父类引用指向子类对象,

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
当多个类中出现相同功能,但是功能主体不同,这时也可以进行向上抽取,只抽取功能定义。
而不能抽取功能主体。
Abstract:关键字
抽象类:
1.  抽象方法一定定义在抽象类中。
2.  抽象方法和抽象都必须被abstract关键字修饰
3.  抽象类不可以用new创建对象,因为调用抽象方法没意义
4.  抽象类中的方法要被使用必须由子类复写其所有的抽象方法,建立子类对象。如果子类值覆盖了部分抽象方法,那么该子类还是一个抽象类。

抽象类与一般类:
都是描述事物,只不过该事物中出现了看不懂的东西,这个不确定的部分,也是该事物的功能,需要明确出现,但无法定义主体,通过抽象方法来实现。
抽象类比一般类多个抽象函数,就是在类中可以定义抽象方法。
抽象类不能实例化。
回复 使用道具 举报
抽象类是不能实例化,因为抽象类不能new新对象,但是抽象类或者接口可以通过继承或者实现的方式由子类去实例化
回复 使用道具 举报
不能实例化可以简单理解为不能用new,但是可以用getInstance()来实现new的功能,即创建对象。同时,使用getInstance()有诸多好处:
1。 new 一定要生成一个新对象,分配内存;getInstance()则不一定要再次创建,它可以把一个已存在的引用给你使用,这在效能上优于new;

2。new创建后只能当次使用,而getInstance()可以跨栈区域使用,或者远程跨区域使用。所以getInstance()通常是创建static静态实例方法的。

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
首先,抽象类一定是不能实例化的。通过getInstance获得的实例对象是该抽象类的可实例化的子类的对象。看个实例:
Calendar中的getInstance ( )     Calendar Cal =  Calendar.getInstance();  
Calendar是抽象类不能直接通过new对象,但是提供的静态getInstance()就是给Calendar创建对象。
从Calendar.getInstance() 中所获得的实例其实就是一个 "GreogrianCalendar" 对象

GreogrianCalendar就是Calendar的子类,他实现了Calendar里面的抽象方法。

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
超类中声明一个给定结构的抽象内容,但不提供每个方法的完整实现,即不能为方法创建一个有意义的实现。超类仅定义了子类所共享向子通用形式,而让每个子类去填写细节内容。所以子类必须实现方法。抽象类不能通过new运算符直接实例化,抽象类不题全定义,这样建立的对象无用.实例化抽象类的对象可以使用工厂方法(factory method),工厂方法仅仅是一种约定,表示类中的静态方法返回类的个实例。getInstance ()方法是工厂方法。因此可实例化抽象类的对象。另外可以创建子类对象实现超类实例化。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马