zoukankan      html  css  js  c++  java
  • java学习面向对象构造函数

    在java当中目前我们学到的一个比较特殊的函数就是main函数,他是JVM执行的入口,所以书写的格式是固定的,现在我们来介绍java中另一个比较特殊的函数:

    构造函数:构造对象的时候调用的函数,作用,给对象进行初始化。

           创建对象的时候必须用构造函数进行初始化,但不显示的声明构造函数的时候,默认会有一个空参数的构造函数:

          

    Person()
    {
    
    }
    

        如果显式声明一个构造函数的时候,类就调用这个构造函数。同时,那个原来默认的构造函数也会被取消,函数的相同不相同就跟类名还有参数的个数和顺序决定的。

      特点:

        1、构造函数名与类名相同

        2、不用定义返回值类型

        3、没有具体的返回值

      一般函数和构造函数的区别:

        1、对象创建时就会调用与之对应的构造函数,进行初始化。一般函数是对象创建后,需要该函数功能时,才调用。

        2、对象创建时只被调用一次,一般函数,对象创建后,可以被调用多次。

    class Person
    {
    
    
    	private String name;
    	private int age;
    	//构造函数与类名相同,构造函数不用定义返回类型,void也不用定义;构造函数没有具体的返回类型
    	Person()
    	{
    		System.out.print("初始化函数");
    	}
    
    	public void setAge(int n)
    	{
    		
    		if(n>0&&n<100)
    			 age = n;
    		else
    			System.out.print("非法的年龄数值,请检查您的输入是否有误");
    
    	}
    
    	public int getAge()
    	{
    
    		return age;
    
    	}
    
    	void speak()
    	{
    
    		System.out.print(name+"....."+age);
    
    	}
    	
    }
    
    class PersonDemo
    {
    
    	public static void main(String[] args) {
    		Person p = new Person();
    	
    }
    

    构造函数的重载:

    什么时候用构造函数:

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

      为了能够在初始化的时候,选择初始化各个对象,这里需要函数重载:

      构造函数可以有多个,用于对不同的对象进行针对性的初始化。

      构造函数在类当中是以函数的重载体现的。

      

    class Person
    {
    
    
    	private String name;
    	private int age;
    	//构造函数与类名相同,构造函数不用定义返回类型,void也不用定义;构造函数没有具体的返回类型
    	Person()
    	{
    		System.out.print("初始化函数");
    	}
    
    	//函数重载
    	Person(String na)
    	{
    
    		name  = na;
    
    	}
    
    	public void setAge(int n)
    	{
    		
    		if(n>0&&n<100)
    			 age = n;
    		else
    			System.out.print("非法的年龄数值,请检查您的输入是否有误");
    
    	}
    
    	public int getAge()
    	{
    
    		return age;
    
    	}
    
    	void speak()
    	{
    
    		System.out.print(name+"....."+age);
    
    	}
    	
    }
    class PersonDemo
    {
    
    	public static void main(String[] args) {
    		Person p = new Person();
                    Person p2 = new Person("小强");//初始化时传入的参数,是给对应的构造函数使用的。
    	
    }
    

      

    构造函数初始化内存图解:

    初始化时的文字描述:在这个对象初始化的时候,main函数先进栈,之后需要Person对象是,告诉堆在堆当中创建一个Person对象,待堆中创建完Person之后,会采用默认的值对他进行初始化,初始化完成之后,在返回引用地址之前,会先检查,是否有构造函数,如果有构造函数的话。此时调用构造函数,构造函数进栈,然后按照参数的个数和类型对指定的构造函数进行初始化,待构造函数调用返回,出栈之后这个时候,堆才会把引用地址传递给栈中的Person型变量p。

    这里需要明确的一点就是,在栈当中调用函数,如果他的名称和堆当中的变量的名称同名的话,会优先调用栈当中的变量。

    构造函数使用注意:

    1、如果我们把代码当中的person构造函数改为:

    void Person()
    {
               
    }
    

     此时如果我们再调用Person()这个方法的时候,就会报错,提示找不到符号,我们可能回想。默认初始化的时候,不是默认调用了空的构造函数么,这里怎么可能还会报错?原因是这个样子滴.....因为我们下面定义了一个构造函数的重载,只要有一个构造函数在的话,原来的默认构造函数,就不会再出现了。

    class Person
    {
    
    	int age;
    	String name;
    
    	void Person()
    	{
    
    		System.out.print("Hello Person");
    
    	}
    
    	Person(int ag)
    	{
    
    		age = ag;
    
    	}
    	
    }
    
    class PersonDemo
    {
    		
    	public static void main(String[] args) {
    		Person p = new Person();
    		System.out.print("cccc");
    	}
    
    }
    

      所以这个样子写,是错误的。

    如果我们给构造函数写上return会怎样呢?

    	Person()
    	{
    
    		System.out.print("Hello Person");
    		return ;//加上return,并不会报错。但是这里的return仅表示,函数结束。由于他没有类型,此时也不可能返回值。在java当中值都是有类型的,没有类型的是不允许出现的。
    
    	}
    

      

    一般很少用return。

  • 相关阅读:
    as3 的相关资源
    linux 进程用户栈和内核栈
    Chapter 11 进程与信号 @ linux
    linux/unix下setuid/seteuid/setreuid/setresuid
    poj 3259 spfa 虫洞问题判到点1时候有环
    My Vimrc Archive
    C/C++函数调用的几种方式
    Git常用命令解说 [robby certification]
    Linux Chapter 11 进程与信号
    XNA游戏开发之(四)——改变Draw频率
  • 原文地址:https://www.cnblogs.com/sunchuanzhen/p/3330031.html
Copyright © 2011-2022 走看看