[ Java学习基础 ] Java构造函数

构造方法是类中特殊方法,用来初始化类的实例变量,它在创建对象(new运算符)之后自动调用。

Java构造方法的特点如下:

  1. 构造方法名必须与类名相同。
  2. 构造方法没有任何返回值,包括void。
  3. 构造方法只能与new运算符结合使用。

示例代码如下:

 1 //Rectangle.java文件
 2 package com.a51work6;
 3
 4 // 矩形类
 5 public class Rectangle {
 6
 7     // 矩形宽度
 8     int width;
 9     // 矩形高度
10     int height;
11     // 矩形面积
12     int area;
13
14     // 构造方法
15     public Rectangle(int w, int h) {
16         width = w;
17         height = h;
18         area = getArea(w, h);
19     }
20     ...
21 }

代码第15行是声明了一个构造方法,其中有两个参数w和h,用来初始化Rectangle对象的两个成员变量width和height,注意前面没有任何的返回值。

默认构造方法

有时在类中根本看不到任何的构造方法。例如本节中User类代码如下:

 1 //User.java文件
 2 package com.a51work6;
 3
 4 public class User {
 5
 6     // 用户名
 7     private String username;
 8
 9     // 用户密码
10     private String password;
11
12 }

从上述User类代码,只有两个成员变量,看不到任何的构造方法,但是还是可以调用无参数的构造方法创建User对象,因为Java虚拟机会为没有构造方法的类,提供一个无参数的默认构造方法,默认构造方法其方法体内无任何语句,默认构造方法相当于如下代码:

//默认构造方法
public User() {
}

默认构造方法的方法体内无任何语句,也就不能够初始化成员变量了,那么这些成员变量就会使用默认值,成员变量默认值是与数据类型有关。

构造方法重载

在一个类中可以有多个构造方法,它们具体有相同的名字(与类名相同),参数列表不同,所以它们之间一定是重载关系。

构造方法重载示例代码如下:

 1 //Person.java文件
 2 package com.a51work6;
 3
 4 import java.util.Date;
 5
 6 public class Person {
 7
 8     // 名字
 9     private String name;
10     // 年龄
11     private int age;
12     // 出生日期
13     private Date birthDate;
14
15     public Person(String n, int a, Date d) {
16         name = n;
17         age = a;
18         birthDate = d;
19     }
20
21     public Person(String n, int a) {
22         name = n;
23         age = a;
24     }
25
26     public Person(String n, Date d) {
27         name = n;
28         age = 30;
29         birthDate = d;
30     }
31
32     public Person(String n) {
33         name = n;
34         age = 30;
35     }
36
37     public String getInfo() {
38         StringBuilder sb = new StringBuilder();
39         sb.append("名字: ").append(name).append(‘\n‘);
40         sb.append("年龄: ").append(age).append(‘\n‘);
41         sb.append("出生日期: ").append(birthDate).append(‘\n‘);
42         return  sb.toString();
43     }
44 }

上述代码Person类代码提供了4个重载的构造方法,如果有准确的姓名、年龄和出生日期信息,则可以选用代码第15行的构造方法创建Person对象;如果只有姓名和年龄信息则可选用代码第21行的构造方法创建Person对象;如果只有姓名和出生日期信息则可选用代码第26行的构造方法创建Person对象;如果只有姓名信息则可选用代码第32行的构造方法创建Person对象。

Tips:如果在类中添加了带参的构造函数,系统就不会在自动生成无参的构造函数,所以建议添加带参数的构造函数后,再手动添加一个默认无参的构造函数。

构造方法封装

构造方法也可以进行封装,访问级别与普通方法一样,构造方法的访问级别参考[ Java学习基础 ] Java的封装性与访问控制中图所示。示例代码如下:

 1 //Person.java文件
 2 package com.a51work6;
 3
 4 import java.util.Date;
 5
 6 public class Person {
 7
 8     // 名字
 9     private String name;
10     // 年龄
11     private int age;
12     // 出生日期
13     private Date birthDate;
14
15     // 公有级别限制
16     public Person(String n, int a, Date d) {
17         name = n;
18         age = a;
19         birthDate = d;
20     }
21
22     // 默认级别限制
23     Person(String n, int a) {
24         name = n;
25         age = a;
26     }
27
28     // 保护级别限制
29     protected Person(String n, Date d) {
30         name = n;
31         age = 30;
32         birthDate = d;
33     }
34
35     // 私有级别限制
36     private Person(String n) {
37         name = n;
38         age = 30;
39     }
40
41     ...
42 }

上述代码第16行是声明公有级别的构造方法。代码第23行是声明默认级别,默认级别只能在同一个包中访问。代码第29行是保护级别的构造方法,该构造方法在同一包中与默认级别相同,在不同包中可以被子类继承。代码第36行是私有级别构造方法,该构造方法只能在当前类中使用,不允许在外边访问,私有构造方法可以应用于单例设计模式等设计。

----------------------------------------------------------------------------

初始化块和构造函数的执行顺序

读者可先自行阅读下面代码,判断输出结果:

 1   class B extends Object
 2   {
 3       static
 4       {
 5           System.out.println("Load B");
 6       }
 7       public B()
 8       {
 9             System.out.println("Create B");
10      }
11  }
12  class A extends B
13  {
14      static
15      {
16          System.out.println("Load A");
17      }
18      public A()
19      {
20          System.out.println("Create A");
21      }
22  }
23
24  public class Testclass
25  {
26      public static void main(String [] args)
27      {
28          new A();
29      }
30  }

输出结果:

Load B
Load A
Create B
Create A

初始化块在构造器执行之前执行,类初始化阶段先执行最顶层父类的静态初始化块,依次向下执行,最后执行当前类的静态初始化块;创建对象时,先调调用顶层父类的构造方法,依次向下执行,最后调用本类的构造方法 。所以执行顺序为:父类静态代码 -> 子类静态代码块 -> 父类构造代码块 -> 父类构造函数 -> 子类构造代码块 -> 子类构造函数

原文地址:https://www.cnblogs.com/Kevin-ZhangCG/p/8908545.html

时间: 2024-10-15 16:56:08

[ Java学习基础 ] Java构造函数的相关文章

[ Java学习基础 ] Java异常处理

一.异常概述 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的.比如说,你的代码少了一个分号,那么运行出来结果是提示是错误 java.lang.Error:如果你用System.out.println(11/0),那么你是因为你用0做了除数,会抛出 java.lang.ArithmeticException 的异常. 异常发生的原因有很多,通常包含以下几大类: 用户输入了非法数据. 要打开的文件不存在. 网络通信时连接中断,或者JVM内存溢出. 这些异常有的是因为用

[ Java学习基础 ] Java的封装性与访问控制

Java面向对象的封装性是通过对成员变量和方法进行访问控制实现的,访问控制分为4个等级:私有.默认.保护和公有,具体规则如下表: 1.私有级别 私有级别的关键字是private,私有级别的成员变量和方法只能在其所在类的内部自由使用,在其他的类中则不允许直接访问.私有级别限制性最高.示例代码如下: 1 // PrivateClass.java文件 2 public class PrivateClass { 3 private int x; 4 5 public PrivateClass() { 6

[ Java学习基础 ] Java对象的创建和销毁

类实例化可生成对象,实例方法就是对象方法,实例变量就是对象属性.一个对象的生命周期包括三个阶段:创建.使用和销毁. 创建对象 创建对象包括两个步骤:声明和实例化. 声明 声明对象与声明普通变量没有区别,语法格式如下: type objectName; 其中type是引用类型,即类.接口和数组.示例代码如下: String name; 该语句声明了字符串类型对象name.可以声明并不为对象分配内存空间,而只是分配一个引用. 实例化 实例化过程分为两个阶段:为对象分配内存空间和初始化对象,首先使用n

Java学习基础2

运算符: ++:  int a = 4;  int b = a++;    ++在后:先运算在递增1   输出:a=5  b=4;    int b = ++a;    ++在前:先递增1,再运算 输出:a=5  b=5;   --:   同上  & &&:  &:逻辑与  &&:短路与  若&&勤勉的表达式的结果是false,&&后面的表达式就再执行   | ||:  |:逻辑或  ||:短路或  若||前面的表达式的结果是

Java学习基础1

Java 平台: Java API JVM  特点:可跨平台  Java 运行机制:           编译                         运行 Java文件------->class文件(可跨平台)-------->程序结果  jdk:开发工具  jre:   :JVM jre:运行环境  JVM:   安装JDK, 配置环境变量:  PATH:找编译运行的工具等:jdk跟目录下的bin目录  JAVA_HOME:设置jdk根目录   PATH: %JAVA_HOME%\

JAVA学习篇--Java类加载

由来: 与普通程序不同的是,Java程序(class文件)并不是本地的可执行程序(解释性语言).当运行Java程序时,首先运行JVM(Java虚拟机),然后再把Javaclass加载到JVM里头运行,负责加载Javaclass的这部分就ClassLoader.中文叫做类加载器. 类加载器就好比一个代理,你需要什么,我通过类加载器将你需要的内容返回给你! 类加载器有什么作用? 当程序需要的某个类,那么需要通过类加载器把类的二进制加载到内存中. 解释: 类加载器也是Java类,因为其他是java类的

好程序员Java学习路线Java bean是个什么概念

好程序员Java学习路线Java bean是个什么概念,Bean的中文含义是"豆子",顾名思义JavaBean是一段Java小程序.JavaBean实际上是指一种特殊的Java类,它通常用来实现一些比较常用的简单功能,并可以很容易的被重用或者是插入其他应用程序中去.所有遵循一定编程原则的Java类都可以被称作JavaBean.一. Java Bean技术概述??????? Java Bean是基于Java的组件模型,由属性.方法和事件3部分组成.在该模型中,JavaBean可以被修改或

JAVA学习篇--JAVA的两种编程模式对比

在Drp项目中,讲解了两种编程模式Model 1和Model2,下面是对这两种模式的简单理解,以及由于Model2是基于MVC架构的模式,就将我们易混淆的MVC与我们之前学的三层架构进行对比学习一下. Model1 所谓Model1就是JSP大行其道的时代,在Model1模式下,整个Web应用几乎全部由JSP页面组成,JSP页面接收处理客户端请求,对请求处理后直接做出响应.用少量的JavaBean来处理数据库连接.数据库访问等操作. 代码示例:修改用户信息 主页面的js跳转: function

java学习路线-Java技术人员之路从0基础到高级

满满的  全是干货 java基础: 尚学堂 马士兵   个人推荐 历经5年锤练--史上最适合刚開始学习的人入门的Java基础视频   很具体   适合 时间多的看 传智播客java基础班 马士兵线程 马士兵反射 毕向东java基础 尚硅谷java基础文档 java0基础: 甲骨论Oracle  专业 mysql视频 传智播客java web  据说是史上最全面的 30天掌握java web视频 个人推荐  可惜 后面 十几天的 没有 尚硅谷 javaWeb文档 尚硅谷js&jquery,ajax