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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

public class CalendarDemo {
        public static void main(String[] args) {
                // 获取对象

                Calendar rightNow = Calendar.getInstance(); // 一个静态方法,返回的是子类对象

                // 获取年,月,日
                int year = rightNow.get(Calendar.YEAR);
                int month = rightNow.get(Calendar.MONTH);
                int date = rightNow.get(Calendar.DATE);
                String s = year + "年" + (month + 1) + "月" + date + "日";
                System.out.println(s);
        }
}
//Calendar rightNow = Calendar.getInstance();  这段代码实现的原理是什么?Calendar是抽象类 想实例化不是需要去实现它的子类用多态么?而它的子类GregorianCalendar中并没有重写这个getInstance()方法。这是如何实现的呢?

10 个回复

倒序浏览
getInstance()方法中返回的是createCalendar()方法,在这个createCalendar()方法中通过多态new了Calendar的子类,创建了对象。

QQ截图20140922002500.png (25.62 KB, 下载次数: 69)

getInstance方法

getInstance方法

QQ截图20140922002614.png (116.08 KB, 下载次数: 82)

createCalendar方法

createCalendar方法
回复 使用道具 举报 1 0
有点蒙了,抽象类虽说不能创建对象,但是不是可以通过调用返回本类对象的静态方法实现创建对象吗?
public static Calendar getInstance()返回的不就是一个 Calendar?
回复 使用道具 举报
eternallove 发表于 2014-9-22 00:28
getInstance()方法中返回的是createCalendar()方法,在这个createCalendar()方法中通过多态new了Calendar的 ...

感谢感谢 么么哒
回复 使用道具 举报
小漠 发表于 2014-9-22 00:50
有点蒙了,抽象类虽说不能创建对象,但是不是可以通过调用返回本类对象的静态方法实现创建对象吗?
public  ...

我记得老师是有这么说话 但当时没听太明白 回来也没找到以前对应的这些资料 你回答的是对的
回复 使用道具 举报

:#:#:#:#:#:#:#:#:#:#:#:#:#
回复 使用道具 举报
回复 使用道具 举报
OK  我们也知道了Calendar是一个抽象类了.
想拿到抽象类的对象是有两种方法的,其实归根结底也还是一种.

方法一:
直接去找该抽象类的已实现的子类对象.
比如说现在我们所提到的 public abstract class Calendar
它就有已实现的子类GregorianCalendar,我们也是可以直接
Calendar rili = new GregorianCalendar();
这样我们就拿到了Calendar的对象.

方法二:
看该抽象类中是否有返回该方法实例的静态方法.
我们知道,不管这个类是否是抽象的,该类中的静态成员都是可以以  "类.成员"进行调用.(不用实例化该类的对象.)
而这正式另一种获取该类对象的方法,也就是该类中提供了静态方法,而且该方法的返回值就是这个类的对象.(当然,这种方法并不是所有的类中都有提供)
我们来看一下Calendar中所提供的静态方法中就有一个返回值为 static Calendar的静态方法"getInstance()".
所以说,我们想拿到Calendar的对象可以直接
Calendar rili  = Calendar.getInstance();
回复 使用道具 举报
eternallove 发表于 2014-9-22 00:28
getInstance()方法中返回的是createCalendar()方法,在这个createCalendar()方法中通过多态new了Calendar的 ...

你好, 我想问下,我们在使用Calendar的时候导入了,java.util.Calendar;这个类  但是没有导入java.util.GregorianCalendar;这个类, 但是我们可以创建它的对象。这时为什么呢,还是说,我们导入java.util.Calendar;  这个下面就包括了java.util.GregorianCalendar;
回复 使用道具 举报
Mydream524 发表于 2015-1-1 11:29
你好, 我想问下,我们在使用Calendar的时候导入了,java.util.Calendar;这个类  但是没有导入java.util. ...

就是的,Calendar类和CregorianCalendar是同包类,在Calendar中不用导包
回复 使用道具 举报
学习了!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马