Default constructors in Java

前端 未结 7 1718
南旧
南旧 2020-12-09 07:21

I know I\'m asking some serious 101 question here...

I have some class Foo and a class Bar that extends Foo. In Foo

相关标签:
7条回答
  • 2020-12-09 07:41

    The problem is solved with this:

    class Foo{
           Foo(int a, int b){}
    }
    
    class Bar extends Foo{
             //Here must be a constructor OR declare a constructor in Foo without parameters
             Bar(){super(1,1)} //this is an example
    
    }
    

    Other solution is:

    class Foo{
       Foo(int a, int b){}
       Foo(){}
    }
    
    class Bar extends Foo{
    }
    

    Remember that if have a constructor with parameters in the SuperClass (in this case Foo), the implicit constructor on the child class (in this case Bar), always will have a implicit call to "Super()" (always have to be one unless explicit).

    0 讨论(0)
  • 2020-12-09 07:46

    JVM will not provide a default constructor if you have provided one due to design reasons. What you can do define constructor in Bar with same signature and call super().

    public Bar(int x,int y) {
        super(x,y);
    }
    
    0 讨论(0)
  • 2020-12-09 07:48

    No, there's no more "sane" approach. If your base class has no default constructor, then you must explicitly call the correct constructor from all the children classes.

    Note this doesn't mean children classes need to have the exact same constructor than base class. For example this is perfectly valid:

    class Foo {
    
        protected int a;
        protected int b;
    
        protected Foo(final int a, final int b) {
            this.a = a;
            this.b = b;
        }
    }
    
    class Bar extends Foo {
    
        protected Bar() {
            super(0,0);
        }
    }
    
    0 讨论(0)
  • 2020-12-09 07:51

    Use the super constructor:

    public Bar(int a, double b, ...) {
        super(a, b, ...);
    }
    
    0 讨论(0)
  • 2020-12-09 07:58

    This error could also happen because you are calling your super constructor last. You might have to move it to be the first statement:

        public SectionsPagerAdapter(FragmentManager manager, List<Fragment> fragmentList) {
            mFragmentList  = fragmentList;
            super(manager);
    
        }
    
        public SectionsPagerAdapter(FragmentManager manager, List<Fragment> fragmentList) {
            super(manager); --> this should come first
            mFragmentList  = fragmentList;
        }
    
    0 讨论(0)
  • 2020-12-09 07:58

    If parameters are not required and/or have default values then you can define default constructor (without parameters):

    class Foo
    {
        public final int DEFAULT_A = 42;
        protected int a;
        protected int b;
    
        public Foo(final int a, final int b)
        {
            this.a = a;
            this.b = b;
        }
    
        // Is equal to new Foo(Foo.DEFAULT_A, 0);
        public Foo()
        {
            this.a = this.DEFAULT_A;
        }
    
    }
    
    class Bar extends Foo {}
    
    class PiBar extends Bar
    {
        public final int DEFAULT_A = Math.PI;
    
    }
    
    0 讨论(0)
提交回复
热议问题