概述

类(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编译器就会自动地重新编译这个文件。

下节预告

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

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

  1. Java零基础系列003——变量

    Java零基础系列003--变量 //变量(variable):程序中最基本的存储单元,包括变量名.类型.作用域 //变量应该先声明,只有声明后系统才会为其分配相应长度的存储空间,变量实质上就是存储单 ...

  2. Java零基础系列001——第一个程序

    Java零基础系列001--第一个程序 public class Welcome {public static void main(String[] args) {//args为arguments的缩 ...

  3. java实现linkstring,【JAVA SE基础篇】32.String类入门

    [JAVA SE基础篇]32.String类入门 1.字符串 1.String类又称作不可变字符序列 2.String位于java.lang包中,java程序默认导入java.lang包下所有的类 3 ...

  4. Java基础系列(二) 对象相等判断

    一.  equals 和 == 的区别是什么 == : 它的作用是判断两个对象的地址是不是相等, 即判断两个对象是不是同一个对象 基本数据类型 ==    比较的是值 引用数据类型  ==   比较的 ...

  5. Java必备基础十六——输入与输出流相关类详细介绍

    坚持的第16篇. 鸡汤一下:真正能让你走远的,都是自律.积极和勤奋 文章目录 序言 一.什么是流 二.流的种类划分 1.按数据流的方向分:输入流.输出流 1.1 定义 1.2 层次结构 2.按处理数据 ...

  6. Java语言基础(常见对象3(数组排序(冒泡排序、选择排序、直接插入排序、快速排序、归并排序)、Arrays、基本数据类型包装类、Integer类、自动拆箱、自动装箱))

    Java语言基础 常见对象 数组排序 冒泡排序 相邻元素两两比较,大的往后放,第一次完毕,最大值的元素就会出现在最大索引处:以此循环 //冒泡排序:public static void main(St ...

  7. java夯实基础系列:反射

    一.反射定义&通俗理解   反射之中包含了一个"反"的概念,所以要想解释反射就必须先从"正"开始解释,一般而言,当用户使用一个类的时候,应该先知道这个类 ...

  8. Java反射基础(一)--Class对象获取

    Classes Java中,任何一个对象要么是一个引用类型要么是基本数据类型.引用类型指的是那些直接或间接 Java.lang.Object的类.Classse,enum,和接口都是应用类型.基本类型 ...

  9. Java零基础-08-面向对象

    目录 1.面向过程和面向对象 1.1面向过程和面向对象概念 1.2面向对象和面向过程的区别 1.3面向对象的专业术语 1.4面向对象的三大特征 2.类和对象的概念 2.1类 2.2类和对象关系 2.3 ...

  10. 求python一个类与对象的代码_Python基础系列(五)类和对象,让你更懂你的python代码...

    首先,非常感谢各位打开本博文,本博文是Python入门基础系列文章之一,Python目前是非常火的编程工具,其实作为编程不在只是程序员的专利,每一个人在日常的工作中.学习中都会或多或少的要用到一些工具 ...

最新文章

  1. 为什么应该安装使用 Arch Linux
  2. 软件本地化,软件本地化公司
  3. MySQL 高级- case结构
  4. Python—实训day6—爬取汽车消费投诉案例
  5. 《C++ Primer 5th》笔记(1 / 19):C++基础
  6. 草稿django添加自定义模板代码的用法
  7. python scapy模块安装_python scapy模块安装与依赖模块
  8. 对口计算机专业分数线,湖南省2021年普通高校招生本科批(职高对口类)平行一志愿投档分数线公布...
  9. 基于HK-2000 OEM的嵌入式Linux开发
  10. js修改地址栏url_前端实战总结如何在不刷新页面的情况下改变URL
  11. 达内java学习笔记
  12. 利用netstat查看http为短连接还是长连接?
  13. COSClient上传图片失败
  14. 离散数学——命题逻辑
  15. Python最优化算法学习笔记(Gurobi)
  16. mysql sdo geometry_SDO_Geometry说明
  17. Linux运维实用命令
  18. 感谢爬虫软件,建立网络空间耻辱柱
  19. ie6下png阴影问题的解决方案
  20. 2014年的那些碎碎念。

热门文章

  1. 哪个内存更快?Heap或ByteBuffer或Direct?
  2. JUnit与EasyMock合作
  3. Cajo,用Java完成分布式计算的最简单方法
  4. python语句join_Python中的join()函数的用法
  5. QPW 系统管理后台用户表(tm_user_info)
  6. Windows 使用命令执行 sql 脚本文件
  7. MAC启动redis的目录
  8. pip安装mysql模块_使用pip安装mysql模块for python
  9. 科大讯飞 jason word_2019科大讯飞全球1024开发者节开幕啦
  10. hmailserver mysql密码_第二步:点晴MIS系统Email模块hMailServer数据库连接配置指引