在本节教程中,我们将学习java对象和类。在面向对象编程技术中,需要设计和使用对象和类的程序。对象是物理和逻辑实体,而类是逻辑实体。
提醒:对于java初学者来说,对象和类是一个十分重要的概念,能否理解和掌握对之后其他java知识有直接影响。所以,虽然本节的内容比较多,但建议认真阅读并理解,最好能结合手动实现本节中的所有示例代码。
具有状态和行为的实体可称为对象(女朋友也可以叫对象)。 椅子,自行车,标记,笔,桌子,汽车等。它可以是物理或逻辑(有形和无形)。 无形对象的例子是银行系统。
一个对象有三个特点:
id
的值对外部用户不可见。 但是,它由jvm内部使用来唯一地标识每个对象。例如: 汽车是一个对象。它的名字是:捷达,颜色是白色等这些就是它的状态(数据值)。它用于跑路,所以跑路就是它的行为。
对象是类的一个实例。 类是创建对象的模板或蓝图。 所以对象是一个类的实例。
对象定义:
类是具有共同属性的一组对象。它是创建对象的模板或蓝图。它是一个逻辑实体。 它不能是物理存在的实体。
java中的类可以包含:
声明一个类的语法:
class <class_name>{
field;
method;
}
实例变量在类内部,但在方法外部定义的变量称为实例变量。 实例变量在编译时不获取内存。 它在运行时获取对象(实例)创建时的内存。 这是为什么,它被称为实例变量。
在java中的方法类似函数,用于暴露对象的行为。
方法的优点
new
关键字用于在运行时分配内存。所有对象在堆内存区域中获取内存。
在这个例子中,我们创建了一个有两个数据成员:id
和name
的student
类。并通过使用new
关键字创建student
类的对象,并打印对象的值。
这里,在类中创建main()
方法。student.java
类文件的代码如下 -
class student {
int id;// field or data member or instance variable
string name;
public static void main(string args[]) {
student s1 = new student();// creating an object of student
system.out.println(s1.id);// accessing member through reference variable
system.out.println(s1.name);
}
}
上面代码执行结果如下 -
0
null
在真实的开发中,我们一般创建类并从另一个类中使用它。这是比上面的在同一个类中更好的方法。 让我们来看一个简单的例子,在另一个类中有main()
方法创建其它类。
在不同的java文件或单个java文件中有多个类。 如果在单个java源文件中定义多个类,则最好使用带有main()
方法的类名作为保存的文件名。下面来看一个名称为 teststudent1.java
的文件中的代码:
class student {
int id;
string name;
}
class teststudent1 {
public static void main(string args[]) {
student s1 = new student();
system.out.println(s1.id);
system.out.println(s1.name);
}
}
执行上面代码,得到以下结果 -
0
null
在java中初始化对象有3
种方式,它们分别如下 -
初始化对象仅仅是将数据初步地存储到对象中。下面来看看一个简单的例子,通过引用变量初始化对象。这里创建一个 teststudent2.java
类文件,代码如下:
class student {
int id;
string name;
}
class teststudent2 {
public static void main(string args[]) {
student s1 = new student();
s1.id = 101;
s1.name = "sonoo";
system.out.println(s1.id + " " + s1.name);// printing members with a
// white space
}
}
上面代码输出结果如下 -
101 sonoo
还可以通过引用变量创建多个对象并存储信息在这些对象。这里创建一个 teststudent3.java
类文件,代码如下:
class student {
int id;
string name;
}
class teststudent3 {
public static void main(string args[]) {
// creating objects
student s1 = new student();
student s2 = new student();
// initializing objects
s1.id = 101;
s1.name = "sonoo";
s2.id = 102;
s2.name = "amit";
// printing data
system.out.println(s1.id + " " + s1.name);
system.out.println(s2.id + " " + s2.name);
}
}
上面代码输出结果如下 -
101 sonoo
102 amit
在本示例中,将创建student
类的两个对象,并通过调用insertrecord
方法来初始化这些对象的值。并通过调用displayinformation()
方法显示对象的状态(数据)。这里创建一个 teststudent4.java
类文件,代码如下:
class student {
int rollno;
string name;
void insertrecord(int r, string n) {
rollno = r;
name = n;
}
void displayinformation() {
system.out.println(rollno + " " + name);
}
}
class teststudent4 {
public static void main(string args[]) {
student s1 = new student();
student s2 = new student();
s1.insertrecord(111, "karan");
s2.insertrecord(222, "aryan");
s1.displayinformation();
s2.displayinformation();
}
}
执行上面代码,得到如下结果 -
111 karan
222 aryan
创建对象的示意如下 -
从上图可以看出,对象在堆内存区域获取内存。 引用变量指的是在堆内存区域中分配的对象。 这里,s1
和s2
都是引用存储器中分配的对象的引用变量。
有关于通过构造函数初始化对象,我们将在后面的java构造函数中学习。
下面我们来看看一个例子,实现维护员工信息的记录。这里创建一个 testemployee.java
类文件,代码如下所示 -
class employee {
int id;
string name;
float salary;
void insert(int i, string n, float s) {
id = i;
name = n;
salary = s;
}
void display() {
system.out.println(id + " " + name + " " + salary);
}
}
public class testemployee {
public static void main(string[] args) {
employee e1 = new employee();
employee e2 = new employee();
employee e3 = new employee();
e1.insert(101, "ajeet", 45000);
e2.insert(102, "irfan", 25000);
e3.insert(103, "nakul", 55000);
e1.display();
e2.display();
e3.display();
}
}
上面代码执行得到结果如下 -
101 ajeet 45000.0
102 irfan 25000.0
103 nakul 55000.0
还有另一个维护rectangle
类记录的例子。这里创建一个 testrectangle1.java
类文件,代码如下所示 -
class rectangle {
int length;
int width;
void insert(int l, int w) {
length = l;
width = w;
}
void calculatearea() {
system.out.println(length * width);
}
}
class testrectangle1 {
public static void main(string args[]) {
rectangle r1 = new rectangle();
rectangle r2 = new rectangle();
r1.insert(11, 5);
r2.insert(3, 15);
r1.calculatearea();
r2.calculatearea();
}
}
上面代码执行得到结果如下 -
55
45
在java中有很多方法可以用来创建对象。它们分别是:
new
关键字newinstance()
方法clone()
方法在接下来的章节中,将学习这些方法用来创建对象。
匿名只是表示没有名。没有引用的对象(也就是不使用实例变量)称为匿名对象。它只能在创建对象时使用。如果只需要使用一个对象,匿名对象是一个很好的方法。 例如:
new calculation();//匿名对象
calculation c = new calculation();// 使用实例变量,所以不是匿名对象
调用方法通过引用:
calculation c = new calculation();
c.fact(5);
通过匿名对象调用方法:
new calculation().fact(5);
下面来看看java中的匿名对象的完整示例。
class calculation {
void fact(int n) {
int fact = 1;
for (int i = 1; i <= n; i++) {
fact = fact * i;
}
system.out.println("factorial is " + fact);
}
public static void main(string args[]) {
new calculation().fact(5);// calling method with anonymous object
}
}
上面代码执行得到结果如下 -
factorial is 120
可以按照一种类型创建多个对象,就像在原始数据类型中的情况中一样。
原始变量的初始化:
int a=10, b=20;
引用变量的初始化:
rectangle r1=new rectangle(), r2=new rectangle();//creating two objects
下面再看看一个例子:
class rectangle {
int length;
int width;
void insert(int l, int w) {
length = l;
width = w;
}
void calculatearea() {
system.out.println(length * width);
}
}
class testrectangle2 {
public static void main(string args[]) {
rectangle r1 = new rectangle(), r2 = new rectangle();// creating two
// objects
r1.insert(11, 5);
r2.insert(3, 15);
r1.calculatearea();
r2.calculatearea();
}
}
上面代码执行得到结果如下 -
55
45
在本节的最后部分,我们来看看一个真实应用中的示例,模拟银行账户转帐的实现。这里创建一个 testaccount.java
类文件,代码如下所示 -
class account {
int acc_no;
string name;
float amount;
void insert(int a, string n, float amt) {
acc_no = a;
name = n;
amount = amt;
}
void deposit(float amt) {
amount = amount + amt;
system.out.println(amt + " deposited");
}
void withdraw(float amt) {
if (amount < amt) {
system.out.println("insufficient balance");
} else {
amount = amount - amt;
system.out.println(amt + " withdrawn");
}
}
void checkbalance() {
system.out.println("balance is: " + amount);
}
void display() {
system.out.println(acc_no + " " + name + " " + amount);
}
}
class testaccount {
public static void main(string[] args) {
account a1 = new account();
a1.insert(832345, "ankit", 1000);
a1.display();
a1.checkbalance();
a1.deposit(40000);
a1.checkbalance();
a1.withdraw(15000);
a1.checkbalance();
}
}
上面代码执行得到结果如下 -
832345 ankit 1000.0
balance is: 1000.0
40000.0 deposited
balance is: 41000.0
15000.0 withdrawn
balance is: 26000.0