黑马程序员技术交流社区

标题: Calendar rightNow = Calendar.getInstance();实例化问题 [打印本页]

作者: -天然呆ノ    时间: 2014-9-22 00:06
标题: Calendar rightNow = Calendar.getInstance();实例化问题
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()方法。这是如何实现的呢?


作者: eternallove    时间: 2014-9-22 00:28
getInstance()方法中返回的是createCalendar()方法,在这个createCalendar()方法中通过多态new了Calendar的子类,创建了对象。

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

getInstance方法

getInstance方法

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

createCalendar方法

createCalendar方法

作者: 小漠    时间: 2014-9-22 00:50
有点蒙了,抽象类虽说不能创建对象,但是不是可以通过调用返回本类对象的静态方法实现创建对象吗?
public static Calendar getInstance()返回的不就是一个 Calendar?
作者: -天然呆ノ    时间: 2014-9-22 00:58
eternallove 发表于 2014-9-22 00:28
getInstance()方法中返回的是createCalendar()方法,在这个createCalendar()方法中通过多态new了Calendar的 ...

感谢感谢 么么哒
作者: -天然呆ノ    时间: 2014-9-22 01:00
小漠 发表于 2014-9-22 00:50
有点蒙了,抽象类虽说不能创建对象,但是不是可以通过调用返回本类对象的静态方法实现创建对象吗?
public  ...

我记得老师是有这么说话 但当时没听太明白 回来也没找到以前对应的这些资料 你回答的是对的
作者: eternallove    时间: 2014-9-22 13:07
-天然呆ノ 发表于 2014-9-22 00:58
感谢感谢 么么哒

:#:#:#:#:#:#:#:#:#:#:#:#:#
作者: -天然呆ノ    时间: 2014-9-28 22:30
eternallove 发表于 2014-9-22 13:07

:o:o:o:o:o:o
作者: ζ_____________    时间: 2014-9-28 23:14
OK  我们也知道了Calendar是一个抽象类了.
想拿到抽象类的对象是有两种方法的,其实归根结底也还是一种.

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

方法二:
看该抽象类中是否有返回该方法实例的静态方法.
我们知道,不管这个类是否是抽象的,该类中的静态成员都是可以以  "类.成员"进行调用.(不用实例化该类的对象.)
而这正式另一种获取该类对象的方法,也就是该类中提供了静态方法,而且该方法的返回值就是这个类的对象.(当然,这种方法并不是所有的类中都有提供)
我们来看一下Calendar中所提供的静态方法中就有一个返回值为 static Calendar的静态方法"getInstance()".
所以说,我们想拿到Calendar的对象可以直接
Calendar rili  = Calendar.getInstance();

作者: Mydream524    时间: 2015-1-1 11:29
eternallove 发表于 2014-9-22 00:28
getInstance()方法中返回的是createCalendar()方法,在这个createCalendar()方法中通过多态new了Calendar的 ...

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

就是的,Calendar类和CregorianCalendar是同包类,在Calendar中不用导包
作者: alangong    时间: 2015-12-24 23:16
学习了!




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