抽象类本身就不能直接构造 如果说为了防止非继承关系的外包对象访问 也没必要 因为是构造方法能直接访问吗?

解决方案 »

  1.   

    为了兼容多种日历,所以Calendar使用了工厂方法。
      

  2.   

    经常用,但没考虑过这个问题,都是Calendar c = Calendar.getInstance();这样取的!
      

  3.   

    怎么兼容法 public就不能兼容了吗
      

  4.   

    Calendar c = Calendar.getInstance();不是这样实例化的吗?你想一下就知道了啊
    因为他的实例化是单态模式,所以他的构造方法肯定需要有一些限制,比如限制为private--这样他的子类或者其他的类就都不能直接new而获得该对象,如果设置成protected的话只有他的子类可以new,但是其余的类就不能了啊,你可以试着写一个Calendar的子类,然后你在使用new,我相信是完全可以的了
      

  5.   

    import java.util.Calendar;
    public class Cal extends Calendar{ @Override
    public void add(int field, int amount) {
    // TODO Auto-generated method stub

    } @Override
    protected void computeFields() {
    // TODO Auto-generated method stub

    } @Override
    protected void computeTime() {
    // TODO Auto-generated method stub

    } @Override
    public int getGreatestMinimum(int field) {
    // TODO Auto-generated method stub
    return 0;
    } @Override
    public int getLeastMaximum(int field) {
    // TODO Auto-generated method stub
    return 0;
    } @Override
    public int getMaximum(int field) {
    // TODO Auto-generated method stub
    return 0;
    } @Override
    public int getMinimum(int field) {
    // TODO Auto-generated method stub
    return 0;
    } @Override
    public void roll(int field, boolean up) {
    // TODO Auto-generated method stub

    }

    public static void main(String args[]){
    Cal cal = new Cal();
    long time=cal.time;
    System.out.println(time);
    }}
      

  6.   

    getInstance获取实例我是知道的老实说 Calendar也不是单态模式了关于能不能new 只要是抽象类的构造方法 不管access modifier是什么(public private protected或default) 都是不能直接new的这个问题也不是很简单的哦
      

  7.   

    无关单例
    如果你有JDK的话,可以查看一下getInstance的源代码
    第一,getInstance通过不同的时区来初始化一个日历
    第二,进一步的,它会根据不同的你的系统时区、国家来初始化不同的日历实例
    你可以看看这个部分private static Calendar createCalendar(TimeZone zone,
       Locale aLocale)
        {
    // If the specified locale is a Thai locale, returns a BuddhistCalendar
    // instance.
    if ("th".equals(aLocale.getLanguage())
        && ("TH".equals(aLocale.getCountry()))) {
        return new sun.util.BuddhistCalendar(zone, aLocale);
    } // else create the default calendar
            return new GregorianCalendar(zone, aLocale);
        }
    这是个工厂模式的典型应用,如果你一定要用NEW来初始化这个抽象的实例,你又怎么做到自动的分配出不同的实例对象
      

  8.   

    谢谢回答 但是和构造方法是protected又有什么关系呢?
      

  9.   

    protected声明的构造方法,不能通过new关键字来实例化对象啊
    这样就能保证对象的初始化实例,由getInstance()方法来负责
      

  10.   

    我在7楼提到过的 这个能不能new 不关protected的事 public照样不能new
    抱歉回复晚了
      

  11.   

    看不懂了
    public的构造函数才能被new所实例化你用private或者protected写的构造函数能用new来实例化??
      

  12.   

    private或者protected固然不能实例化 但public也不能
    因为是抽象类 它的构造方法就不能直接new 还请详查