java 类与对象

目录

1 对象

1.1 身边的对象

 

1.2对象的属性和方法

1.3 封装

2  类

2.1 类和对象的关系

2.2 类是对象的类型

3 Java是面向对象的语言

3.1 Java 的类模板

3.2 如何定义类

1.定义类名

2. 编写类的属性

3. 编写类的方法

3.3 如何创建和使用对象

3.4 综合示例

3.5 面向对象的优点


1 对象


世界是由什么组成的?化学家可能会说:"世界是由分子、原子、离子等这些化学物质组成的"。画家可能会说:"世界是由不同的颜色组成的"。不同的人会有不同的回答。但如果你是一个分类学家,你会说:"这个世界是由不同类别的事物组成的",如图11.1所示。

图11.1世界的组成

其实,这个问题本身就比较抽象,物以类聚,所以可以说世界是由不同类别的事物构成的,如图11.1所示,世界由动物、植物、物品、人和名胜等组成。动物可以分为脊椎动物和无脊椎动物。脊椎动物又可以分为哺乳类、鱼类、爬行类、鸟类和两栖类。爬行类又可以分为有足类和无足类……就这样可以继续分下去。当提到某一个分类时,就可以找到属于该分类的一个具体的事物。例如,乌龟就属于爬行类中的有足类,眼镜蛇就属于爬行类中的无足类。当我们提到这些具体动物时,会在脑海浮现出它们的形象。这些现实世界中客观存在的事物就称为对象。在Java的世界中,"万物皆对象"。

学习面向对象编程,我们要站在分类学家的角度去思考问题。根据要解决的问题,对事物进行分类。

说明:分类是人们认识世界的一个很自然的过程,人们在日常生活中会不自觉地进行分类。例如,我们可以将垃圾分为可回收的和不可回收的,将交通工具分为车、船、飞机等。分类就是以事物的性质、特点、用途等作为区分的标准,将符合同一标准的事物归为一类,不同的则分开。例如,上文对动物的分类中,根据动物有无脊椎可分为脊椎动物和无脊椎动物;如果根据动物是水生还是陆生,又可分为水生动物和陆生动物。因此,在实际应用中,我们要根据待解决问题的需要,选择合适的标准或角度对问题中出现的事物进行分类。

1.1 身边的对象

现实世界中客观存在的任何事物都可以被看做对象。对象可以是有形的,如一辆汽车;它也可以是无形的,如一项计划。因此对象无处不在。

Java是一种面向对象的编程语言(Object Oriented Programming Language,OOPL),因此我们要学会用面向对象的思想考虑问题和编写程序。在面向对象中,对象是用来描述客观事物的一个实体。用面向对象的方法解决问题时,首先要对现实世界中的对象进行分析与归纳,找出哪些对象与要解决的问题是相关的。


下面以商场中的两个对象为例,分析我们身边的对象,如图11.2所示。张浩在超市购物后要刷卡结账,收银员李明负责收款并打印账单。在这个问题中,张浩和李明就是我们所关心的对象。下面选择一个角度对他们分类,如两人的角色不同,张浩是顾客,而李明是收银员,因此可以说,张浩是 "顾客" 对象,而李明是 "收银员" 对象。

图11.2  顾客 对象和 收银员 对象

既然他们都是对象,那么如何区分呢?其实每一个对象都有自己的特征,包括静态特征和动态特征。静态特征是可以用某些数据来描述的特征,如人的姓名、年龄等。动态特征是对象所表现的行为或对象所具有的功能,如购物、收款等。根据上面的例子,可以得到表11-1

 

1.2对象的属性和方法

通过超市购物的例子可以看到,正是因为对象拥有了这些静态特征和动态特征,才使得他们与众不同。在面向对象的编程思想中,把对象的静态特征和动态特征分别称为对象的属性和方法,它们是构成对象的两个主要因素。其中属性用来描述对象静态特征的一个数据项,该数据项的值即属性值。例如,上面例子中,"顾客" 对象有一个属性是姓名,属性值是张浩。而方法用来描述对象动态特征(行为)的一个动作序列。例如,"收银员"对象的行为有收款和打印账单,这些都是对象的方法。

在编程中,对象的属性被存储在一些变量里,如可以将"姓名"存储在一个字符串类型的变量中,将"员工号"存储在一个整型变量中。对象的行为则通过定义方法来实现,如"收款"、"打印"、"账单"都可以定义为一个方法。

解释:对象用来描述客观事物的一个实体,由一组属性和方法构成

1.3 封装

封装(Encapsulation)就是把一个事物包装起来,并尽可能隐藏内部细节

图11.3中是一辆法拉利跑车。这辆车在组装前是一堆零散的部件,如发动机、方向盘等,仅靠这些部件是不能发动车的。当把这些部件组装完成后,它才具有发动的功能。显然,这辆法拉利跑车是一个对象,而零部件就是该对象的属性,发动、加速、刹车等行为就是该对象所具有的方法。通过上面的分析可以看到,对象的属性和方法是相辅相成,不可分割的,它们共同组成了实体对象。因此,对象具有封装性

 

 

图 11.3 法拉利跑车



2  类

上文提到了一位顾客"张浩",但在现实世界中有很多顾客,张三、李四、王五等。因此,"张浩"只是顾客这一类人中的一个实例。又如,图11.3的"法拉利跑车"是一个对象,但现实世界中还有奔驰、保时捷、凯迪拉克等车,因此这辆"法拉利跑车"只是车这一类别中的一个实例。不论哪种车,都有一些共同的属性,如品牌、颜色等,也有一些共同的行为,如发动、加速、刹车等,在这里将这些共同的属性和行为组织到一个单元中,就得到了

类定义了对象将会拥有的特征(属性)和行为(方法)。

类的属性:对象所拥有的静态特征在类中表示时称为类的属性。例如,所有顾客都有姓名,因此姓名可以称为"顾客类"的属性,只是不同对象的这一属性值不同,如顾客张三和顾客李四的姓名不同。

类的方法:对象执行的操作称为类的方法。例如,所有顾客都有购物行为,因此购物就是"顾客类"的一个方法。

2.1 类和对象的关系

了解了类和对象的概念,你会发现它们之间既有区别又有联系。例如,图11.4所示为用模具制作球状冰淇淋的过程。

 

图 11.4 制作球状冰淇淋

制作球状冰淇淋的模具是类,它定义了如下信息(属性)。

  • 球的半径。
  • 冰淇淋的口味。

使用这个模具做出来的不同大小和口味的冰淇淋是对象。在Java面向对象编程中,就用这个类创建出类的一个实例,即创建类的一个对象。

因此,类与对象的关系就如同模具和用这个模具制作出的物品之间的关系。一个类为它的全部对象给出了一个统一的定义,而它的每个对象则是符合这种定义的一个实体。因此类和对象的关系就是抽象具体的关系类是多个对象进行综合抽象的结果,是实体对象的概念模型,而一个对象是一个类的实例。图11.5展示了在现实世界、大脑中的概念世界和程序运行的计算机世界中类和对象的关系。

 

图11.5现实世界、概念世界和计算机世界中的类与对象

在现实世界中,有一个个具体的"实体"。以超市为例,在超市中有很多顾客,张三、李四、王五等,而"顾客"这个角色就是在我们大脑的"概念世界"中形成的"抽象概念"。当需要把顾客这一"抽象概念"定义到计算机中时,就形成了"计算机世界"中的"类",即上面所讲的类。而用类创建的一个实例就是"对象",它和"现实世界"中的"实体"是一一对应的。

2.2 类是对象的类型

到目前为止,我们已经学习了很多数据类型,如整型(int)双精度浮点型(double)字符型(char)等。这些都是Java语言已经定义好的类型,编程时只需要用这些类型声明变量即可。

那么,如果想描述顾客"张浩",他的数据类型是什么呢?是字符型还是字符串型?其实都不是。"张浩"的类型就是"顾客",也就是说,是对象的类型

事实上,定义类就是抽取同类实体的共性自定义的一种数据类型。例如,"顾客"类、"人"类、"动物"类等。

3 Java是面向对象的语言

在面向对象程序设计中,类是程序的基本单元。Java是完全面向对象的编程语言,所有程序都是以类为组织单元的。回想自己写过的每一个程序,基本框架是不是都如示例1所示的结构。

示例1

public class HelloWorld {
   
public static void main(String[] args) {
       
System.out.println("Hello World!!!");
    }
}

分析示例1 ,程序框架最外层的作用就是定义了一个类HelloWorld,第1章曾提到HelloWorld是一个类名,原因就在此。

3.1 Java 的类模板

学习了类、对象的相关知识,那么如何在Java中描述它们呢?

Java中的类将现实世界中的概念模拟到计算机中,因此需要在类中描述类所具有的属性和方法。Java的类模板如下所示。

语法

public class <类名>{

//定义属性部分

属性 1 的类型属性 1;

属性 2 的类型属性 2;

……

属性 3 的类型属性 3;

//定义方法部分

方法 1;

方法 2;

……

方法 n;

}

在Java中要创建一个类,需要使用一个class、一个类名和一对大括号。

其中,class创建类的关键字。在class前有一个public,表示"公有"的意思。编写程序时,要注意编码规范,不要漏写public。在class关键字的后面要给定义的类命名,然后写上一对大括号,类的主体部分就写在{}中。类似于给变量命名,类的命名也要遵循一定的规则。

  • 不能使用Java中的关键字。
  • 不能包含任何嵌入的空格或点号 "." ,以及除下划线 "_"、字符 "$" 外的特殊字符。
  • 不能以数字开头。

规范:

  • 类名通常由多个单词组成,每个单词的首字母大写。
  • 另外,类名应该简洁而有意义,尽量使用完整单词,避免使用缩写词,除非该缩写词已被广泛使用,如HTML、HTTP、IP等。

3.2 如何定义类

类定义了对象将会拥有的属性和方法。定义一个类的步骤如下。

1.定义类名

通过定义类名,得到程序最外层的框架。

语法

public class 类名{

}

2. 编写类的属性

通过在类的主体中定义变量来描述类所具有的静态特征(属性),这些变量称为类的成员变量。

3. 编写类的方法

通过在类中定义方法来描述类所具有的行为,这些方法称为类的成员方法。

知道了定义一个类的步骤,下面看一个具体例子。

问题:在不同的北大青鸟培训中心(北京中心、杭州中心等),学员们会感觉到相同的教学环境和教学氛围,用类的思想输出培训中心的信息。


分析:在定义类之前,首先要从问题中找出对象和类,进而分析它所具有的属性和方法。一般利用问题描述中的名词和名词短语来识别对象和类。例如,用特指名词(张浩、我的家、第六次比赛)识别对象,用复数名词(人们、顾客、开发商)及泛指名词(每一个人、不同的教员、一台计算机)识别类。对上面的问题,北京中心和杭州中心是特指名词,这样得到两个对象;不同的北大青鸟培训中心是泛指名词,可以抽象成类。对于每个中心,都具有“中心名称”、“教室数目”和“机房数目”,它们所具有的行为都有“展示本中心的信息”。通过上面的分析,抽象出了这个类的(部分)属性和行为,如图11.6所示,下一步就可以定义类了。根据定义类的步骤,编写代码,如示例2所示。

school类

属性:

中心名称

教室数量

机房数目

方法:

展示中心信息

图11.6 School类的属性和方法

示例2

public class School {
   
String schoolName;            //中心名称
    int classNumber;              //教室数目
    int labNumber;                //机房数目

  

 //定义北大青鸟中心的方法
   
public void showCenter() {
       
System.out.println(schoolName + "培训中心\n" + "配备: " +
               
classNumber + "" + labNumber + "");
    }
}

示例2定义了一个School类,并且定义了三个成员变量:schoolName、classNumber、labNumber。另外,定义了一个类的方法,方法名是showCenter()。这个方法的作用是显示中心的信息,即中心名称及教室和机房的配置情况。第12章将详细讲解如何编写类的方法,这里只对showCenter))方法进行简单说明,该方法代码如下。

public String showCenter() {
   
//方法体  
}

编写showCenter()方法时,大家只需要在 "方法体" 部分写出自己要实现的功能即可,showCenter是方法名。在Java中,一个简单方法的框架如下所示。

语法

访问修饰符 返回值类型 方法名(){

//方法体

}

访问修饰符限制了访问该方法的范围,如public,还有其他的访问修饰符,会在以后学习。返回值类型是方法执行后返回结果的类型,这个类型可以是基本类型,或者是引用类型,也可以没有返回值,此时必须使用void来描述。方法名一般使用一个有意义的名字描述该方法的作用,其命名应符合标识符的命名规则。

说明

这里介绍一下Camel(骆驼)命名法和Pascal (帕斯卡)命名法。

  • 骆驼命名法:方法或变量名的第一个单词的首字母小写,后面每个单词的首字母大写,如 showCenter、userName 等。
  • 帕斯卡命名法:每一个单词的首字母都大写,如类名School等。在Java中,定义类的属性和方法使用骆驼命名法,定义类使用帕斯卡命名法。

3.3 如何创建和使用对象

定义好了 School类,下面就可以根据定义的模板创建对象了。类的作用就是创建对象。由类生成对象,称为类的实例化过程。一个实例也就是一个对象,一个类可以生成多个对象。创建对象的语法如下。

语法

类名 对象名 = new 类名() ;

在创建类的对象时,需要使用Java的new关键字。例如,创建School类的一个对象。

School center = new School()

center对象的类型就是School类型。使用new创建对象时,我们并没有给它的数据成员赋一个特定的值。考虑到每个对象的属性值可能是不一样的,所以在创建对象后再给它的数据成员赋值。

在Java中,要引用对象的属性和方法,需要使用操作符。其中,对象名在圆点的左边,属性或方法的名称在圆点的右边。

语法

对象名.属性       //引用对象的属性

对象名.方法名()   //引用对象的方法

例如,创建School类的对象center后,就可以给对象的属性赋值或调用方法,代码如下。

center .name  ="北京中心;  //给 name 属性赋值

center. showCenter () ;  //调用  showCenter () 方法

掌握了如何创建类的对象,下面就来解决11.3.2节中的问题。

示例3

public class InitialSchool {
  
public static void main(String[] args) {
      School center =
new School();
      System.out.println(
"***初始化成员变量前***");
      center.showCenter();
      center.schoolName =
"北京中心";       //schoolName属性赋值
     
center.classNumber = 10;         //classNumber属性赋值
     
center.labNumber = 10;          //labNumber属性赋值
     
System.out.println("\n***初始化成员变量后***");
      center.showCenter();
   }
}

程序运行结果如图11.7所示。


下面分析示例3的代码。这里新创建了 Initialschool类,用它来测试School类。大家知道,执行程序需要一个入口。因此,像以前编写过的程序一样,在main()方法中编写代码来使用School类。

图11.7示例3的运行结果

说明:main()方法是程序的入口,可以出现在任何一个类中,但要保证一个Java类中只有一个main()方法。因此,我们可以将main()方法写在School类中。但这里,我们将main()方法放在了 Initialschool类中,目的是使不同的类实现不同的功能。

在示例3的main()中,有以下三点需要大家注意。

  • 使用关键字new创建类的对象 "center"。

School center = new School();

  • 使用操作符访问类的属性。

center.schoolName = "北京中心";    //schoolName属性赋值
center.classNumber = 10;           //classNumber属性赋值
center.labNumber = 10;             //labNumber属性赋值

  • 使用操作符访问类的方法。

center.showCenter();

下面分析运行结果。showCenter()方法返回一个字符串,由图11.7可知,在没有初始化成员变量时,String类型的schoolName变量的值为null (空),而两个整型变量classNumber和labNumber的值是0。为什么呢?这是因为在定义类时,如果没有给属性赋初始值,Java会给它一个默认值,如表11一2所示。

 

提示:


在Idea中使用操作符引用类的属性和方法时,发现Idea会弹出一个下拉菜单,如图11.8所示,其中列出了所有的属性和方法。用户只需要选择想要引用的选项就可以了,这是Idea给用户提供的便捷。

图11.8自动提示

3.4 综合示例

前面定义了 School类,下面学习如何定义学员类和教员类。

问题:

  • 编写学员类,输出学员相关信息,如图11.9所示。
  • 编写教员类,输出教员相关信息,如图11.10所示。

图11.9输出学员信息                     图11.10输出教员信息

分析:

  • 由图11.9可知,学员类包含的属性有姓名、年龄、班级、爱好;包含的方法为显示个人信息,如示例4所示。

  • 由图11.10可知,教员类包含的属性有姓名、专业方向、教授课程、教龄;包含的方法为显示个人信息,如示例5所示。

示例4

学员类:

public class Student {
   
String name;   //姓名
   
int age;      //年龄
   
String classNo;    //班级
   
String hobby//爱好

   
public void show(){
       
System.out.println(name + "\n年龄:" + age + "\n就读于:" +
               
classNo + "\n爱好:" + hobby);
    }
}

输出学员信息:

public class InitialStudent {
   
public static void main(String args[]){
       
Student student = new Student();   //创建对象
       
student.name = "张浩";            //给各个属性赋值
       
student.age = 10;
       
student.classNo = "S1";
       
student.hobby = "篮球";
       
student.show();                   //调用方法
   
}
}

示例5

教员类

public class Teacher {
   
String name;   //姓名
   
String major//专业方向
   
String courses;    //教授课程
   
int schoolAge; //教龄

   
//输出信息方法
   
public void show(){
       
System.out.println(name + "\n专业方向:" + major +
               
"\n教授课程:" + courses + "\n教龄:" + schoolAge);
    }
}

输出教员信息:

public class InitialTeacher {
   
public static void main(String[] args) {
       
Teacher teacher = new Teacher();   //创建对象
       
teacher.name = "王老师";           //给各个属性赋值
       
teacher.major = "计算机";
       
teacher.courses = "使用Java语言理解程序逻辑";
       
teacher.schoolAge = 5;
       
teacher.show();                   //调用方法
   
}
}

下面通过另外一个例子,巩固类的使用。

问题:一个景区根据游人的年龄收取不同价格的门票,其中大于60岁或小于18岁的免费,18〜60岁的20元。请编写游人(Visitor)类,根据年龄段决定能够购买的门票价格并输出。用户输入n则退出程序。

分析:首先要找出与要解决问题有关的对象并抽象出类。很明显,根据要解决的问题,可以得到游人类,该类可以有姓名和年龄两个属性。让用户输入年龄,利用选择结构解决,如示例6所示。

示例6

游人类:

package cn.jbit.dlc1;
import java.util.Scanner;
public class Visitor {
   
String name;   //姓名
   
int age;      //年龄
   
public void show(){
       
Scanner input = new Scanner(System.in);
       
while(!"n".equals(name)){
           
if(age>=18 && age<=60){       //判断年龄
               
System.out.println(name + "的年龄为:" + age +
                       
",门票价格为:20\n" );
            }
else{
               
System.out.println(name + "的年龄为:" + age + ",门票免费\n");
            }
           
System.out.print("请输入姓名:");
           
name = input.next();         //name属性赋值
           
if(!"n".equals(name)){
               
System.out.print("请输入年龄:");
               
age = input.nextInt();       //age属性赋值
           
}
        }
       
System.out.print("退出程序");
    }
}

输出门票信息:

package cn.jbit.dlc1;
import java.util.Scanner;
public class InitialVistor {
   
public static void main(String[] args) {
       
Scanner input = new Scanner(System.in);
       
Visitor v = new Visitor();    //创建对象
       
System.out.print("请输入姓名:");
       
v.name = input.next();       //name属性赋值
       
System.out.print("请输入年龄:");
       
v.age = input.nextInt();      //age属性赋值
       
v.show();                       //调用显示信息方法
   
}
}

示例6的运行结果如图11.11所示。


为了程序演示的方便,示例6中的代码使用了循环,当ffl户输入n时退出程序。这里主要注意代码中使用new关键字创建对象及给属性赋值两个部分。

图11.11示例6的运行结果

3.5 面向对象的优点

了解了类和对象,也学习了如何定义类、创建对象和使用对象,下面总结面向对象的优点,具体如下。

  • 与人类的思维习惯一致:面向对象的思维方式从人类考虑问题的角度出发,把人类解决问题的思维过程转变为程序能够理解的过程。面向对象程序设计能够让我们使用"类"来模拟现实世界中的抽象概念,用"对象"来模拟现实世界中的实体,从而用计算机解决现实问题。

  • 信息隐藏,提高了程序的可维护性和安全性:封装实现了模块化和信息隐藏,即将类的属性和行为封装在类中,这保证了对它们的修改不会影响到其他对象,有利于维护。同时,封装使得在对象外部不能随意访问对象的属性和方法,避免了外部错误对它的影响,提高了安全性。

  • 提高了程序的可重用性:一个类可以创建多个对象实例,增加了重用性。

面向对象程序设计还有其他优点,在以后的学习中会慢慢介绍。相信通过不断实践,学员的理解会不断加深。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值