zoukankan      html  css  js  c++  java
  • 牛客网Java刷题知识点之构造函数是什么、一般函数和构造函数什么区别呢、构造函数的重载、构造函数的内存图解

      不多说,直接上干货!

    构造函数是什么?

      构建创造对象时调用的函数。 

      构造函数是一种特殊的函数,用来在对象实例化时初始化对象的成员变量。

    注意:

      创建对象都必须要通过构造函数初始化。

    构造函数的特点

        1)构造函数必须与类的名字相同,并且不能有返回值(返回值也不能为void)。

      2)每个类可以有多个构造函数。一个类中如果没有定义过构造函数,那么该类中会有一个默认的空参数构造函数。如果在类中定义了指定的构造函数,那么类中的默认构造函数就没有了。

      3)构造函数可以有0个、1个或1个以上的参数。

      4)构造函数总是伴随着new操作一起调用,切不能由程序与的编写者直接调用,必须要由系统调用。构造函数在对象实例化会被自动调用,且只运行一次;而普通的方法是在程序执行到它时被调用,且可以被该对象调用多次。

      5)构造函数的主要作用是完成对象的初始化工作。

      6)构造函数不能被继承,因为构造函数是属于一个类的,每个类都有自己的构造函数,所以构造函数不能被重写,即构造函数不能被继承。如果它想使用父类的构造函数,只能说去调用父类的构造函数,而不能说是去重写父类的构造函数。

       但是,构造函数能够被重载,即使用不同的参数个数或参数类型来定义多个构造函数。

      7)子类可以通过super关键字来显式地调用父类的构造函数。

    构造函数的作用

      可以给对象进行初始化。

     
     

    一般函数和构造函数什么区别呢?

    第一个区别:

      构造函数:对象创建时,就会调用与之对应的构造函数,对对象进行初始化。

      一般函数:对象创建后,需要函数功能时,才调用函数。

      这也就是说创建对象时,构造函数一定被调用,而一般函数不一定被调用。

    第二个区别:

      构造函数:对象创建时,会调用且只调用一次。

      一般函数:对象创建后,可以被调用多次。


    什么时候定义构造函数呢?

      在描述事物时,该事物一存在就具备的一些内容,这些内容都定义在构造函数中。

      构造函数可以有多个,用于对不同的对象进行针对性的初始化。
      多个构造函数在类中是以重载的形式来体现的。


    细节:
      1、构造函数如果完成了set功能。set方法是否需要。
      2、一般函数不能直接调用构造函数。
      3、构造函数如果前面加了void就变成了一般函数。
      4、构造函数中是有return语句的。

    构造函数的重载

      不同的构造函数,来初始化不同的对象

      在描述事物时,该事物已存在就具备一些内容,这些内容都定义在构造函数中

     

    构造函数进栈吗?

      答:必须进栈啊,不然怎么给对象初始化啊。

    构造函数的内存图解(非常重要)

       这里注意,一个是默认初始化,一个是构造函数初始化。

      

    package zhouls.bigdata.DataFeatureSelection;
    
    import java.util.Arrays;
    
    public class ConsDemo{
        public static void main(String[] args) {
            Person p = new Person();
    //        p.speak();
            Person p1 = new Person("旺财");
            p1.setName("旺旺");
    
            p1.speak();
    
            Person p2 = new Person("小强",10);
            p2.speak();
        }
    }
    
     class Person{
        private String name;
        private int age;
    
        //定义一个Person类的构造函数。
        Person(){//构造函数,而且是空参数的。
            name = "baby";
            age = 1;
            System.out.println("person run");
        }
    
        //如果有的孩子一出生就有名字。
        Person(String n){
            name = n;
        }
    
        public void setName(String n){
            name = n;    
        }
    
        Person(String n,int a){
            name = n;
            age = a;        
        }
    
        public void speak(){
            System.out.println(name+":"+age);
        }
    
    }

      对于上面的测试,我们分析它的运行过程:

    1、main方法进栈内存,main方法中有一个Person类类型变量p;

    2、new创建Person对象,在堆内存中创建空间(假如地址为0x0045),该空间中有两个成员变量name和age;

    3、对对象的两个成员变量进行初始化,此时会自动选择调用构造函数Person(String n,int a);

    4、构造函数Person(String n,int a)进栈内存,并且有参数n="小强",a=0;

    5、然后在堆内存中把参数n和a的数值初始化name和age变量,此时对象的初始化完成;

    6、把地址0x0045赋给main方法中的变量p;

    7、构造函数Person()出栈,释放参数n和a;

    8、执行p.speak()语句,调用Person类中的speak()方法,则speak方法进栈;

    9、执行打印语句,跳出speak方法,speak方法出栈;

    10、跳出main方法,main方法出栈,程序运行结束。

      我们在上面通过对一个简单的对象创建过程进行了分析,简单的学习了构造函数在内存中的加载和运行过程,这里也就是突出了对象的初始化,如果类中没有定义构造函数,那么我们在创建对象时会调用默认的构造函数,而当我们定义了构造函数,则会通过参数类型选择不同的构造函数进行对象的初始化,而且我们知道对象都必须被初始化,初始化就会调用相应的构造函数,所以说,构造函数是必须会进栈内存的

  • 相关阅读:
    hdu1915
    2014年9月28日 18:35:01
    洛谷—— P1122 最大子树和
    洛谷——P1103 书本整理
    洛谷—— P2049 魔术棋子
    UVA_1575
    洛谷—— P2424 约数和
    中文乱码问题
    JSP标签
    include指令
  • 原文地址:https://www.cnblogs.com/zlslch/p/7560318.html
Copyright © 2011-2022 走看看