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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© qixing0918 中级黑马   /  2013-10-26 17:45  /  2752 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 qixing0918 于 2013-10-26 17:50 编辑

public abstract class Calendar     
Calendar rightNow = Calendar.getInstance();
1.这是怎么回事 不是抽象类么 为什么还能获得实例
2.子类继承父类 需要先实例化父类 再实例化子类 但如果父类是抽象类 那该怎么处理
3.子类继承父类 继承父类的所有 怎么实现的 是保存一个父类的引用么 (那么父类是抽象类又怎么办)         

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

7 个回复

倒序浏览
Calendar.getInstance是根据不同的local返回了Calendar的一个实现,抽象类是不能实例化的
Calendar中的getInstance ( )     Calendar Cal =  Calendar.getInstance();  
Calendar是抽象类不能直接通过new对象,但是提供的静态getInstance()就是给Calendar创建对象。
从Calendar.getInstance() 中所获得的实例其实就是一个 "GreogrianCalendar" 对象

GreogrianCalendar就是Calendar的子类,他实现了Calendar里面的抽象方法。过父类的引用来指向子类的实例来间接地实现父类的实例化。同时,使用getInstance()有诸多好处:
1. new 一定要生成一个新对象,分配内存;getInstance()则不一定要再次创建,它可以把一个已存在的引用给你使用,这在效能上优于new;

2.new创建后只能当次使用,而getInstance()可以跨栈区域使用,或者远程跨区域使用。所以getInstance()通常是创建static静态实例方法的。
希望对你有帮助,加油!

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

回复 使用道具 举报
第一个我看源码明白了 是父类引用子类对象  2和3呢 你们知道不
回复 使用道具 举报
1.这是怎么回事 不是抽象类么 为什么还能获得实例
2.子类继承父类 需要先实例化父类 再实例化子类 但如果父类是抽象类 那该怎么处理
3.子类继承父类 继承父类的所有 怎么实现的 是保存一个父类的引用么 (那么父类是抽象类又怎么办)


1.抽象类不能实例化的意思是不能通过new得到本类对象,但是通过Calendar.getInstance()方法返回一个本类类型的对象。
2.如果父类是抽象类,子类必须复写父类中的全部抽象方法,子类才能实例化。
3.子类只能继承父类的非私有属性(一般情况,暴力反射除外),子类构造函数第一行加载了父类,程序默认的super
回复 使用道具 举报
关于类的继承的知识点
  (a)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法
  (b)子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量不能被继承
  (c)子类中定义的成员方法,并且这个成员方法的名字,返回类型,及参数个数和类型与父类的某个成员方法完全相同,则父类的成员方法不能被继承。

关于super
子父类中的构造函数,在对子类对象进行初始化时,父类的构造函数也会运行,因为子类的构造函数第一行默认了一条隐式的super(),隐式super()会访问父类中空参数的构造函数,而子类中所有的构造函数第一行都默认super
  为什么子类的构造函数要访问父类的构造函数:因为父类中的数据子类可以直接获取,所以子类在建立时,需要先查看父类是怎样对这些数据进行初始化的,所以子类在初始化时会要先访问父类中的构造函数。如果要访问指定的构造函数,可以手动super(参数)访问。
  注意super一般定义在构造函数的第一行,
  结论:子类中所有的构造函数默认都会访问父类中的空参数构造函数,当父类没有空参数构造函数时,需要手动配置super()。

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

回复 使用道具 举报
2.子类继承父类 需要先实例化父类 再实例化子类 但如果父类是抽象类 那该怎么处理
每个子类的构造函数中都隐式的有一条super(),语句,用来调用父类中空参数的构造函数,实际抽象类是一种特殊的类,它也有普通的方法也有自己的构造方法,当我们实例化子类对象是,super语句就起作用了,它先初始化父类中的成员变量,因为子类可以直接调用父类中的成员,所以要先实例化它的成员变量
3.子类继承父类 继承父类的所有 怎么实现的 是保存一个父类的引用么 (那么父类是抽象类又怎么办)
每个类中都隐式的存在一个this语句,抽象类也不例外,但是它的this语句代表的是它的派生子类,同时它的派生子类也拥有了父类中的this操作
public abstract class AbstractTest {
public AbstractTest ()
{
System.out.println(this.getClass().getName());//这里输出的是它子类的名字,也就相当于多态概念,父类的引用指向子类对象,只不过这里的this代表的是抽象类的派生子类
}

}

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

回复 使用道具 举报
2. 调用了 抽象类的构造方法 是不是就生成了抽象类的一个实例  
调用类的构造方法和 new 生成实例 有什么区别
回复 使用道具 举报
多态,拿到的是calendar的子类
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马