employee.java,Java基础系列(六):对象与类(上)

概述

类(class)是构造对象的模板。由类构造对象的过程称为创建类的实例。

封装从形式上看,封装是将数据和行为组合在一个包中,并对对象的使用者隐藏了数据的实现方式。对象中的数据称为实例域,而操纵数据的过程称之为方法。对于每个特定的类实例(对象)都有一组特定的实例域值。这些值的集合就是这个对象的当前状态。而实现封装的关键就是绝对不能让类中的方法直接访问其他类的实例域,仅仅可以通过对象的方法来与对象的数据进行交互。

在Java中,所有的类都来源于一个叫做Object的父类,我们将在后面的篇幅中详细讲解这个类。

对象与对象变量

如果我们想要使用对象,就必须要先来构造一个对象,然后指定它的初始状态。然后,再对这个对象应用方法。 在Java中,我们使用构造器来构造新的实例,构造器是一种特殊的方法,用来构造并初始化对象,构造器的名字应该与类的名字相同,如果想要构造一个对象,需要在构造器前面加上new操作符,比如:

new Date()

new Date()

这个表达式就是构造了一个对象,这个对象被初始化为当前的日期和时间。我们可以把这个对象作为参数,也可以立即调用这个对象的方法,比如:

System.out.println(new Date());

new Date().toString();

System.out.println(new Date());

new Date().toString();

但是,我们如果希望构造的对象可以多次使用,这是就需要将这个对象存到一个变量当中:

Date birthday = new Date();

Date birthday = new Date();

这里需要注意,对象和对象变量是不同的:

Date deadline;

//deadline并没有指向任何一个对象

Date deadline;

//deadline并没有指向任何一个对象

这里定义了一个对象变量deadline,它可以引用Date类型的变量,但是,变量deadline不是一个对象,也没有引用任何对象。

Date deadline;

String s = deadline.toString(); //这里会报一个编译错误

Date deadline;

String s = deadline.toString(); //这里会报一个编译错误

必须首先初始化变量,然后才能使用它,我们可以使用以下两种方式来初始化一个变量

//1.使用new操作符

Date deadline;

deadline = new Date();

//2.引用一个已经存在的对象

Date deadline;

Date birthday = new Date();

deadline = birthday;

//1.使用new操作符

Date deadline;

deadline = new Date();

//2.引用一个已经存在的对象

Date deadline;

Date birthday = new Date();

deadline = birthday;

一定要认识到:一个对象变量并没有实际包含一个对象,而是仅仅引用一个对象。对象变量的值就是引用的对象在堆中的地址。如下:

Date deadline = new Date();

Date deadline = new Date();

这里分为两个部分,表达式 newDate()构造了一个Date类型的对象,它的值是它在堆中的地址值,然后将该值赋给了deadline。 可以显式地将对象变量设置为null,表明这个对象变量目前没有引用任何对象,但是需要注意,如果将一个方法应用到一个值为null的对象上,那么就会产生运行时错误,抛出NullPointerException。

自定义类

在Java中,最简单的类定义形式为:

class ClassName {

field1;

field2;

...

constructor1;

constructor2;

...

method1;

method2;

}

class ClassName {

field1;

field2;

...

constructor1;

constructor2;

...

method1;

method2;

}

如下程序是一个简单的小例子:

import java.time.LocalDate;

public class EmployeeTest {

public static void main(String[] args) {

Employee[] staff = new Employee[3];

staff[0] = new Employee("Carl Cracker", 75000, 1987, 12, 15);

staff[0] = new Employee("Carl Cracker", 85000, 1988, 4, 15);

staff[0] = new Employee("Carl Cracker", 105000, 1989, 8, 15);

for (Employee employee : staff) {

employee.raiseSalary(5);

}

for (Employee employee : staff) {

System.out.println("name = " + employee.getName() + ", salary = " + employee.getSalary() + ", hireday = " + employee.getHireday());

}

}

}

class Employee {

//fields

private String name;

private double salary;

private LocalDate hireday;

//constructor

public Employee(String n, double s, int year, int month, int day) {

name = n;

salary = s;

hireday = LocalDate.of(year, month, day);

}

//methods

public String getName() {

return name;

}

public double getSalary() {

return salary;

}

public LocalDate getHireday() {

return hireday;

}

public void raiseSalary(double byPercent) {

double raise = salary * byPercent / 100;

}

}

import java.time.LocalDate;

public class EmployeeTest {

public static void main(String[] args) {

Employee[] staff = new Employee[3];

staff[0] = new Employee("Carl Cracker", 75000, 1987, 12, 15);

staff[0] = new Employee("Carl Cracker", 85000, 1988, 4, 15);

staff[0] = new Employee("Carl Cracker", 105000, 1989, 8, 15);

for (Employee employee : staff) {

employee.raiseSalary(5);

}

for (Employee employee : staff) {

System.out.println("name = " + employee.getName() + ", salary = " + employee.getSalary() + ", hireday = " + employee.getHireday());

}

}

}

class Employee {

//fields

private String name;

private double salary;

private LocalDate hireday;

//constructor

public Employee(String n, double s, int year, int month, int day) {

name = n;

salary = s;

hireday = LocalDate.of(year, month, day);

}

//methods

public String getName() {

return name;

}

public double getSalary() {

return salary;

}

public LocalDate getHireday() {

return hireday;

}

public void raiseSalary(double byPercent) {

double raise = salary * byPercent / 100;

}

}

注意,在这个示例程序中包括两个类:Employee类和带有public 访问修饰符的EmployeeTest类,源文件名是EmployeeTest.java,这是因为文件名必须与public类的名字相匹配。在一个源文件中,只能有一个公有类,但可以有任意数目的非公有类。 接下来,在编译这段源代码的时候,编译器将在目录下创建两个类文件:EmployeeTest.class和Employee.class。 将程序中包含main方法的类名提供给字节码解释器,以便启动这个程序:

java EmployeeTest

java EmployeeTest

字节码解释器开始运行EmployeeTest类的main方法中的代码,在这段代码中,先后构造了三个新Employee对象。

多个源文件的情况

在刚刚的例子中,一个源文件中包含了两个类,但是在日常的开发当中,我们通常习惯将每一个类存放到一个源文件中,如果我们将每个类都分别放到一个源文件中,刚刚的程序将可以有两种编译源程序的方法。一种是使用通配符调用 Java编译器:

javac Employee*.java

javac Employee*.java

于是,所有与通配符匹配的源文件都将被编译成类文件,第二种方式如下:

javac EmployeeTest.java

javac EmployeeTest.java

这里我们并没有显式的编译Employee.java。但是,当Java编译器发现EmployeeTest.java使用了Employee类时会查找名为Employee.class的文件,如果没有找到这个文件,就会自动的搜索Employee.java,然后,对它进行编译。更重要的是:如果Employee.java版本较已有的Employee.class文件版本新,Java编译器就会自动地重新编译这个文件。

下节预告

下节我们来了解对象与类地奥秘~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/344401.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【渝粤题库】陕西师范大学800007 地理信息系统

《地理信息系统》作业 一.名词解释 1.TIN       2 .缓冲区分析 3.元数据 4. 地理信息系统 5.空间数据库  6.拓扑关系 7.矢量结…

国家开放大学2021春1080工程数学(本)题目

教育 教育 试卷代号: 1080 2021年春季学期期末统一考试 工程数学(本) 试题 2021年7月 一、单项选择题(每小题3分,共15分) 1.设方阵可逆,则下列命题中不正确的是( ). A. B.线性方程组必有非零解…

弹簧启动执行器教程

朋友您好,在本教程中,我们将学习弹簧执行器及其所有功能。 1.什么是弹簧执行器? 2.如何在Maven项目或Gradle项目中添加弹簧执行器? 3.创建一个具有Spring Actuator依赖项的Spring Boot项目。 4.使用弹簧执行器端点监视应用程序…

matlab 大于并且小于,Matlab:将大于(小于)1(-1)的元素转换为1(-1)的序列

更新:我做了一些测试,Jonas的解决方案对于一系列不同大小的输入向量来说是最快的.特别是,正如angainor指出的那样,解决方案可以很好地扩展到大尺寸 – 这是一个重要的测试,因为通常是大尺寸的问题促使我们在SO上提出这些问题.感谢Jonas和tmpearce的解决方案 – 基于…

matlab 里try用法,matlab在整个程序(全局)中使用try-catch来报告错误

我的matlab程序是一个多窗口程序化GUI。我已经实现了一个报告系统,所以当遇到错误时,它会调用我编写的函数generateReport.m,它发送一个带有一些日志和状态信息的电子邮件,然后继续执行。为了实现这一点,我在每个单独的…

【渝粤题库】陕西师范大学200741概率论与数理统计作业(高起本、专升本)

《概率论与数理统计》作业 一、填空题 1.设有两门高射炮,每一门击中飞机的概率都是0.6,则同时发射一发炮弹而击中飞机的概率为   .若有一架敌机入侵领空,欲以99%以上的概率及中它,至少需 __&…

php xls 邮件,PHPMailer发送邮件

PHPMailer是一个封装好的PHP邮件发送类,支持发送HTML内容的电子邮件,以及图片附件,前提要设置好邮件服务器就能实现邮件发送功能。HTML首先我们先放置一个收件箱的输入框和一个发送邮件按钮:收件人:jQuery$(function()…

activiti自定义_在Activiti中执行自定义查询

activiti自定义(这可能最终会出现在Activiti 5.15版本的用户指南中,但是我已经想要共享它了) Activiti API允许使用高级API与数据库进行交互。 例如,对于检索数据,查询API和本机查询API的用法很强大。 但是&#xff0…

【渝粤题库】陕西师范大学201371 国际法学作业

《国际法》作业 一、填空题 1.( )和( ) 是国际法的主要渊源。 2.现代国际法主体应包括:国家、( )和( ) 3.国家领土包括:领…

【渝粤题库】陕西师范大学201901 中国古代文学(二) 作业(高起专)

《中国古代文学(二)》【高起专】作业 一、单选题 1、提出“大凡物不得其平则鸣”这一著名观点的作家是( ) A 李白 B 杜甫 C 韩愈 D 白居易 2、韦庄写有一首涉及黄巢起义的长篇叙事诗,题目叫做( &#xff09…

php实际开发过程,4.工作实际开发应用

**本文以thinkphp5中扩展 think-queue的应用为实例**1.安装think-queue 扩展composer install topthink/think-queue2.index模块下新建控制器,调用消息队列入队~~~namespace app\index\controller;/*** 文件路径: \application\index\controller\JobTest.php* 该控制…

引导性GCP:带有Google Cloud Pub / Sub的Spring Cloud Stream

我最近在Sprint Central的工程博客上阅读了Josh Long的Bootiful GCP系列 ,特别喜欢关于使用Google Cloud的Pub / Sub的第四部分 。 我受到该系列的启发,同时我还在为我的一个新项目评估Spring Cloud Stream。 我以为,我会继续讨论乔希&#x…

【渝粤题库】陕西师范大学202241 金融市场学 作业(专升本)

《金融市场学》作业 一 名词解释 1.货币头寸   2.金边债券   3.二板市场 4.金融市场 5.投资基金 6.系统风险 7.外汇市场 8.货币市场共同基金 9.衍生证券 10&#x…

【渝粤题库】陕西师范大学210002儿童文学 作业(高起专、高起本、专升本)

《儿童文学》作业 单选题 1、构成作品音响效果的因素是象声词、韵律和( )。 2、幼儿文学作品用词的总要求是:具体、浅显、充分发挥( )作用 3、在儿童文学创作艺术手法的运用中应注意心理描写和( &#xff…

db2 迁移mysql,mysql 迁移 db2

我该怎样迁移数据呢?如果用于非 IBM 平台的数据库模式与用于 DB2 的模式相同(或非常类似),那么可 以通过使用 IBM Migration Toolkit (MTK) 来完成数据迁移。因此......4. . 迁移应用程序 1.不同数据库的对象区别 Mysql/Sql Server->oracle 自增长 vs 序列 Oracle->DB2 …

jdbc和jdbc驱动_JDBC布尔兼容性列表

jdbc和jdbc驱动有趣的是,布尔类型只是在SQL标准后期才引入,即SQL:1999 。 即使在今天,并非所有数据库本身都支持BOOLEAN或BIT类型。 最重要的是,我们仍然可以在Oracle中等待一段时间。 这是2002年以来关于该主题的“问…

【渝粤题库】陕西师范大学300008 历史教学论

《历史教学论》作业 一、名词解释 1.历史课程标准 2.综合课型 3.讲述法 4.历史基础知识 5.历史教材 6.历史概念 7.复习课 8.讲解法 9.叙述法 10.绪论课 11&am…

【渝粤题库】陕西师范大学500013 物理教学论 作业(专升本)

《物理教学论》作业 一、简答题 1、中学物理教学应坚持哪些主要的教学原则? 2、适应新课程教学物理教师应具备怎样的智能结构? 3、中学生学习物理的主要思维特征是什么? 4、发展性课程评价体系的基本理念和原则是什么? 5、物理教学…

IDE日志分析方法pt。 1个

介绍 我认为大多数软件工程师都了解日志的重要性。 它们已成为软件开发的一部分。 如果无法解决问题,我们尝试在日志中查找原因。 对于一些简单的情况,当错误阻止应用程序打开窗口时,这可能就足够了。 您可以在日志中找到问题,然后…

ycms+php,CMS下载_建站大师 - 建站模板,CMS模板,网站开发

增加后台和用户中心可查看升级值的记录[12-14]增加后台为用户充值升级值的功能[12-14]增加后台列表的字段回调格式函数:联动菜单名称、单选字段名称、下拉字段名称、复选框名称[12-16]增加钩子接口:模块内容审核处理之后(module_verify_after)[12-17]增加…