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編譯器就會自動地重新編譯這個文件。
下節預告
下節我們來了解對象與類地奧秘~
總結
以上是生活随笔為你收集整理的employee.java,Java基础系列(六):对象与类(上)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微店app怎么卖东西(汉典微字的基本解释
- 下一篇: 山东移动如何退订已办业务(山东省人民政府