- 1、本文档共33页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
08_面向对象(构造方法,静态).docx
第8天面向对象
构造函数(方法)
对封装有了基本的了解,接下来我们来看一个新的问题,依然以Person为例,由于Person中的属性都被private了,外界无法直接访问属性,必须对外提供相应的set和get方法。当创建人对象的时候,人对象一创建就要明确其姓名和年龄,那该怎么做呢?
构造函数介绍
在开发中经常需要在创建对象的同时明确对象的属性值,比如员工入职公司就要明确他的姓名、年龄等属性信息。
创建对象就要明确属性值,那怎么解决呢?也就是在创建对象的时候就要做的事情,当使用new关键字创建对象时,怎么给对象的属性初始化值呢?这就要学习Java另外一门小技术,构造函数。
那什么是构造函数呢?从字面上理解即为构建创造对象时用的函数,即就是对象创建时要执行的函数。既然是对象创建时要执行的函数,那么只要在new对象时,知道其执行的构造函数是什么,就可以在执行这个函数的时候给对象进行属性赋值。
构造函数的格式:
修饰符 构造函数名(参数列表)
{
}
构造函数的体现:
构造函数没有返回值类型。也不需要写返回值。因为其是为构建对象的,对象创建完,函数就执行结束。
构造函数名称必须和类型(类名)保持一致。
构造函数没有具体的返回值。
构造函数的代码体现:
class Person {
// Person的成员属性age和name
private int age;
private String name;
// Person的构造函数,拥有参数列表
Person(int a, String nm) {
// 接受到创建对象时传递进来的值,将值赋给成员属性
age = a;
name = nm;
}
}
构造函数调用和内存图解
理解构造函数的格式和基本功能之后,现在就要研究构造函数是怎么执行的呢?在创建对象的时候是如何初始化的呢?
在描述一个事物的时候,同时也描述了构造函数,这个构造函数是如何执行的呢?构造函数是专门用来创建对象的,也就是在new对象时要调用构造函数。现在来看看如何调用构造函数。
class Person {
// Person的成员属性age和name
private int age;
private String name;
// Person的构造函数,拥有参数列表
Person(int age, String name) {
// 接受到创建对象时传递进来的值,将值赋给成员属性
this.age = age;
this.name = name;
}
public void speak() {
System.out.println(name= + name + ,age= + age);
}
}
class PersonDemo {
public static void main(String[] args) {
// 创建Person对象
// Person p = new Person();
// 上述代码编译报错,原因是在Person类中没有Person()这样的构造函数
// 创建Person对象,并明确对象的年龄和姓名
Person p2 = new Person(23, 张三);
p2.speak();
}
}
上述代码演示了创建对象时构造函数的调用。即在创建对象时,会调用与参数列表对应的构造函数。
上述代码的图解:
图解说明:
首先会将main函数压入栈中,执行main函数中的 new Person(23,张三);
在堆内存中分配一片区域,用来存放创建的Person对象,这片内存区域会有属于自己的内存地址(0x88)。然后给成员变量进行默认初始化(name=null,age=0)。
执行构造函数(这里省略部分知识,后面讲解)中的代码(age = a ; name = nm;),这段代码执行结束后,成员变量age和name的值已经改变。此步骤也为构造函数初始化。执行结束之后构造函数弹栈,Person对象创建完成。将Person对象的内存地址0x88赋值给p2。
默认构造函数和细节
明确了构造函数的基本功能后,那么就要学习关于构造函数的细节问题,和开发中需要注意的问题。
在没有学习构造函数之前,也可以通过new关键字创建对象,并调用相应的方法,同时在描述事物时也没有写构造函数。这是为什么呢?
在之前学习的过程中,描述事物时,并没有显示指定构造函数,当在编译Java文件时,编译器会自动给class文件中添加默认的构造函数。如果在描述事物时,显示指定了构造函数,当在编译Java源文件时,编译器就不会再给class文件中添加默认构造函数。
class Person {
//如果没有显示指定构造函数,编译会在编译时自动添加默认的
文档评论(0)