精华内容
下载资源
问答
  • Java 子类调用父类构造函数----super()详解

    万次阅读 多人点赞 2017-07-17 16:51:54
    Java 子类调用父类构造函数----super()详解
    class FatherClass{
    	public FatherClass(){
    		System.out.println("父类 无参 构造函数");
    	}
    	public FatherClass(int i){
    		System.out.println("父类 一个参数构造函数super = "+i);
    	}
    	public FatherClass(int i,String j){
    		System.out.println("父类 一个参数构造函数superi = "+i+",superj = "+j);
    	}
    	
    }
    
    class SonClass extends FatherClass{
    	public SonClass(){
    //		super(22);//line 1
    		System.out.println("子类 无参 构造函数");
    	}
    	public SonClass(int a){
    		super(33,"Hello");//line 2
    		System.out.println("子类一个参数构造函数sub = "+a);
    	}
    	public void fun(int a){//子类中定义一个实例函数
    		//super(33,"Hello");//构造函数调用必须声明在构造函数中,这行代码不注释的话会报错
    		System.out.println("子类一个参数构造函数sub = "+a);
    	}
    }
    public class ConstructorExtend {//测试子类继承父类的构造函数
    	public static void main(String args[]){
    //	FatherClass fa = new FatherClass();
    //	FatherClass fa1 = new FatherClass(100);
    //	SonClass son = new SonClass();
    	SonClass son1 = new SonClass(200);
    	son1.fun(2);
    	}
    }
    

    子类 调用 父类的构造函数:(构造函数不会被继承,只是被子类调用而已)

    1、子类所有的 构造函数 默认调用父类的无参构造函数(其实是默认省略掉了一行代码:super(););省略掉的这行super()代码可以自行添加到构造函数的第一行(必须是第一行,否则报错)

    2、如果父类没有定义构造函数,系统会默认定义一个无参无返回值的构造函数,子类继承时无需(无需的意思是:可以写可以不写)在子类构造函数中显式调用super( );如果父类定义了构造函数,系统不会再默认定义任何 无参无返回值 的构造函数,此时子类的构造函数中必须显式调用super( [arg0][,arg1]…),即,显式调用对应的参数个数、对应参数类型与此super( [arg0][,arg1]… )的父类构造函数。

    3、如果子类的某个构造函数 想 调用父类的其他的带参数的构造函数,在构造函数的第一行人为添加 super(val1,val2[,val3…]),super()括号中的变量数量由想调用的父类的构造函数中的变量数量决定。如代码中的line 2,调用的是父类构造函数中两个参数的构造函数,那么Super(20,“Hello”)就两个变量。

    4、自行添加super(val1,val2,…),就可以指定调用父类的那个参数类型和数量一致的构造函数。之后在此子类构造函数中,系统不会再默认调用父类无参构造函数;

    5、如果子类的每个构造函数都自行添加super([val1,]…),除非人为调用父类无参构造函数,否则的话父类的无参构造函数可以不写。有super指定调用的父类构造函数存在即可

    2017-7-25追加
    6、super指代 父类对象 可以在子类中使用 super.父类方法名();调用父类中的方法(无论是类方法还是实例方法都可以,除此调用实例方法的还可以在方法内部实例化再调用)
    **

    总之:存在继承关系的子类初始化,必须先调用父类构造器,你自己不显式调用,Java就强制默认让你调用父类无惨构造方法;

    **

    我说的语言比较繁琐,为了能说一丝不苟的说明问题,所以会这么啰嗦
    这个参考博客语言简洁:http://blog.csdn.net/youngstar70/article/details/60953578
    参考2:http://www.cnblogs.com/LittleRedPoint/p/3478015.html

    展开全文
  • 3 创建子类对象带有参数时,Java程序在执行子类构造方法之前,如果在子类中没有用super()来调用父类中特定的构造方法(且super()必须写在子类构造函数的第一行),则会先调用父类中没有参数的...

    1 java和C#一样,是单一继承,只能有一个直接父类


    2 创建子类对象不带有参数时,先调用父类构造函数再调用子类构造函数,目的是为了帮助继承自父类的成员做初始化工作


    3 创建子类对象带有参数时,Java程序在执行子类构造方法之前,如果在子类中没有用super()来调用父类中特定的构造方法(且super()必须写在子类构造函数的第一行),则会先调用父类中没有参数的构造方法(所以如果这种情况下父类没有无参的构造方法是错误的),再调用子类带有相同参数的构造方法。如果子类中有super()方法,则同时调用子类有参构造和父类特定构造函数


    4 当父类只有一个无参构造函数时,创建子类对象又带有参数时,当然还是先调用父类构造函数,再掉用子类有参构造函数


    5 super()与this()功能相似,但this()是在同一个类内调用其它构造函数


    6 覆盖要求父类与子类的方法名称、参数个数、类型必须完全相同,才可以通过父类的对象调用子类的方法,如果某一个方法只存在于子类中,当用父类对象去调用时,会出现错误(父类 对象名=new 子类(,))


    展开全文
  • java子类调用父类构造函数

    万次阅读 多人点赞 2019-06-25 15:52:54
    java子类调用父类构造函数详解

    正文

    class FatherClass{
        public FatherClass(){
            System.out.println("父类 无参 构造函数");
        }
        public FatherClass(int i){
            System.out.println("父类 一个参数构造函数super = "+i);
        }
        public FatherClass(int i,String j){
            System.out.println("父类 一个参数构造函数superi = "+i+",superj = "+j);
        }
    
    }
    
    class SonClass extends FatherClass{
        public SonClass(){
    //      super(22);//line 1
            System.out.println("子类 无参 构造函数");
        }
        public SonClass(int a){
            super(33,"Hello");//line 2
            System.out.println("子类一个参数构造函数sub = "+a);
        }
        public void fun(int a){//子类中定义一个实例函数
            //super(33,"Hello");//构造函数调用必须声明在构造函数中,这行代码不注释的话会报错
            System.out.println("子类一个参数构造函数sub = "+a);
        }
    }
    public class ConstructorExtend {//测试子类继承父类的构造函数
        public static void main(String args[]){
    //  FatherClass fa = new FatherClass();
    //  FatherClass fa1 = new FatherClass(100);
    //  SonClass son = new SonClass();
        SonClass son1 = new SonClass(200);
        son1.fun(2);
        }
    }
    

    子类 调用 父类的构造函数:(构造函数不会被继承,只是被子类调用而已)

    1、子类所有的 构造函数 默认调用父类的无参构造函数(其实是默认省略掉了一行代码:super(););省略掉的这行super()代码可以自行添加到构造函数的第一行(必须是第一行,否则报错)

    2、如果父类没有定义构造函数,系统会默认定义一个无参无返回值的构造函数,子类继承时无需(无需的意思是:可以写可以不写)在子类构造函数中显式调用super( );如果父类定义了有参构造函数,此时子类的构造函数中第一行必须显式调用父类定义的某个有参数构造函数。即,显式调用对应的参数个数、对应参数类型与此super( [arg0][,arg1]…. )的父类构造函数。

    3、如果子类的某个构造函数 想 调用父类的其他的带参数的构造函数,在构造函数的第一行人为添加 super(val1,val2[,val3…]),super()括号中的变量数量由想调用的父类的构造函数中的变量数量决定。如代码中的line 2,调用的是父类构造函数中两个参数的构造函数,那么Super(20,”Hello”)就两个变量。

    4、自行添加super(val1,val2,…),就可以指定调用父类的那个参数类型和数量一致的构造函数。之后在此子类构造函数中,系统不会再默认调用父类无参构造函数;

    5、如果子类的每个构造函数都自行添加super([val1,]….),除非人为调用父类无参构造函数,否则的话父类的无参构造函数可以不写。有super指定调用的父类构造函数存在即可

    6、super指代父类对象,可以在子类中使用 super.父类方法名(); 调用父类中的方法(无论是类方法还是实例方法都可以),此外调用实例方法还可以在方法内部实例化再调用


    作者简洁

    作者:小碗汤,一位热爱、认真写作的小伙,目前维护原创公众号:『我的小碗汤』,专注于写golang、docker、kubernetes等知识等提升硬实力的文章,期待你的关注。 转载说明:务必注明来源(注明:来源于公众号:我的小碗汤, 作者:小碗汤)

    展开全文
  • 创建对象时,会先自动调用父类的构造函数,再自动调用子类构造函数。 解释:super()表示父类的构造函数并会调用于参数相对应的父类中的构造函数子类中,它在调用父类中空参数的构造函数。因为子类继承父类,会...

    一、继承中的构造方法的执行顺序

    • 创建对象时,会先自动调用父类的构造函数,再自动调用子类的构造函数。
    • 解释:super()表示父类的构造函数并会调用于参数相对应的父类中的构造函数。子类中,它在调用父类中空参数的构造函数。因为子类继承父类,会继承到父类中的数据,所以必须要看父类是如何对自己的数据进行初始化的。因此子类在进行对象初始化时,先调用父类的构造函数,这就是子类的实例化过程。
    • 总的来说,初始化顺序依次是:(静态变量、静态初始化块)–>(变量、初始化块)–> 构造器;如果有父类,则顺序是:父类static方法 –> 子类static方法 –> 父类构造方法- -> 子类构造方法

    二、子类的所有构造函数中的第一行,其实都有一条 隐身的语句super();

    1、父类有空参:没有有参构造时系统默认给出了,或者有有参构造并且也给出了空参构造

    • 则此时子类自动调用父类 构造函数即可。

    2、若父类没有空参:有有参构造但未给出空参构造

    • 注意:构造方法不是静态的,即此时编译看左边,运行看右边,也就是若父类没有空参构造,而子类在构造函数的第一句又会默认调用父类的空参构造即隐身的super(),则此时编译不能通过。
    • 解决办法:

         1)指定显示调用父类的有参构造super(a,b) ,此时就不会再隐式调用super();

         2)若子类构造函数中用this来指定调用子类自己的有参构造函数this(a,b),那么被调用的构造函数也一样会访问父类中的有参构造函数。

        3)注意:构造函数的第一句,一定是super或者this,只能选择一种。

    补充:

    假设有两个类: 
    Person:父类,成员变量:name,age 
    Student:子类,继承Person,则它的成员变量name,age,假设再新增一个成员变量address

    那么当Student写构造函数时:

    public Student(String name,int age,String address){
        this.name = name;
        this.age = age;
        this.address =address;
    }

    当看到这段代码时,我们可以想到,name和age的赋值跟Person父类构造函数里面的name、age赋值是重复的,有重复代码,所以为了减少重复代码,java采用super关键字调用父类的构造函数来减少重复代码。(子类无法继承父类的构造函数,可以继承成员变量和方法)

    向上转型: 
    1.一个引用能够调用哪些成员(变量和方法),取决于这个引用的类型究竟是怎么定义的。 
    Student s = new Student(); 
    Person p = s; 
    如果Person有一个方法introduce() 
    Student有两个方法study()和重写(override)的introduce() 
    则p只能调用introduce方法不能调用study方法.

    2.一个引用调用的是哪一个方法,取决于这个引用所指向的对象。 
    同上例子,则p调用introduce方法,会调用Student的introduce。

    3.总结: Person p = new Student(); 
    p能够调用哪些成员看左边的类型——p实际调用的哪个方法看右边的实际对象。

    向下转型 
    前提:必须先把一个对象向上转型才能进行向下转型给转回来,如: 
    Person p = new Student(); 
    Student s = (Student)p; 
    上述转型是正确的 
    而: 
    Person p = new Person(); 
    Student s = (Student)p; 

    这种做法是错误的。(理解:比如一个学生,你说他是人这是没问题的,但是如果一个人你说他是学生那就不一定了,所以上述那种转型做法是不正确的)

    展开全文
  • java中,当子类调用构造函数时,父类构造函数都会依次调用,也就是说,构造子类的同时,也要构造出父类部分:
 
 其中的x,y是Hippo的实例变量,k, s, v是Animal的实例变量,a, b, c是Object的...
  • java子类调用父类的构造函数-----super(),自我理解。 1.子类不能继承父类的构造函数,但是可以调用父类的构造函数 2.如果父类没有定义构造函数,系统会默认定义一个无参无返回值的构造函数,子类继承时无需在子类...
  • java子类调用父类的构造函数-----super()详解 1.子类不能继承父类的构造函数,但是可以调用父类的构造函数 2.如果父类没有定义构造函数,系统会默认定义一个无参无返回值的构造函数,子类继承时无需在子类构造函数...
  • 问题:若B类继承了A类,在B类的构造函数里是否需要调用A类的构造函数? 答案: 如果A类定义了构造函数(不管是不是含参),在B类的构造函数里都要显式的调用super.() 如果A类,没有定义构造函数,则无所谓(因为...
  • 子类继承父类中,子类会在构造函数调用父类的构造函数: 1. 如果没有显式定义,系统会自动添加super()来调用父类构造函数。 - super()调用的是父类的无参构造函数。 - 如果父类 没有无参构造函数,则...
  • 在Dog类的构造方法中调用父类的构造方法,可是有什么用呢?在父类中name是private的,super("小狗");这一句话只是把Animal类中的private String name;初始化成了private String name=“小狗”; 还是我的理解错了?
  • 调用顺序为先调用父类无参构造函数,然后调用子类无参构造函数。  java中的子类初始化时初值不为空。调用顺序为先调用父类无参构造函数,然后调用子类有参构造函数。 2..前提:父类和子类无无参构造函数只有有参...
  • 1.1同一个类中构造函数调用构造函数 尽量不要这样做,因为结果不确定!避免麻烦 可以把共用的代码封装成一个私有的成员函数,然后在构造函数内统一调用。 1.2子类构造函数调用基类构造函数 —–基类有默认构造函数...
  • Java子类调用父类函数实验

    千次阅读 2013-10-17 22:06:36
    类A、B、C都定义了一个同名函数叫func( ) 现在需要使用 C c = new C(); c. 的方式来调用A的func()或者B的func(),请问有方式实现吗? 想法: 1、通过super.super调用 试验后发现行不通,super并不能递归调用...
  • (2)如果父类显式的添加无参构造函数,则子类可以创建自己的有参或无参构造函数,如果子类没有显示调用父类的有参构造函数,则java自动调用父类的无参构造函数。 (3)如果父类没有显式的添加无参构造函...
  • java子类调用父类的构造函数

    千次阅读 2018-03-18 11:17:57
    一、继承中的构造方法的执行顺序创建对象时,会先自动调用父类的构造函数,再自动调用子类构造函数。解释:super()表示父类的构造函数并会调用于参数相对应的父类中的构造函数子类中,它在调用父类中空参数的...
  • 测试代码如下: 父类: public class ParentTest { public ParentTest(){ System.out.println(1); } public ParentTest(String name){ System.out.println(2...子类: public class ChildTest extends Par
  • 1 在子类对象实例化之前,必须先调用分类的构造方法,之后调用子类构造方法  2
  • 主要解析复习类的构造函数: 首先明确一点:在一个类中没有任何构造函数时,编译器会自动给该类创建一个不带...此时在子类中的构造函数不管是有参还是无参不管是自己创建还是编译器创建,子类都都会调用父类中的一...
  • 继承中调用子类构造函数主动调用父类无参构造函数。并且在这个过程中,只要父类中有与子类同名的实例方法,就调用子类的,而不是调用父类的。因为当访问者是子类对象时,只要存在覆盖,就要调用子类的实例方法。
  • Java子类调用父类构造方法

    万次阅读 多人点赞 2017-09-29 14:49:15
    Java中,子类的构造过程中,必须调用其父类的构造函数,是因为有继承关系存在时,子类要把父类的内容继承下来,通过什么手段做到的?   答案如下:   当你new一个子类对象的时候,必须首先要new一个父类...
  • (JAVA基础)JAVA子类构造函数的方法

    千次阅读 2018-07-05 15:38:54
    实际问题中,JAVA子类构造函数有时会出现无法编译通过的情况,如: class Fu{ public int age; Fu(int age) { this.age = age; } } class Zi extends Fu{ public int age; Zi(int age) { this.age = ...
  • 关于父类与子类构造函数调用顺序
  • 子类默认在构造函数中用super()调用父类构造函数 1.子类继承父类的方法属性,并重写父类的方法,子类修饰符不能比父类方法的修饰符的范围狭窄。 2.子类必须在构造函数中使用super()来调用父类的构造函数 ...
  • 通常java构造函数被设置为public的(若你不写构造函数java自动添加的无参空构造函数就是public的),因本文中的类都在同一个包中,因此使用无修饰的友好权限说明问题,对于private构造函数的意
  • Java构造函数调用父类构造函数

    万次阅读 2016-09-21 09:54:39
    如果父类提供了无参数的构造函数,此时子类构造函数就可以不显式的调用父类的构造函数,默认调用父类的无参构造函数。 package com.bjut.StudyTest; class Person { public Person() { Syste
  • java 子类和父类构造函数关系

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 184,279
精华内容 73,711
关键字:

java子类调用构造函数

java 订阅