对象和类(上)

1. 对象和类(上)

1.1. 面向对象程序设计

1.1.1. 面向过程的结构化程序设计

首先来看一个需求,实现员工信息管理,将员工简历信息中的数据:姓名、性别、年龄、薪水, 存储在信息管理系统中进行操作。可以定义一个输出雇员信息的方法进行数据的输出,传递4个参数,代码如下:

/** 打印员工信息的方法   */
public static void printEmpInfo(String name,int age,
chargender,double salary) {
System.out.println("--------------------");
System.out.println("姓名: " + name);
System.out.println("年龄:" + age);
System.out.println("性别:" + gender);
System.out.println("薪水:" + salary);
}

在Main() 方法中声明雇员信息数据(分别为4个变量), 然后调用如上的输出雇员方法进行数据的输出,当提工资后,再调用输出方法输出,代码如下:

/** 打印雇员信息    */
public  static  void  main  (String[ ]  args ){
      //雇员1
      String emp1Name = "黄河大虾";
int emp1Age = 25;
      char emp1Gender = '男';
double emp1Salary = 8000.00;

      //打印员工信息
printEmpInfo(emp1Name, emp1Age, emp1Gender, emp1Salary);

      //修改员工工资(增长20%)并打印
      emp1Salary *= 120.0 / 100.0;
printEmpInfo(emp1Name, emp1Age,emp1Gender, emp1Salary);
}

如上代码的实现方式即为面向过程的结构化程序设计, 何为面向过程?面向过程是一种以过程为核心的编程思想,即分析出解决问题所需要的步骤,然后使用方法将这些步骤一步一步的实现,使用的时候,在main方法中一个一个依次调用就可以了。

分析如上代码,看看结构化程序的弊端所在,首先,如上代码缺乏对数据的封装,变量emp1Name,emp1Age,emp1Gender,emp1Salary为4个完全独立的变量, 并不是一个整体。其次,数据和方法(对数据的操作)的分离,在打印雇员信息方法中,传递了4个参数,而这4个参数与在main方法中所定义的4个变量并无直接关系。这就是面向过程程序设计的弊端,那如何解决?使用面向对象的程序设计。

1.1.2. 什么是抽象数据类型

面向对象的第一步就是抽象数据类型,所谓抽象数据类型可以理解为:将不同类型的数

据的集合组成个整体用来描述一种新的事物。像如上程序中,可以将姓名、年龄、性别、工资这4个不同类型的数据组成一个整体来描述雇员这个新事物。

1.1.3. 什么是类

类定义了一种抽象数据类型,而类不但定义了抽象数据类型的组成(成员变量),同时还定义了对该类型可以实施的操作(方法)。看如下代码定义了雇员类:

  1. /** 定义雇员类 */
  2. public classEmp{
  3. String name;
  4. int age;
  5. char gender;
  6. double salary;
  7. }

在如上的实例代码中,仅仅定义了Emp类型的组成,即成员变量。该类定义了4个成员变量:String类型的name用于存放名字;int类型的age用于存放年龄;char类型的gender用于存放性别;double类型的salary用于存放工资。

这个时候printEmpInfo()方法的参数也可以进行修改了, 可以将其改为Emp类型(Emp是一种抽象数据类型),这样可以看出是将一个雇员信息当作了一个整体来操作,看如下代码:

  1. public static void printEmpInfo(Emp emp) {
  2. System.out.println("--------------------");
  3. System.out.println("姓名: " + emp.name);
  4. System.out.println("年龄:" + emp.age);
  5. System.out.println("性别:" + emp.gender);
  6. System.out.println("薪水:" + emp.salary);
  7. }

当调用如上方法时,需要传递一个Emp类型的数据,称之为Emp类型的对象。每个Emp类型的对象都包含name、age、gender和salary四个成员,通过“.”的方式进行访问。下面看一下在main ()方法中的调用代码:

  1. public static void main(String[] args) {
  2. Emp emp1 = new Emp(); //使用new关键字创建Emp类型的对象
  3. emp1.name = "黄河大虾";
  4. emp1.age = 25;
  5. emp1.gender = ‘男‘;
  6. emp1.salary = 8000; //为该对象的各个成员变量赋值
  7. printEmpInfo(emp1);
  8. emp1.salary *= 120.0 / 100.0;
  9. printEmpInfo(emp1); //使用该对象调用printEmpInfo方法
  10. }

分析如上几段代码可以看出,定义了Emp类以后,提升了代码的模块化以及代码的重用性,但程序依然存在问题,即:打印信息的方法是只针对Emp数据的操作,属于Emp自身的方法,需要实现数据和方法(对该类数据的操作)的统一,也就是说,可以将打印信息的方法也放在Emp中定义,修改后的完整代码如下所示:

  1. /**进一步修改后的雇员类*/
  2. public classEmp{
  3. String name;
  4. int age;
  5. char gender;
  6. double salary;
  7. /**打印信息的方法*/
  8. public void printInfo() { //定义在类中,可直接对成员变量进行操作
  9. System.out.println("--------------------");
  10. System.out.println("姓名: " + name);
  11. System.out.println("年龄:" + age);
  12. System.out.println("性别:" + gender);
  13. System.out.println("薪水:" + salary);
  14. }
  15. }
  16. /**针对修改后的Emp类的使用方式*/
  17. public class EmpManager {
  18. public static void main(String[] args) {
  19. Emp emp2 = new Emp();
  20. emp2.name = "白发馍女";
  21. emp2.age = 24;
  22. emp2.gender = ‘女‘;
  23. emp2.salary = 6000;
  24. /**调用方法打印信息*/ //创建完Emp对象后,对其成员变量赋值,然后调
  25. emp2.printInfo(); //用其printInfo()方法打印各个成员变量信息
  26. emp2.salary *= 125.0 / 100.0;
  27. emp2.printInfo();
  28. }
  29. }

通过上面的代码,很好的实现了对数据的封装,并且实现了数据与方法的统一。这种方式即为面向对象方式,即:以对象为中心来构建软件系统。

1.2. 定义一个类

1.2.1. 定义类的成员变量

类是一种引用数据类型。类为对象的模板,简单的说就是分类。

类的定义包括“成员变量”的定义和“方法”的定义,其中“成员变量”用于描述一类对象共同的数据结构。在Java语言中,类的成员变量的定义可以使用如下语法:

  1. class 类名 {
  2. 成员变量类型变量名称;
  3. ………
  4. }

定义好类之后,可以创建该类的对象,对象创建之后,其成员变量可以按照默认的方式初始化;对象成员变量的默认初始化值规则如下图 - 5所示:

图- 5

1.2.2. 定义类的方法

类中除了定义成员变量,还可以定义方法,用于描述对象的形为,封装对象的功能。在Java语言中,可以按照如下方式定义类中的方法:

  1. class 类名 {
  2. 返回值类型 方法名称(参数列表) {
  3. 方法体………
  4. }
  5. … … …
  6. }

下面,通过案例对成员方法进行演示,需求:为方块类定义drop()方法如下所示:

  1. class Cell {
  2. int row ; int col ;
  3. /**方块下落的方法*/
  4. public void drop ( ) {
  5. row ++;     //行++,即下落
  6. }
  7. }

调用方法,也和访问成员变量一样,通过“.”符号,代码如下:

  1. /** 创建方块类对象,调用下落方法,并打印效果*/
  2. class TestCell {
  3. public static void main(String args[]){
  4. System.out.println("-------绘制Cell-----");
  5. Cell cell = new Cell();
  6. cell.row = 15;
  7. cell.col = 6;
  8. printCell(cell);
  9. System.out.println("----Cell下落一行----");
  10. //调用drop方法,下落一行
  11. cell.drop();
  12. printCell(cell);
  13. }
  14. }

1.3. 创建并使用对象

1.3.1. 使用new关键字创建对象

类定义完成后,可以使用new关键字来创建对象。new运算的语法为: new 类名();此创建对象的过程也通常称为实例化。

javax.swing.JFrame是JDK提供的一个类,用于封装显示在桌面上的一个窗体。使用new JFrame()可以创建一个窗体对象,如下图 – 1所示:

图- 1

1.3.2. 引用类型变量

为了能够对实例化的对象进行访问控制,需一个特殊的变量,即引用。对引用有两点需要说明:

  1. 引用类型变量可以存储该类对象的地址信息,通常称为“指向该类的对象”,当一个引用类型变量指向该类的对象,就可以通过这个变量对对象实施访问。
  2. 除8种基本类型之外,用类、接口、数组等声明的变量都称为引用类型变量,简称“引用”。

可以看图 – 3,描述了类、对象、引用之间的关系:

图- 3

当创建了引用类型变量之后,就可以通过引用来访问对象的成员变量或调用方法,如下代码所示:

  1. Emp emp = new Emp();
  2. emp.name=“黄河大侠”; //访问对象的成员变量
  3. JFrame frame = new JFrame();
  4. frame.setSize(200,300); //调用方法

1.3.3. 访问对象的成员变量、调用方法

当创建了引用后,即可以通过引用来访问对象的成员变量,以及调用方法。看如下的示例:

  1. Cell c = new Cell();
  2. c.row = 2;
  3. c.col = 3; //访问成员变量
  4. c.drop();
  5. c.moveLeft(2);
  6. String str = c.getCellInfo(); //调用方法

1.3.4. 引用类型变量的赋值

引用类型变量存储的是对象的地址信息, 对引用类型变量的赋值, 除了使用上面的new关键字以外,还可以有另外一种赋值方式, 即:相同类型的引用类型变量之间相互赋值。 需要注意的是:引用类型变量之间的赋值不会创建新的对象,但有可能会使两个以上的引用指向同一个对象。 请看如下代码:

  1. Emp e1 = new Emp();
  2. Emp e2 = e1; //将e1的值(对象的地址信息)赋给e2,e2和e1指向相同的对象。
  3. e1.name =“黄河大虾”;
  4. e2.name = “白发馍女”;
  5. System.out.println(e1.name);

如上代码的输出结果为:白发馍女。因为e1与e2存储的地址相同,也就意味着e1与e2指向了同一个对象,那么对该对象的修改,将会影响所有对该对象的引用。

1.3.5. null和NullPointerException

对于引用类型变量,除了上面的两种赋值方式之外,还可以对其赋值为null。null的含义为“空”,表示还没有指向任何对象。例如:

  1. Emp emp = null; //引用emp中的值为null,没有指向任何对象;
  2. emp = new Emp(); //引用emp指向了一个Emp对象;

需要注意:当一个引用的值为null的时候,如果通过引用访问对象成员变量或者调用方法是不和逻辑的(因其没有指向某对象,自然不会有属性和方法)。此时,会产生NullPointerException(空指针异常)。异常的详细概念后面详细讲。请看下面的代码,将就产生NullPointerException:

  1. JFrame frame = null;
  2. frame.setSize(200,300);
时间: 2024-10-25 19:01:56

对象和类(上)的相关文章

C/C++知识要点6——定义只能在堆/栈上生成对象的类

在C++中,类的对象建立分为两种,一种是静态建立,如A a:另一种是动态建立,如A* ptr=new A: 区别: 静态建立一个类对象,是由编译器为对象在栈空间中分配内存,是通过直接移动栈顶指针,挪出适当的空间,然后在这片内存空间上调用构造函数形成一个栈对象.使用这种方法,直接调用类的构造函数. 动态建立类对象,是使用new运算符将对象建立在堆空间中.这个过程分为两步,第一步是执行operator new()函数,在堆空间中搜索合适的内存并进行分配:第二步是调用构造函数构造对象,初始化这片内存空

[Java学习笔记]-Java对象和类

Java是完全面向对象的高级语言,其基本的操作基本都是针对相应的对象和类.面向对象的程序是由对象组成的,每个对象包含对用户公开的特定功能部分和隐藏的实现部分.对应面向对象的语言,还有一种面向过程的语言,如C语言.面向对象的语言是在面向过程语言的基础上发展而来的.面向对象(OOP,全称为Object-Oriented-Programer,下文简称为OOP)相对于面向过程的语言而言,其优势在于很多问题的解决方法被封装在对象里,有时只需要创建这样的对象就可以解决我们的问题,而不必关心其具体实现细节,这

艾恩ASP无组件上传类(上传组件)说明文档(from www.sysoft.cc)

艾恩ASP无组件上传类(上传组件)说明文档2010-1-18 By Anlige一.简介自从接触ASP就开始接触上传,看过一些上传类,但是总感觉封装的还是不够简单,因此自己尝试写一个能够用最少最简单的代码实现各种上传方式的上传类.在学校期间就开始写,一点点的完善.优化,到现在的版本,现在的版本能适应各种上传方式.上传类的主要的功能如下:1.自由设置最大上传大小.单文件最大上传大小2.自由设置允许上传的文件类型3.可设置文本的编码,以适应各种上传环境4.内置进度条,a用户可选择开启和关闭5.多种错

Swift中文教程(五)--对象和类

原文:Swift中文教程(五)--对象和类 Class 类 在Swift中可以用class关键字后跟类名创建一个类.在类里,一个属性的声明写法同一个常量或变量的声明写法一样,除非这个属性是在类的上下文里面,否则,方法和函数的写法也是这样: 1 class Shape { 2 var numberOfSides = 0 3 func simpleDescription() -> String { 4 return "A shape with \(numberOfSides) sides.&q

.NET 基础 一步步 一幕幕[面向对象之对象和类]

对象和类 本篇正式进入面向对象的知识点简述: 何为对象,佛曰:一花一世界,一木一浮生,一草一天堂,一叶一如来,一砂一极乐,一方一净土,一笑一尘缘,一念一清静.可见"万物皆对象". 对象:包含数据和操作的实体.   面向过程:面向的是完成这件事儿的过程,强调的是完成这件事儿的动作.   举例:把大象塞进冰箱里 1.打开冰箱门 2.把大象塞进去 3.关闭冰箱门 如果我们用面向对象的思想来解决这件事儿,当执行这件事的人的不同的时候,我们需要为每个不同的人量身定做解决事情的方法. 面向对象:找

javascript学习笔记---ECMAScriptECMAScript 对象----定义类或对象

使用预定义对象只是面向对象语言的能力的一部分,它真正强大之处在于能够创建自己专用的类和对象. ECMAScript 拥有很多创建对象或类的方法. 原始的方式 因为对象的属性可以在对象创建后动态定义(后绑定),类似下面的代码: var oCar = new Object; oCar.color = "blue"; oCar.doors = 4; oCar.mpg = 25; oCar.showColor = function() { alert(this.color); };不过这里有一

4.2-全栈Java笔记:对象和类的概念及定义

对象和类的概念 我们人认识世界,其实就是面向对象的.大家眼里都是一个个对象,要不怎么老说搞对象搞对象啊.比如现在让大家认识一下"天使"这个新事物,天使大家没见过吧,怎么样认识呢?最好的办法就是,给你们面前摆4个天使,带翅膀的美女,让大家看,看完以后,即使我不说,大家下一次是不是就都认识天使了. 但是,看完10个天使后,我们总要总结一下,什么样的东东才算天使?天使是无数的,总有没见过的!所以必须总结抽象,便于认识未知事物!总结的过程就是抽象的过程. 小时候,我们学自然数时怎么定义的?像1

使用prototype 对象定义类成员

使用prototype 对象定义类成员上一节介绍了类的实现机制以及构造函数的实现,现在介绍另一种为类添加成员的机制:prototype 对象.当new 一个function 时,该对象的成员将自动赋给所创建的对象,例如:<script language="JavaScript" type="text/javascript"><!--//定义一个只有一个属性prop的类function class1(){this.prop=1;}//使用函数的pro

关于对象、类、属性和方法的理解

文章开头申明:半路出家的野路子,可能个人理解有所欠缺,希望不吝赐教. 在初步学习java的过程中,往往都是绕不开面向对象的思想,说到对象或许挺多初学者和我一样只是听说过一个"万物皆对象"的说法,简单的记下对象包含属性和方法,然而实际使用的过程中往往有忽略这些东西,也就是犯浑了.个人的理解是希望将对象.类.属性和方法用一个例子来简单说明. 打个比方说我到商场买手机这个例子吧.我到了商场买手机,第一步自然就是向售货员提出我的要求:如手机大小.CPU.内存等等(属性),要求能拍照打电话首发短