作者:CHAITANYA SINGH

来源:通过示例学习Java编程(14):Java中的构造函数-方家话题

构造函数是用来初始化新创建的对象的代码块。构造函数类似于java中的实例方法(Instance Method),但它不是一个方法(Method),因为它没有返回类型。简而言之,构造函数和方法是不同的(在本指南的末尾将有更多的介绍)。人们经常把Java中的构造函数称为特殊类型的方法。

构造函数的名称必须与与类名相同,如下图中的java代码所示:public class MyClass{//This is the constructorMyClass(){}..}

注意,构造函数名与类名必须一致,并且没有返回类型。

构造函数是如何工作的?

下面我们通过一个例子来帮助大家理解构造函数的工作原理。我们先创建一个名字叫MyClass的类:

MyClass obj = new MyClass();

以上代码的意思就是通过new关键字来创建类MyClass的对象并调用这个类的构造函数来初始化这个新创建的对象,然后把这个对象赋值给对象变量obj。语句new MyClass()表示创建一个新的关于类MyClass的对象并调用构造函数来初始化这个新创建的对象。

下面我们来通过代码实例来解释什么是新创建对象的初始化。

一个简单的java构造函数程序

这里我们基于类Hello创建了一个对象obj,然后我们显示这个对象的实例变量name的值。在构造函数里面,我们给变量name赋值“BeginnersBook.com”,在赋值语句里面的this关键字表示引用当前的对象。我们将在下一个教程中详细介绍this关键字。

public class Hello {String name;//ConstructorHello(){this.name = "BeginnersBook.com";}public static void main(String[] args) {Hello obj = new Hello();System.out.println(obj.name);}}

输出:

BeginnersBook.com

构造函数的类型

构造函数有三种类型:默认构造函数、无参数构造函数和参数化构造函数。

默认构造函数

如果在类(class)中没有定义代码来实现任何构造函数,Java编译器将会在编译的字节码里面为你插入默认构造函数。不会在源代码(java文件)中找到它,因为默认构造函数是在编译期间由编译器插入到代码中,并且存在于.class文件中,所以你在源代码(java文件)里面是看不到这个默认构造函数的。这个过程如下图所示:

注:如果你在类(class)里面实现了任何构造函数,那么Java编译器将不会在你的代码中插入默认构造函数。

无参数构造函数

不带参数的构造函数称为无参数构造函数,其形式看上去与默认构造函数相同,但是无参数构造函数里面可以有任何代码,而默认构造函数里面则是空的。

注:虽然您可能会看到一些人声称默认构造函数和无参数构造函数是相同的,但实际上它们并不相同,只要是你写的构造函数,就不能称之为默认构造函数。

示例:无参数构造函数

class Demo{public Demo(){System.out.println("This is a no argument constructor");}public static void main(String args[]) {new Demo();}}

输出:

This is a no argument constructor

参数化构造函数

带参数的构造函数称为参数化构造函数。

示例1:参数化构造函数

在这个例子中,我们定义的类Employee里面有一个带有两个参数(id,name)的参数化构造函数。用这个类Employee创建两个对象,obj1和obj2,在创建obj1和obj2时都调用了这个参数化构造函数,分别往里面传了两套不同的参数:10245、"Chaitanya"和92232、"Negan",传进去的参数都赋值给了类的成员变量empId和empName,后面的代码把obj1和obj2的empId和empName分别打印出来,见下图:

public class Employee {int empId; String empName; //parameterized constructor with two parametersEmployee(int id, String name){ this.empId = id; this.empName = name; } void info(){System.out.println("Id: "+empId+" Name: "+empName);} public static void main(String args[]){ Employee obj1 = new Employee(10245,"Chaitanya"); Employee obj2 = new Employee(92232,"Negan"); obj1.info(); obj2.info(); } }

输出:Id: 10245 Name: ChaitanyaId: 92232 Name: Negan

例2:参数化构造函数

在这个例子中,我们有两个构造函数,一个默认构造函数和一个参数化构造函数。当我们在使用new关键字创建对象而且不传递任何参数时,系统将调用默认构造函数,但是如果我们在使用new关键字创建对象的时候传递了参数,那么系统将调用与传递的参数列表匹配的参数化构造函数。

class Example2{private int var;//default constructorpublic Example2(){this.var = 10;}//parameterized constructorpublic Example2(int num){this.var = num;}public int getValue(){return var;}public static void main(String args[]){Example2 obj = new Example2();Example2 obj2 = new Example2(100);System.out.println("var is: "+obj.getValue());System.out.println("var is: "+obj2.getValue());}}

输出:

var is: 10var is: 100

如果我们类中只实现了参数化构造函数,而没有实现默认构造函数(不带参数的),会发生什么?

class Example3{private int var;public Example3(int num){var=num;}public int getValue(){return var;}public static void main(String args[]){Example3 myobj = new Example3();System.out.println("value of var is: "+myobj.getValue());}}

输出:编译报错

原因:在代码Example3 myobj = new Example3();中,我们调用了类Example3里面的不含参数的默认构造函数,还记得我们在上面提到的,一旦我们在类里面有实现带参数的构造函数,那么编译器就不会自动在背后给我们插入不含参数的默认构造函数,而代码new Example3();调用了类(class)Example3的不存在的默认构造函数,当然编译就会报错啦!

如果我们从上面的代码中删除参数化构造函数的实现代码,那么程序编译和运行都不会有问题,因为编译器会在编译的过程中将默认构造函数插入到您的代码中。

构造函数链

当构造函数调用同一个类的另一个构造函数时,这称为构造函数链,见下图:

super()

每当我们调用子类构造函数时,它都隐式地调用了父类的构造函数,可以把这理解为编译器在子类构造函数的开头插入了super();语句。

class MyParentClass {MyParentClass(){System.out.println("MyParentClass Constructor");}}class MyChildClass extends MyParentClass{MyChildClass() {System.out.println("MyChildClass Constructor");}public static void main(String args[]) {new MyChildClass();}}

输出:

MyParentClass ConstructorMyChildClass Constructor

构造函数重载

构造函数重载指的是同一个类里面定义实现了多个不同参数列表的构造函数,虽然这些构造函数的名字都是一样的(和类名一样),但在创建这个类的对象的时候,如果传进去的参数不同,调用的构造函数也是不同的。

Java的复制构造函数

复制构造函数用于将一个对象的值复制到另一个对象。

class JavaExample{ String web; JavaExample(String w){ web = w;} /* This is the Copy Constructor, it * copies the values of one object* to the another object (the object* that invokes this constructor)*/JavaExample(JavaExample je){ web = je.web; } void disp(){System.out.println("Website: "+web);} public static void main(String args[]){ JavaExample obj1 = new JavaExample("BeginnersBook"); /* Passing the object as an argument to the constructor* This will invoke the copy constructor*/JavaExample obj2 = new JavaExample(obj1); obj1.disp(); obj2.disp(); } }

输出:Website: BeginnersBookWebsite: BeginnersBook

要点回顾:

1. 每个类都有一个构造函数,不管它是普通类还是抽象类。

2. 构造函数不是方法,它们没有任何返回类型。

3. 构造函数名应该与类名匹配。

4. 构造函数可以使用任何访问说明符,它们也可以声明为私有。在java中可以使用私有构造函数,但是私有构造函数的作用域局限在类里面。

5. 我们也可以定义一个和类名相同的方法,但方法必须要定义返回值的数据类型,我们可以据此判断和类名相同的方法和构造函数的区别。

6. 如果我们没有在类中定义和实现任何构造函数,编译器就会在编译的时候自动在后台的代码中插入默认构造函数。

7. this()和super()这两个语句如果放在构造函数代码里面,一定要放在构造函数代码里面的第一行。如果我们的代码里面没有这两个语句,编译器会在后台的代码中自动插入这两个语句。

8. 构造函数可以重载(overload),但不能重写(override)。这意味着我们可以在类中重载(overload)构造函数,但不能重写(override)构造函数。

9. 构造函数不能继承。

10. 如果父类(super class)没有定义无参数构造函数(默认构造函数),那么编译器也不会自动在子类(child class)的后台代码里面自动插入默认构造函数。

11. 接口没有构造函数。

12. 抽象类可以有构造函数,抽象类的构造函数在创建具体类的对象的时候被调用到。

13. 构造函数代码里面还可以调用同一个类的另一个构造函数,使用方法就是通过调用this()方法,例如,在一个构造函数里面要调用另一个带参数的构造函数,可以用这样的写法:this(parameter list),这里parameter list就是传进去的几个参数。

构造函数(constructor)与方法(method)的区别

1. 构造函数的目的是初始化类的对象,而方法的目的是通过执行java代码来执行任务。

2. 构造函数不能是抽象的(abstract)、最终的(final)、静态的(static)和同步的(synchronised),而方法则可以是。

3. 构造函数没有返回类型,而方法有返回类型。

getvalue函数怎么使用_Java中的构造函数——通过示例学习Java编程(14)相关推荐

  1. @value 静态变量_Java中的变量——通过示例学习Java编程(4)

    作者:CHAITANYA SINGH 来源: 通过示例学习Java编程(4):Java中的变量-方家话题​www.koofun.com 变量是用来存放可以更改的值的容器.例如,当我写int i = 1 ...

  2. java for循环返回值_Java中的for循环——通过示例学习Java编程(9)

    作者:CHAITANYA SINGH 来源:https://www.koofun.com/pro/kfpostsdetail?kfpostsid=21 循环用于反复执行同一组语句,直到满足特定条件为止 ...

  3. java中doloop语句_Java中的do-while循环——通过示例学习Java编程(11)

    作者:CHAITANYA SINGH 来源:https://www.koofun.com/pro/kfpostsdetail?kfpostsid=22&cid=0 在上一篇教程中,我们讨论了w ...

  4. Java中的do-while循环——通过示例学习Java编程(11)

    作者:CHAITANYA SINGH 来源:https://www.koofun.com/pro/kfpostsdetail?kfpostsid=22&cid=0 在上一篇教程中,我们讨论了w ...

  5. 【26天高效学习Java编程】Day22:Java中的属性集-缓冲流-转换流-序列化流详解

    本专栏将从基础开始,循序渐进,由浅入深讲解Java的基本使用,希望大家都能够从中有所收获,也请大家多多支持. 专栏地址:26天高效学习Java编程 相关软件地址:软件地址 所有代码地址:代码地址 如果 ...

  6. java 方法 函数 区别_Java中的构造函数和方法之间的区别

    Java方法一种方法用于探索对象的行为. 我们可以在方法的前面加上访问修饰符. 方法必须具有返回类型,例如void,任何原始类型(int,char,float等),任何Object类型(Integer ...

  7. 函数不可访问_Java中的不可变总结

    什么是不可变的? 不变类是不能修改其实例的类.创建对象时会提供存储在不可变对象中的信息,此后,该信息将永远不变且只读.由于我们无法修改不可变的对象,因此我们需要解决此问题.例如,如果我们在一个太空飞船 ...

  8. java构造方法可以是私有的吗_Java中的构造函数可以私有吗?

    小编典典 是的,构造函数可以是私有的.有不同的用途.一种这样的用法是用于单例设计反模式,我建议你不要使用它.另一个更合理的用法是委派构造函数.你可以让一个构造函数接受很多不同的选项,而这些选项实际上是 ...

  9. java构造函数的重载_Java中的构造函数重载 - Break易站

    Java 构造函数 Java中的构造函数重载 除了重载方法外,我们还可以在java中重载构造函数.基于新执行时指定的参数调用重载的构造函数. 我们什么时候需要构造函数重载? 有时候需要用不同的方式初始 ...

最新文章

  1. 上网行为管理产品选型简单考量
  2. 容器网络Calico进阶实践 | 褚向阳
  3. Python中如何使用构造方法定义类
  4. QCon北京2015:18个热门专题,出品人全部确认,新版网站上线
  5. Linux系统的存储管理
  6. 分组合计且排序和显示名称
  7. [Python]网络爬虫(三):异常的处理和HTTP状态码的分类
  8. 七、朴素贝叶斯中文文本分类
  9. 饶过'(单引号)限制继续射入
  10. PyCharm2020.2.3社区版安装,配置及使用教程(Windows)
  11. adurnio 单片机_单片机20~200A大电流检测电路设计 用AD实现 带原理图,源代码,proteus仿真文件...
  12. Array提供的方法
  13. jinja filter
  14. 使用python简单分析个人微信好友
  15. 西门子PLC开发笔记(一):PLC介绍,西门子S1200系列接线、编程、下载和仿真
  16. 我的第一个C语言:用点阵显示出我的名字拼音首字母。
  17. VMware虚拟机安装macOS黑苹果教程,亲测流程,全过程问题解决方案记录
  18. Python pass语句及其作用
  19. 高电平输入好还是rca输入好_汽车音响接高电平还是低电平是什么意思
  20. vue3子组件修改传值给父组件报警告warn:Component emitted event “update:dialogAddVisible”

热门文章

  1. [LeetCode] 565. Array Nesting
  2. 搞定vim的窗口操作
  3. gulp.js 的安装以及使用
  4. 数据仓库与数据挖掘的一些基本概念
  5. Github page + octopress介绍
  6. 回到顶部和返回首页jquery插件
  7. 2.4基于虚拟机的Linux内核编译
  8. POJ 2336 Ferry Loading II 动态规划
  9. 利用OpenCV的VideoWriter类实现视频的写操作
  10. list vue 删除后页面渲染_浅谈Vue项目实战(页面渲染+事件绑定)