第3章 面向对象(上)_第1页
第3章 面向对象(上)_第2页
第3章 面向对象(上)_第3页
第3章 面向对象(上)_第4页
第3章 面向对象(上)_第5页
已阅读5页,还剩96页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第3章面向对象(上)《Java基础案例教程》(第3版)学习目标/Target了解面向对象的相关概念,能够简述面向对象、对象和类的概念以及它们之间的关系熟悉面向对象的特性,能够简述面向对象的三大特性掌握对象的引用传递,能够简述对象引用传递的概念和机制了解为什么要封装,能够简述封装的概念和没有进行封装可能出现的问题学习目标/Target掌握访问控制,能够简述4种访问修饰符的访问权限掌握封装的实现,能够正确设置属性的访问权限,并能使用getter方法和setter方法为属性提供公共访问接口掌握类的定义,能够自定义Java类掌握对象的创建与使用,能够创建对象、访问对象的属性和方法学习目标/Target掌握构造方法的使用,能够定义构造方法,并简述构造方法重载的机制掌握static关键字的应用,能够简述static关键字的作用,并能够定义和使用静态变量、静态方法和静态代码块掌握this关键字的应用,能够简述this关键字的作用,并能使用this关键字访问成员变量、成员方法和构造方法章节概述/

Summary在软件开发领域中,面向对象程序设计(Object-OrientedProgramming,OOP)一直占据着重要的地位,Java被广泛认可为一种完全意义上的面向对象编程语言。因此,了解面向对象的编程思想对于学习Java开发至关重要。本章将对面向对象的相关知识进行讲解。目录/Contents0102面向对象概述类与对象0304封装构造方法05static关键字面向对象概述3.13.1面向对象概述常见的程序设计模型分为面向过程和面向对象两种,面向过程关注的是解决问题的步骤和流程,将问题拆解为一系列的函数或模块进行处理,强调编程的逻辑流程和函数的调用。面向对象则是把构成问题的事物按照一定规则划分为多个独立的对象,通过对象之间的交互和协作来解决问题。相比于面向过程,面向对象降低了代码的耦合性、使程序易于维护和重用。了解面向对象的相关概念,能够简述面向对象、对象和类的概念以及它们之间的关系3.1.1面向对象相关概念

先定一个小目标!3.1.1面向对象相关概念213面向对象将现实世界中的事物抽象为对象,每个对象都有自己的特征和行为,通过不同对象之间的交互来完成复杂任务。提供了更高模块化能力和可维护性。面向对象的思想对象是具体而实际的,具有特征和行为的实体,世间万物皆可为对象。对象通过封装将特征和行为捆绑在一起,并对外隐藏实现细节。对象类是描述对象的特征和行为的模板,它可以看作是对象的抽象。对象是类的具体化。类为对象的特征和行为提供了统一的定义和结构,使他们可以按相同方式进行交互。类熟悉面向对象的特性,能够简述面向对象的三大特性3.1.2面向对象的特性

先定一个小目标!3.1.2面向对象的特性在软件设计过程中,随着需求的不断变化和程序复杂度的不断提高,面向对象为了能更有效地组织和管理代码,引入了三大关键特性—封装、继承和多态。3.1.2面向对象的特性1.封装封装是指将对象的特征和行为封装起来,形成一个独立的对象,并向用户暴露操作对象的方法,而不要求用户知道对象内部的具体实现。这种方式避免了外部对对象直接进行修改,从而提高了程序的安全性和可维护性。例如,将一辆汽车看作一个对象。司机在开车时只需要知道如何启动、加速、刹车等,不需要了解汽车的内部是如何实现这些功能的。这样可以防止司机随意调整汽车内部的零件,从而保证了汽车的安全性。3.1.2面向对象的特性2.继承继承是描述类之间关系的一个重要概念,它允许一个类不需要写任何属性和方法就可以拥有另一个类的属性和方法,这种类关系中,前者称为子类,后者称为父类。子类除了可以直接使用继承自父类的属性和方法,还可以添加自己的特有属性和方法,或者重写父类的方法来实现自己的功能。例如,如果有一个交通工具类作为父类,可以派生出“汽车”类和“轮船”类等作为子类。这意味着汽车和轮船都是交通工具,它们继承了交通工具类的共同特征和行为,同时还拥有自己特有的特征和行为。3.1.2面向对象的特性3.多态多态是指同一操作作用于不同的对象,可以产生不同的行为。多态主要基于继承和重写实现,当父类拥有的属性和方法被多个子类继承后,子类根据自身的情况对继承自父类的方法进行重写,可以表现出不同的行为。例如,同为人类的理发师和演员,当需要执行cut操作时,理发师的行为是剪发,演员的行为是停止表演等。不同的对象,所表现的行为是不一样的。多态的特性提高了代码的灵活性和可替换性,使得编程人员可以更加方便地进行代码的优化和扩展。类与对象3.23.2类与对象通过3.1节的学习,我们已经初步了解了面向对象编程的核心概念—类与对象,它们在Java程序中扮演着至关重要的角色。本节将详细讲解Java中的类与对象。3.2.1类的定义掌握类的定义,能够自定义Java类

先定一个小目标!3.2.1类的定义类的成员主要包括成员变量和成员方法。通常将成员变量称为属性,用于描述类的特性。成员方法用于描述类的行为。在类中可以根据实际需求定义任意数量(包括0个)的成员变量和成员方法。定义类的格式:[修饰符]class类名{//成员变量[修饰符]数据类型变量名;//成员方法[修饰符]返回类型方法名([参数列表]){}}3.2.1类的定义案例演示下面根据定义类的语法格式定义一个学生类。Student.java源代码3.2.2对象的创建与使用掌握对象的创建与使用,能够创建对象、访问对象的属性和方法

先定一个小目标!3.2.2对象的创建与使用在Java中,创建类的对象就是实例化该类的过程,通过对象可以访问并调用类的成员变量和成员方法,从而完成特定的任务。创建对象的过程主要包括两个步骤:声明对象和实例化对象。3.2.2对象的创建与使用(1)声明对象声明对象是指通过类的名称和合适的变量名称来定义对象的类型和名称。声明对象的语法格式:类名对象名;对象名使用符合Java标识符的命名规范的名称定义即可,一般使用对象代表的实际含义命名3.2.2对象的创建与使用(2)实例化对象对象名=new类名();

对象的引用是指对象所在内存空间的地址值。实例化对象的语法格式如下:实例化对象是指使用关键字new来创建一个对象,并为对象分配内存空间,最后将对象的引用赋值给之前声明的对象名。3.2.2对象的创建与使用Studentstudent=newStudent();除了分开声明对象和进行实例化的方式,还可以在声明对象的同时对其进行实例化。例如:创建Student.java文件中的Student对象。原理解析:Studentstudent表示在栈内存中创建了一个Student对象,名称为student。newStudent()会在堆内存中创建一个对象,该对象中包含多个属性,如果没有手动为这些属性赋初始值,系统会为其分配默认值,同时为Student分配一个地址值。接着把地址值赋给变量student,通过student记录的地址值可以找到该对象。3.2.2对象的创建与使用Student对象在内存中的存储形式。3.2.2对象的创建与使用访问对象的属性和方法。对象名.属性//访问属性对象名.方法名(参数列表)//访问成员方法手动为对象的属性赋值。对象名.属性=属性值;3.2.2对象的创建与使用案例演示为了更好地理解对象的创建与使用,下面通过一个案例创建文件Student.java中的Student类的对象,并为对象的属性赋值,然后调用对象的方法。Example01.java源代码3.2.2对象的创建与使用运行结果如下图所示。3.2.3对象的引用传递掌握对象的引用传递,能够简述对象引用传递的概念和机制

先定一个小目标!3.2.3对象的引用传递在前面关于方法的学习中,传入的参数都是基本数据类型,它实际上传递的是参数的副本或者参数的值,因此在方法内部修改参数的值,并不会影响到原始的值,这种传递方式被称为值传递。3.2.3对象的引用传递而类是引用数据类型,也就是说类的实例对象在内存中的存储空间可以被多个栈内存引用。在方法调用中,当把一个对象作为参数传递给方法时,实际上传递的是对象的引用,也就是对象的内存地址值,这种传递方式被称为对象的引用传递。当在方法内部对引用对象进行修改时,原始对象也会受到影响,因为它们指向同一个内存地址。3.2.3对象的引用传递为了更好地理解对象的引用传递,下面通过一个给员工加薪的案例演示值传递和对象的引用传递的区别。引用传递值传递案例演示Example02.java源代码3.2.3对象的引用传递案例的运行结果如下图所示。案例演示封装3.33.3封装封装是面向对象的三大特性之一,它是保护数据并提供安全操作的关键,深刻理解封装的思想是构建高质量Java程序的基础,本节将详细讲解Java面向对象3.3.1为什么要封装了解为什么要封装,能够简述封装的概念和没有进行封装可能出现的问题

先定一个小目标!3.3.1为什么要封装封装是指隐藏对象的属性和内部操作的实现细节,只对外公开接口,以控制对程序中属性的读取和修改的访问级别。这种通过接口访问数据的方式,可以在不破坏数据完整性的情况下对其进行修改。3.3.1为什么要封装下面通过一个修改银行账户余额的案例,来演示类在没有进行封装的情况下直接修改属性的值会带来的问题。Example03.java源代码案例演示3.3.1为什么要封装案例运行结果如下图所示。案例演示3.3.1为什么要封装分析Example03.java文件中的类没有进行封装存在的问题。案例演示缺乏访问控制导致安全风险。account对象的属性没有显式地添加任何访问控制权限,此时Java会默认为属性设置为default访问权限,表示该属性可以被同一个包内其他类访问,而包外的任何类都不能访问。这种情况下,外部可以直接访问和修改account对象的属性。缺乏验证逻辑。balance属性允许外部直接修改账户余额,这样设计使得外部可以任意篡改账户余额,而不经过合适的验证和控制。3.3.1为什么要封装解决方法:案例演示对成员变量的访问做出限制,不允许外界随意访问,只提供公共方法控制外部对属性的访问。在方法中引入验证和控制逻辑确保账户余额的数值符合要求。3.3.2访问控制掌握访问控制,能够简述四种访问修饰符的访问权限

先定一个小目标!3.3.2访问控制在Java中,访问控制是一种通过访问修饰符来控制类、方法、变量和构造函数的可见性的机制。Java中的访问修饰符有四种,分别是public、protected、default、private。3.3.2访问控制public公共访问修饰符,具有最大的访问权限。用public修饰的类、方法和变量,包内和包外的任何类均可以访问。protectedprivate受保护访问修饰符。用protected修饰的类、方法和变量,包内的任何类以及包外继承了该类的子类可以访问。默认访问修饰符。默认访问权限的类、方法和变量,可以被包内的其他类访问,而包外的任何类都不能对其访问。私有访问修饰符。用private修饰的类、方法和变量,只有本类可以访问,而包内包外的其他类均不能对其访问。default3.3.2访问控制四种访问修饰符的访问范围。访问修饰符同一类中同一包中子类中不同包不同类public√√√√protected√√√–default√√––private√–––3.3.3封装的实现掌握封装的实现,能够正确设置属性的访问权限,并能使用getter方法和setter方法为属性提供公共访问接口

先定一个小目标!3.3.3封装的实现类的封装是指将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象的内部信息,而是通过该类提供的指定方法实现对内部信息的操作和访问。实现类的封装需要进行以下几个操作。(1)成员变量私有化。将类的成员变量声明为私有,即使用private修饰,以限制外部类中对成员的直接访问。3.3.3封装的实现(2)提供公共访问方法。为私有成员变量提供公共的访问方法,通常包括获取成员变量值的getter方法和设置成员变量值的setter方法。getter方法和setter方法定义格式://getter方法public返回类型get变量名(){return变量名;}//setter方法publicvoidset变量名(参数类型参数名){this.变量名=参数名;}3.3.3封装的实现案例演示修改文件Example03,使用private修饰符修饰accountNumber属性和balance属性,并为其提供公共访问方法setter和getter,以此实现类的封装。Example04.java源代码3.3.3封装的实现案例演示案例的运行结果如下图所示。3.3.3封装的实现多学一招:实体JavaBean在面向对象编程中,经常需要定义一种用来表示实体对象的Java类,这种类被称为实体JavaBean,它是数据封装的一个体现。实体JavaBean的主要目的是用来封装和操作数据,通常与数据库中的表或者其他数据源中的记录相对应。3.3.3封装的实现实体JavaBean的特点。类中的成员变量都为私有,并且要对外提供相应的getter方法和setter方法。类中必须有一个公共的无参构造方法。类中可以提供带有参数的构造方法,便于创建对象初始化属性值。根据具体需求,类中可以添加其他方法,例如,重写toString()方法等。在实际开发中,实体JavaBean仅仅用来封装数据,只提供对数据进行存和取的方法,而对数据的其他处理操作交给其他类来完成,以实现数据和数据业务处理的分离。多学一招:实体JavaBean【案例3-1】打印购物小票当顾客在超市购物结账时,收银员会提供一张购物小票,上面会列出顾客购买的商品数量、单价、小计和总计等购物信息,以供顾客核对。本案例要求编写一个模拟打印购物小票的程序,收银员输入顾客购买商品的种类数后,依次输入商品名称、单价和数量。输入完成后打印购物小票,包括商品的名称、单价、数量、小计和总计,小计是指某种商品一共所花金额。案例描述【案例3-1】打印购物小票案例效果构造方法3.43.4构造方法在Java中,每个类都有一种特殊的方法,用于创建和初始化对象,这种方法被称为构造方法,也叫构造器。下面将对Java中的构造方法及相关知识进行讲解。3.4.1定义构造方法掌握定义构造方法,能够在类中定义构造方法

先定一个小目标!3.4.1定义构造方法构造方法的作用:在实例化对象时,为对象的属性赋值。构造方法的定义格式:[访问修饰符]构造方法名([参数列表]){//构造方法体}3.4.1定义构造方法定义构造方法时的注意事项:访问修饰符:访问修饰符可以为Java中四种访问修饰符的任意一个。返回值类型:构造方法没有返回值类型,并且不设置void。构造方法名:构造方法的方法名必须与类名相同。参数列表:可选项,参数列表指定了构造方法接收的参数类型和参数名称。它可以包含0个或任意整数个参数。当参数列表为空时,称之为无参构造方法;当参数列表包含一个或多个参数时,称之为有参构造方法。有参构造方法可以在创建对象的同时初始化对象的属性。3.4.1定义构造方法下面通过一个案例演示Java中构造方法的使用。案例演示Example05.java源代码3.4.1定义构造方法案例的运行结果如下图所示。案例演示3.4.2构造方法的重载掌握构造方法的重载,能够编写重载的构造方法

先定一个小目标!3.4.2构造方法的重载重载的构造方法具有相同的名称但参数列表不同。通过重载构造方法,可以实现在创建对象时使用不同的参数进行初始化。下面通过一个创建不同角色的案例演示构造方法的重载。Example06.java源代码3.4.2构造方法的重载案例的运行结果如下图所示。3.4.3this关键字掌握this关键字的应用,能够简述this关键字的作用,并能使用this关键字访问成员变量、成员方法和构造方法

先定一个小目标!3.4.3this关键字在前面的学习中多次使用到了this关键字。例如,使用在setter方法中设置属性值时就用到了this关键字。this关键字代表当前对象的引用,可以用来访问当前对象的成员变量、成员方法和构造方法。下面详细介绍this关键字在以上三种场景中的使用3.4.3this关键字1.this关键字访问成员变量this关键字访问成员变量的作用:如果方法中存在与成员变量同名的局部变量,在方法中引用变量时,局部变量的作用域会覆盖成员变量,导致无法直接访问成员变量。this关键字可以用于明确指定访问的是成员变量,而不是局部变量。this关键字访问成员变量的格式:this.成员变量;3.4.3this关键字案例演示下面通过一个案例演示this关键字访问成员变量的使用。Example07.java源代码3.4.3this关键字案例演示案例的运行结果如下图所示。3.4.3this关键字2.this关键字调用成员方法this关键字访问成员方法的作用:使用this关键字可以在类的成员方法中调用其他成员方法,以完成一些特定的功能。下面通过一个打印书籍信息的案例演示this关键字调用成员方法。Example08.java源代码3.4.3this关键字2.this关键字调用成员方法案例的运行结果如下图所示。3.4.3this关键字3.this关键字调用构造方法this关键字调用构造方法的作用:当一个类中有多个构造方法时,可以在一个构造方法中使用this关键字调用类中的另一个构造方法,从而避免代码重复。下面通过一个案例演示this关键字调用构造方法。Example09.java源代码3.4.3this关键字3.this关键字调用构造方法案例的运行结果如下图所示。3.4.3this关键字3.this关键字调用构造方法this关键字调用构造方法的注意事项。(1)语法格式:使用this关键字调用构造方法的语法格式为“this(参数)”,不能写成“this.类名(参数)”。(2)调用位置。使用this关键字只能在构造方法中调用其他构造方法,而不能在其他成员方法中通过this关键字调用构造方法。(3)this()语句的出现位置。在构造方法中,this()语句必须放在第一行,且只能出现一次。3.4.3this关键字3.this关键字调用构造方法this关键字调用构造方法的注意事项。(4)互相调用。不能在一个类的两个构造方法中使用this关键字互相调用。例如右边程序的写法是错误的。classStudent{Stringname;Stringage;publicStudent(){

this("张三",18);System.out.println("实例化了一个新的Student对象");}publicStudent(Stringname,intage){this();//调用无参构造方法=name;this.age=age;}}【案例3-2】打怪小游戏案例描述本案例要求以一个英雄和怪兽之间的交战为业务背景,实现一个打怪小游戏的程序。具体规则如下。交战双方为英雄和怪兽,英雄初始血量为500,英雄每次攻击伤害在0~100范围内。怪兽的初始血量为300,怪兽每次攻击在0~150范围内,攻击方的伤害即为被攻击方的掉血量。游戏为回合制的攻击模式,游戏开始时怪兽先攻击英雄,英雄反击,怪兽再攻击,直到怪兽被消灭或者英雄阵亡(即他们的血量小于0或者等于0)为止。英雄和怪兽的属性只有血量。每次攻击完成之后,需要在控制台打印本次攻击结果。例如“英雄攻击怪兽,怪兽掉血70,剩余血量230”,显示的剩余血量为被攻击的一方。交战结束后,控制台打印本次交战结果。例如“怪兽被消灭,英雄获胜”。【案例3-2】打怪小游戏案例效果static关键字3.53.5static关键字在Java中,static关键字的含义是“静态”,它可以修饰类的成员和代码块,被static修饰的成员被称为静态成员,静态成员属于类本身而不属于类的实例,无论创建多少个类的实例,静态成员都只有一份,可以被类的所有实例共享。静态成员在程序启动时加载并存在于内存中,在整个程序的运行期间存在。被static修饰的代码块被称为静态代码块,它在类的初始化时执行,且只会执行一次。3.5.1静态变量掌握静态变量的使用,能够简述什么是静态变量,并在程序中应用静态变量

先定一个小目标!3.5.1静态变量在Java类中,被static关键字修饰的成员变量称为静态变量,也叫类变量。由于静态变量属于类本身,因此可以直接通过类名来访问,而无须创建对象实例。访问静态变量的语法格式:类名.静态变量3.5.1静态变量下面通过一个统计用户创建数量的案例演示静态变量的使用。案例演示Example10.java源代码3.5.1静态变量案例的运行结果如下图所示。案例演示3.5.1静态变量使用静态变量时的注意事项。虽然语法上允许通过“对象.静态变量”的方式来访问静态变量,但出于代码的清晰性和规范性考虑,不建议这样做。如果想在其他类中直接使用类名调用类的静态变量,该变量不能使用private或protected修饰符修饰。static关键字只能修饰类的成员变量而不能修饰局部变量,否则编译器会报错。例如,以下代码是错误的。publicclassStudent{publicvoidstudy(){staticintnum=10;//这行代码是错误的}}3.5.2静态方法

先定一个小目标!掌握静态方法,能够说出静态方法的特点,并在程序中使用静态方法3.5.2静态方法在Java类中,被static关键字修饰的方法称为静态方法,也叫类方法。同样属于类本身,可以直接通过类名来访问。调用静态方法的语法格式:类名.方法名(参数列表)3.5.2静态方法下面通过一个汽车工厂生产汽车的案例演示静态方法的使用。案例演示Example11.java源代码3.5.2静态方法案例的运行结果如下图所示。案例演示3.5.2静态方法使用静态方法时的注意事项。静态方法中只能访问静态成员,而不能访问实例成员;实例方法中既可以访问静态成员,也可以访问实例成员。静态方法中不能使用this关键字和super关键字,super关键字会在后续章节中讲解。静态方法不能被重写,但可以被继承。3.5.3

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论