首页 > 学院 > 开发设计 > 正文

[java学习笔记]java语言核心----面向对象之构造函数

2019-11-14 15:30:07
字体:
来源:转载
供稿:网友

1.构造函数概念

  • 特点:
  1. 函数名与类名相同
  2. 不用定义返回值类型
  3. 没有具体的返回值
  • 作用:

               给对象进行初始化

  • 注意:
  1. 默认构造函数
  2. 多个构造函数是以重载出现的
  3. 一个类中如果没有定义过构造函数,那么该类中会有一个默认的空参数的构造函数
  4. 如果在类中定义了构造函数,那么类中的默认构造函数就没有了
  5. 构造函数在创建对象时调用
  6. 构造函数也有默认的return语句(省略不写)
  7. 函数执行到return语句后,栈中该函数的方法区就会出栈

如:

class Person{    PRivate int age;    Person(){        age = 10;    }}
  • 一般函数和构造函数的区别

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

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

一般函数不能调用构造函数,构造函数可以调用一般函数

class Person{    void Person(){    }}

此方法为一般方法

2.构造函数的重载

class Person{    private String name;    private int age;    Person(){        age = 1;        name = "xiaoming";    }    Person(int a, String n){        age = a;        name = n;    }
    public void speak(){
        System.out.println(name+”:”+age);
    }}

 

在newPerson对象时,可以根据不同的构造函数,选择不同的创建方式。

Person p1 = new Person();//使用Person类的无参构造函数来创建对象Person p2 = new Person(10,”zhangsan”);//使用Person类有两个参数的构造函数来创建对象
p1.speak();
p2.speak();

运行结果为:

xiaoming:1

zhangsan:10

 

3.构造函数内存图解

Person p2 = new Person(10,”zhangsan”);p2.speak();

 

这个代码在内存中的执行过程:

构造函数

说明:

1.执行main方法,在栈内存中开辟一个main函数的方法区,创建一个Person类型变量p2

2.在堆内存中创建一个Person的实例,并初始化值,和分配地址值

3.在栈内存中开辟Person构造函数的方法区,并执行构造函数中的代码,即给堆内存中的Person实例的name和age属性赋值

4.Person方法区出栈

5.栈中创建speak的方法区,执行相应的代码

6.speak方法区出栈

4.构造函数的相互调用

构造函数可以调用构造函数,如:

class Person{    private String name;    private int age;    Person(String n){        name = n;    }        Person(String n, int a){        this(n);         age = a;              }          public void speak(){                System.out.println(name+”:”+age);        }}

 

注意:

  1. 对this的调用必须是构造函数中的第一个语句
  2. 不允许两个构造函数互相调用,即不能Person(String n)中调用this(“zhangsan”,10),再在Person(String n, int a)调用this(“xiaoming”),会导致栈内存溢出,因为它们在不断的互相调用,不断进栈,却没有出栈

错误!!!栈内存溢出:

class Person{     private String name;    private int age;    Person(String n){    this("zhangsan",10)     name = n;     }        Person(String n, int a){      this("lisi");    age = a;              }    }

  • this详解见   [java学习笔记]java语言核心----this关键字&super关键字

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表