赞
踩
在面向对象中,为了坐到让程序对事物的描述与事物在现实中的形态保持一致,面向对象思想中提出了两个概念,即类和对象。在Java程序中类和对象是最基本、最重要的单元。类表示某些群体的一些基本特征抽象,对象表示一个个具体的事物。
例如,在现实生活中,学生可以表示一个类,而一名具体的学生,就可以称为对象。这名具体的学生会有自己的姓名和年龄等信息,这些信息在面向对象的概念中称为属性;学生可以看书和打球,而看书和打篮球这些行为在类中就称为方法。类与对象的关系如图3-1所示。
在图3-1中,学生可以看做是一个类;小明、李华、大军都是学生类型的对象。类用于描述多个对象的共同特征,它是对象的模板。对象用于描述现实中的个体,它是类的实例。对象是根据类创建的,一个类可以对应多个对象。
在面向对象的思想中最核心的就是对象,而创建对象的前提是需要定义一个类,类时Java中一个重要的引用数据类型,也是组成Java程序的基本要素,所有的Java程序都是基于类的。
类是对象的抽象,用于描述一组对象的共同特征和行为。类中可以定义成员变量和成员方法,其中,成员变量也被称为对象的属性;成员方法用于描述对象的行为,可简称为方法。
类的定义格式如下:
- class 类名{
- 成员变量;
- 成员方法;
- }
根据上述格式定义一个学生类,成员变量包括姓名(name)、年龄(age)、性别(sex);成员方法包括读书(read)。学生类定义的示例代码如下:
- class student{
- string name;
- int age;
- string sex;
- void read(){
- system.out.println("大家好,我是"+ name +",我在看书!");
- }
- }
上面代码中定义了一个学生类。其中,student是类名,name、age、sex是成员变量,read()是成员方法。在成员方法read()中可以直接访问成员变量name。
在Java中,定义在类中的变量称为成员变量,定义在方法中的变量称为局部变量。如果在某一个方法中定义的局部变量与成员变量同名,这种情况是允许的,此时,在方法中通过变量名访问到的是局部变量,而并非成员变量,请阅读下面的代码示例:
- class student{
- int age =30;
- void read(){
- int age =50;
- system.out.println("大家好,我"+ age +"岁了,我在看书!");
- }
- }
上述代码中,在student类的read()方法中有一条打印语句,访问了变量age,此时访问的是局部变量age,也就是说当另有一个程序调用read()方法时,输出的age值为50,而不是30。
在1.1.1节中定义看一个student类,要想使用一个类则必须要有对象。在Java程序中可以使用new关键字创建对象,具体格式如下:
- 类名 对象名称 = null;
- 对象名称 = new 类名();
上述格式中,创建对象分为声明对象和实例化对象两步,也可以直接通过下面的方式创建对象,具体格式如下:
类名 对象名称 = new 类名();
例如,创建student类的实例对象,实例代码如下:
student stu = new student();
上述代码中,new student()用于创建student类的实例对象,student stu则是声明了一个student类型的变量stu。运算符“=”将新窗口的student对象地址赋值给变量stu,变量stu引用的对象简称为stu对象。
了解了对象的创建之后,就可以使用类创建对象了,实例代码如下:
- class student{
- string name;
- void read (){
- system.out.println("大家好,我是"+ name +",我在看书!");
- }
- }
- public class test{
- public static void main (string[] args[] ){
- student stu = new student();
- }
- }
上述代码在main()方法中实例化了一个student对象,对象名称为stu。使用new关键字创建的对象在堆内存空间。stu对象的内存分配如图3-2所示。
从图3-2中可以看出,对象名称stu保存在栈内存中,而对象的属性信息则宝次年在对应的堆内存中。
创建student对象后,可以使用对象访问类中的某个属性或方法,对象属性和方法的访问通过"."运算符实现,具体格式如下:
对象名称.属性名
对象名称.方法名
下面通过一个案例学习对象属性和方法的访问 ,如文件3-1所示
- //文件3-1 Example.Java
- class Student {
- String name; //声明姓名属性
- void read(){
- System.out.println("大家好,我是"+ name);
- }
- }
- class Example01{
- public static void main (String [] ages){
- Student stu1 = new Student (); //创建第一个Student对象
- Student stu2 = new Student(); //创建第二个Student对象
- stu1.name = "小明"; //为stu1对象的name属性
- stu1.read(); //调用对象的方法
- stu2.name ="小华";
- stu2 .read();
-
- }
- }
文件3-1运行结果如图所示:
在文件3-1中,第2~5行代码声明了一个String类型的name属性和一个read()方法,第9~10行代码创建了stu1对象和stu2对象;第11行代码为stu1对象name属性赋值;第12行代码通过stu1对象调用read()方法;第13行代码为stu2对象name属性赋值;第14行代码通过stu2对象调用read()方法。
从文件3-1所示的运行结果可以看出,stu1对象和stu2对象在调用read()方法时,打印的name值不相同。这是因为stu1和stu2 对象是两个完全独立的个体,它们分别拥有各自的name属性,对stu1对象的name属性赋值并不会影响到stu2对象name属性的值。为stu1对象和stu2对象中的属性赋值后,stu1对象stu2对象的内存变化如图3-4所示。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。