第三章java中的构造函数|
Constructor
在 java 中是允许您创建对象实例的代码块。它没有返回类型。 它有两个要点
-
构造函数名称应与类相同
-
构造函数不应该有任何返回类型,否则它将与方法相同。
ava中有三种构造函数。
- 默认构造函数
- 没有 arg 构造函数
- 参数化构造函数
## 如何调用构造函数?
要调用构造函数,您需要使用关键字 new,后跟类名,如果有参数,则后跟。 例如:如果要创建Employee类的对象,可以这样调用构造函数:
new Employee()
## 承包商的类型
### 默认构造函数:
当您不为您的类提供构造函数时,JVM 将创建默认构造函数。它对您不可见,JVM 会在初始化类的对象时自动创建它。
让我们看看例子:
package org.arpit.java2blog;
public class Employee {
String name;
int age;
public void workOnAssignment()
{
// Working on assignment
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public static void main(String args[])
{
Employee e1=new Employee();
e1.setName("John");
e1.setAge(20);
System.out.println(e1.getName());
System.out.println(e1.getAge());
}
}
正如您在此处看到的,我们没有为此类提供任何构造函数,但JVM在这种情况下会创建默认构造函数。 当你运行上面的程序时,你会得到下面的输出:
John 20
没有 arg 构造函数
no arg constructor
是您在类中明确提供的构造函数,它没有任何参数。
package org.arpit.java2blog;
public class Employee {
String name;
int age;
public Employee()
{
System.out.println("Calling no arg constructor");
}
public void workOnAssignment()
{
// Working on assignment
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public static void main(String args[])
{
Employee e1=new Employee();
e1.setName("John");
e1.setAge(20);
System.out.println(e1.getName());
System.out.println(e1.getAge());
}
}
当您调用上述程序时,您将得到以下输出:
Calling no arg constructor
John
20
参数化构造函数
当您将参数传递给构造函数时,会调用这种类型的构造函数Parameterized constructor
。
package org.arpit.java2blog;
public class Employee {
String name;
int age;
public Employee(String name,int age)
{
System.out.println("Calling Parameterized constructor");
this.name=name;
this.age=age;
}
public void workOnAssignment()
{
// Working on assignment
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public static void main(String args[])
{
Employee e1=new Employee("John",20);
System.out.println(e1.getName());
System.out.println(e1.getAge());
}
}
当你运行上面的程序时,你会得到下面的输出:
Calling Parameterized constructor
John
20
如果您提供参数化构造函数,那么您需要小心。 让我们看看下面的程序:
package org.arpit.java2blog;
public class Employee {
String name;
int age;
public Employee(String name,int age)
{
System.out.println("Calling Parameterized constructor");
this.name=name;
this.age=age;
}
public void workOnAssignment()
{
// Working on assignment
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public static void main(String args[])
{
Employee e1=new Employee();
e1.setName("John");
e1.setAge(20);
System.out.println(e1.getName());
System.out.println(e1.getAge());
}
}
如果你注意到,你会在第 38 行得到编译错误。为什么这样? 因为如果您在类中创建参数化构造函数,JVM 不会为您提供默认构造函数。如果您不编写任何构造函数,那么只有 JVM 会为您提供默认构造函数。
构造函数链
Constructor chaining
是子类在内部或显式调用其父类的构造函数的概念。 每当您在 Java 中创建对象时,都会调用其超类构造函数。编译器只是在内部将 super() 放入构造函数中。 让我们在示例的帮助下查看: 假设您有 Person 具有属性名称的类,并且您有名为Employee
扩展类的子Person
类。
package org.arpit.java2blog;
public class Person
{
String name;
public Person()
{
System.out.println("Calling Person constructor");
name="John";
}
}
class Employee extends Person{
int age;
public Employee()
{
System.out.println("Calling Employee class constructor");
name="Martin";
}
public void workOnAssignment()
{
// Working on assignment
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public static void main(String args[])
{
Employee e1=new Employee();
System.out.println(e1.getName());
}
}
当你运行上面的程序时,你会得到下面的输出:
Calling Person constructor
Calling Employee class constructor
Martin
正如您在此处看到的,First Person 构造函数被调用并将 name 变量设置为John
Then Employee 构造函数被调用,该构造函数将 name 变量覆盖为Martin
。 这就是为什么我们最后看到一个变量名为“Martin”。
如果要显式调用超类参数化构造函数怎么办
您可以使用super 关键字轻松完成。 让我们在示例的帮助下看看。
package org.arpit.java2blog;
public class Person
{
String name;
public Person(String name)
{
this.name=name;
System.out.println("Calling Person Parameterized constructor");
}
}
class Employee extends Person{
int age;
public Employee(String name)
{
super(name);
System.out.println("Calling Employee class constructor");
}
public void workOnAssignment()
{
// Working on assignment
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public static void main(String args[])
{
Employee e1=new Employee("John");
System.out.println("Employee's name:"+e1.getName());
}
}
当你运行上面的程序时,你会得到下面的输出:
调用人员参数化构造函数 调用员工类构造函数 员工姓名:John
如果你想调用同一个类的另一个构造函数怎么办
如果你想调用overloaded constructor
同一个类,你可以使用这个关键字来做到这一点。 例如:
package org.arpit.java2blog;
public class Employee {
String name;
int age;
public Employee() {
System.out.println("Calling No arg constructor");
}
public Employee(String name,int age)
{
this();
System.out.println("Calling Parameterized constructor");
this.name=name;
this.age=age;
}
public void workOnAssignment()
{
// Working on assignment
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public static void main(String args[])
{
Employee e1=new Employee("John",20);
System.out.println("Employee's name : "+e1.getName());
System.out.println("Employee's age : "+e1.getAge());
}
}
当你运行上面的程序时,你会得到下面的输出:
Calling No arg constructor
Calling Parameterized constructor
Employee’s name : John
Employee’s age : 20
请注意,用于调用重载构造函数的 this 关键字应该是该构造函数中的第一个语句。
这就是Java中的构造函数。
相关文章:
- [其它]第六章JavaFutureTask示例|
- [其它]第六章JavaScheduledThreadPoolExecutor示例|
- [其它]第六章使用Callable和Future的JavaExecutorService示例|
- [其它]第六章JavanewCachedThreadPool示例|
- [其它]第六章JavanewFixedThreadPool示例|
- [其它]第五章在java中使用3个线程打印序列|
- [其它]第五章java中notify和notifyAll的区别|
- [其它]第五章我们可以在java中启动一个线程两次吗|
- [其它]第五章java中的对象级锁定与类级锁定|
- [其它]第五章Java线程连接示例|
相关推荐:
- [其它]第三章java中的抽象类|
- [其它]第四章java中的TreeMap与示例|
- [其它]第四章java中的hashcode()和equals()方法|
- [其它]第六章JavaFutureTask示例|
- [其它]计算机组成原理PDF扫描格式电子版百度云网盘下载
- [其它]程序设计语言概念(第9版)[Robert W. Sebesta]pdf格式电子版百度云网盘下载[53.8M]
- [其它]程序员必读之软件架构[Simon Brown]pdf格式电子版百度云网盘下载[41.6M]
- [其它]程序员的思维修炼 开发认知潜能的九堂课[Andy Hunt]pdf格式电子版百度云网盘下载
- [其它]程序员的职业素养[Robert C. Martin]pdf格式电子版百度云网盘下载[21.6M]
- [其它]程序员教程(第3版)[张淑平]pdf格式电子版百度云网盘下载[136.5M]
- 计算机组成原理PDF扫描格式电子版百度云网盘下载
- 硅谷之谜[吴军]pdf格式电子版百度云网盘下载[59.5M]
- 自选基金助手,一款Chrome扩展程序
- 七周七语言 理解多种编程范型[Bruce A. Tate]pdf格式电子版百度云网盘下载[9M]
- 系统集成项目管理工程师考试考眼分析与样卷解析(2014版)[软考新大纲研究组]
- 程序员面试金典(第5版)[Gayle Laakmann McDowell]pdf格式电子版百度云网盘下载[81.5M]
- 创业维艰 如何完成比难更难的事[Ben Horowitz]pdf格式电子版百度云网盘下载[65.3
- 程序员的思维修炼 开发认知潜能的九堂课[Andy Hunt]pdf格式电子版百度云网盘下载
- 图灵的秘密 他的生平、思想及论文解读[Charles Petzold]pdf格式电子版百度云网盘下
- OCP OCA认证考试指南全册:Oracle Database 11g(1Z0-051、1Z0-052、1Z0-053)[John Watson]pdf格式