Java基础(一)对象构造
由于Java对象构造非常重要,所以Java提供了多种编写构造器的机制。
1.重载
如果多个方法有相同的名字、不同的参数,便产生了重载。编译器必须挑选出具体执行哪个方法,它通过用各个方法给出的参数类型与特定方法调用所使用的值类型进行匹配来挑选出相应的方法。例如在下面的示例程序中,在创建第一位员工对象时执行第一个Empoyee构造器,在创建第二位员工对象时执行第二个Empoyee构造器,在创建第三位员工对象时执行第三个Empoyee构造器。
2.默认域初始化
如果在构造器中没有显式地给域赋值,那么就会被自动地赋为默认值:数值为0、布尔值为false、对象引用为null。如果不明确地对域进行初始化,就会影响程序代码的可读性。
3.无参数的构造器
对象由无参数构造函数创建时,其状态会设置为适当的默认值。如示例代码中,第三种重构方法Empoyee()就是无参数的构造函数。如果在编写一个类时没有编写构造函数,那么系统就会提供一个无参数构造器,这个构造器将所有的实例域设置为默认值。
4.显示域初始化
在执行构造器之前,先执行赋值操作。当一个类的所有构造器都希望把相同的值赋予某个特定的实例域是,这种方式特别有用。初始值不一定是常量值,可以调用方法对域进行初始化。如示例程序中的private String name = ""; // 实例域初始化,就是在每一个重载构造器初始化的时候都将name设置为""。
5.参数名
在参数命名上有两种方法。
通常是这种方法,但是只有阅读代码才能够了解参数n和参数s的含义。
public Employee(String n, double s)
{
name = n;
salary = s;
}
于是第一种常用方法是这种,在每个参数前面加上一个前缀“a”。
public Employee(String aName, double aSalary)
{
name = aName;
salary = aSalary;
}
第二种方法是为了让参数变量用相同的名字将实例域屏蔽起来。但是,如果将参数命名为salary,则salary将引用这个参数,而不是实例域。因此,可以采用this.salary的形式来访问实例域。之前的知识中介绍过,this指示隐式参数,也就是所构造的对象。
public Employee(String name , double salary )
{
this.name = name ;
this.salary = salary ;
}
6.调用另一个构造器
如示例程序所示,当调用new Employee(60000)时,Employee(double)构造器将调用Employee(String, double)构造器。采用这种方式可以对公共构造器代码部分只编写一次即可。
7.初始化块
如果无论使用哪个构造器构造对象,域都在对象初始化块中被初始化时可以使用对象初始化块。先运行初始化块,再运行构造器主题部分。示例中的id域即为对象初始化块。
如果对类的静态域进行初始化的代码比较复杂,那么可以使用静态的初始化块。也就是将代码放在一个块中,并标记关键字static。示例中的nextId即为静态代码块初始化。
下面先给一段程序来说明构造器的多种特性应用。
package BigJunOba.bjtu.ConstructorTest; import java.util.*; public class ConstructorTest
{
public static void main(String[] args)
{
Employee[] staff = new Employee[3]; staff[0] = new Employee("Harry", 40000);
staff[1] = new Employee(60000);
staff[2] = new Employee(); for (Employee e : staff)
System.out.println("name=" + e.getName() + ",id=" + e.getId() + ",salary="
+ e.getSalary());
}
} class Employee
{
private static int nextId; private int id;
private String name = ""; // 实例域初始化
private double salary; // 静态初始化块
static
{
Random generator = new Random();
// 设置nextId为0到9999的随机数
nextId = generator.nextInt(10000);
} // 对象初始化块
{
id = nextId;
nextId++;
} // 重载构造器第一种Employee(String, double)
public Employee(String n, double s)
{
name = n;
salary = s;
} // 重载构造器第二种Employee(double)
public Employee(double s)
{
// 用this调用另一个构造器,即调用Employee(String, double)构造器
this("Employee #" + nextId, s);
} // 重载构造器第三种,即默认构造器Employee()
// 也是无参数构造器,其状态会设置为适当的默认值
public Employee()
{
// name在实例域初始化中被设置为""
// salary没有被显示设置,因此初始化为默认值0
// id在对象初始化块中被设置为nextId
} public String getName()
{
return name;
} public double getSalary()
{
return salary;
} public int getId()
{
return id;
}
}
输出结果:
name=Harry,id=6611,salary=40000.0
name=Employee #6612,id=6612,salary=60000.0
name=,id=6613,salary=0.0
Java基础(一)对象构造的更多相关文章
- java基础(二) -对象和类
Java 对象和类 Java作为一种面向对象语言.支持以下基本概念: 多态 继承 封装 抽象 类 对象 实例 方法 重载 对象:对象是类的一个实例(对象不是找个女朋友),有状态和行为.例如,一条狗是一 ...
- JAVA基础之对象的初始化
本文主要记录JAVA中对象的初始化过程,包括实例变量的初始化和类变量的初始化以及 final 关键字对初始化的影响.另外,还讨论了由于继承原因,探讨了引用变量的编译时类型和运行时类型 一,实例变量的初 ...
- Java基础03-12_对象比较
对象比较 如果说现在有两个数字要判断是否相等,可以使用"=="完成 如果是字符串要判断是否相等使用"equals()" 但是如果说现在有一个自定义的类,要想判断 ...
- java 输入输出 函数对象构造
/*********************输入输出*******************/ //输入字符串 不包括最后的换行符'\n' import java.io.BufferedRe ...
- java基础(一)对象
对象的创建 Test test = new Test(); Test test = new Test("a"); 其实,对象被创建出来时,对象就是一个对象的引用,这个引用在内存中为 ...
- Java基础---其他对象
第一讲 System类 一.概述 1.System是描述系统一些信息的类,类中的属性和方法都是静态的.不能被实例化,没有提供构造函数. 2.字段摘要 out:标准输出流.默认是控制台. in: ...
- Java基础 -- 持有对象(容器)
一 容器的用途 如果对象的数量与生命周期都是固定的,自然我们也就不需要很复杂的数据结构. 我们可以通过创建引用来持有对象,如 Class clazz; 也可以通过数组来持有多个对象,如 Class[] ...
- Java 基础之一对象导论
对象导论 1.1 抽象过程 所有编程语言都提供抽象机制.人们所能解决的问题的复杂性直接取决于抽象的类型和质量. 汇编语言是对底层机器的轻微抽象. 我们将问题空间中的元素及其再解空间中的表示称为对象.这 ...
- Java基础之对象序列化
1. 什么是Java对象序列化 Java平台允许我们在内存中创建可复用的Java对象,但一般情况下,只有当JVM处于运行时,这些对象才可能存在,即,这些对象的生命周期不会比JVM的生命周期更长.但在现 ...
- Java基础 ----- 判断对象的类型
1. 判断对象的类型:instanceOf 和 isInstance 或者直接将对象强转给任意一个类型,如果转换成功,则可以确定,如果不成功,在异常提示中可以确定类型 public static vo ...
随机推荐
- Scala Data Structure
Arrays Array 固定长度:ArrayBuffer 可变长度 arr.toBuffer, buf.toArray 初始化是不要使用 new 使用 () 访问元素 使用 for (elem &l ...
- Ubuntu 卸载openJDK
如果你在 Ubuntu 软件中心安装过 OpenJDK,请先使用如下命令将其删除: $ sudo apt-get purge openjdk*
- .Net Core 商城微服务项目系列(三):Ocelot网关接入Grafana监控
使用网关之后我们面临的一个问题就是监控,我们需要知道网关的实时状态,比如当前的请求吞吐量.请求耗费的时间.请求峰值甚至需要知道具体哪个服务的哪个方法花费了多少时间.网关作为请求的中转点是监控品牌的要塞 ...
- Zookeeper 学习笔记之 Leader Election
ZooKeeper四种节点类型: Persist Persist_Sequential Ephemeral Ephemeral_Sequential 在节点上可注册的Watch,客户端先得到通知再得到 ...
- 栈二:包含min函数的栈
/** * 题目:包含min函数的栈 * 描述: 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. * 注:用data来保存数据,用另一个栈min保存依次入栈最小的数 * ...
- Python爬虫零基础入门(系列)
一.前言上一篇演示了如何使用requests模块向网站发送http请求,获取到网页的HTML数据.这篇来演示如何使用BeautifulSoup模块来从HTML文本中提取我们想要的数据. update ...
- openpyxl中遇到TypeError: 'generator' object is not subscriptable的问题和解决方案
今天在搭建驱动数据框架用到了一个叫 openpyxl的包用来解析excel数据 随后就出现了TypeError: 'generator' object is not subscriptable的bug ...
- Java 从入门到进阶之路(八)
在之前的文章我们介绍了一下 Java 中的重载,接下来我们看一下 Java 中的构造方法. 我们之前说过,我们在定义一个变量的时候,java 会为我们提供一个默认的值,字符串为 null,数字为 0. ...
- 基于Linux的kfifo移植到STM32(支持os的互斥访问)
基于Linux的kfifo移植到STM32(支持os的互斥访问) 关于kfifo kfifo是内核里面的一个First In First Out数据结构,它采用环形循环队列的数据结构来实现:它提供一个 ...
- 初识Django,了解一下大概流程
学习Django一个礼拜了,对其有了一个大概的了解,自己画了一个简单的图,虽然有点丑,但是基本上已经把自己所想已经表达 写完这篇随笔之后发现自己逻辑表述的有点不太清晰,有点乱,哪里不对,希望各位指正 ...