JAVA(面向对象基础部分).ppt_第1页
JAVA(面向对象基础部分).ppt_第2页
JAVA(面向对象基础部分).ppt_第3页
JAVA(面向对象基础部分).ppt_第4页
JAVA(面向对象基础部分).ppt_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

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

文档简介

第五章 面向对象基础,Java程序设计, ,路 强,Chapter5 面向对象基础,本章学习提示,本章我们主要学习面向对象编程的基本概念。 封装、继承、多态 访问控制符的使用 Static 和 final 的使用,Chapter5 面向对象基础,目 录,Chapter5 面向对象基础,OOP语言,面向对象程序设计(OOP Object-Orienten Programming) 是现今程序设计的主流和流行趋势。在面向对象的程序设计中,将所有事物都作为对象来处理. OOP的基本思想是把人们对现实世界的认识过程应用到程序设计中。现实世界的物体就是对象,它有两个基本特点一个是物体的内部构成,另一个是物体的行为. OOP与现实对象两个基本特点相对应的是数据和方法。 数据表示对象的构成,方法表示对象的行为.,Chapter5 面向对象基础,类的概念,类是对象的“模板”,对象是类的实例. 类与对象之间的关系可以看成是抽象与具体的关系。 其中类是抽象的,对象是具体的 类描述了对象的属性和行为 对象是类的一个实例 在JAVA语言中,所有的东西都是对象,对象就如同是一种新型变量,通过赋值语句对该变量进行性初始化操作. 比如,当设计灯泡的时候要求每一个灯泡都必须具有型号这个属性,同时还要能够进行打开、关闭等操作 因此当把灯泡这些共同的属一生和行为集中起来的时候就抽象出一个灯泡类 每一个具有这些属性和行为的,具体的灯泡就是这个灯泡类的对象或者称为实例,Chapter5 面向对象基础,面向对象的四大特性,抽象 (Abstraction) 封装 (Encapsulation) 继承 (Inheritance) 多态 (Polymorphism),Chapter5 面向对象基础,面向对象的基本特征,封装性: 基本思想: 把客观世界中联系紧密的元素及其相关操作组织在一起,使其相互作用隐藏、封装在内部,而对外部对象只提供单一的功能接口. 目的:将对象的使用者和设计者分开。 类比:汽车的左转、右转;被陶瓷封装的集成芯片,Chapter5 面向对象基础,继承性,继承是OOP中一种由已有的类创建新类的机制。 一个父类(公共属性的集合)可以有多个子类(是父类的特殊化),一个子类只可以有一个父类 子类可以直接使用父类的方法,也可以根据需要修改父类中已经定义的方法(即不改变方法名,而修改方法的参数个数、参数类型)。 父类和子类可有同名的方法(多态性)。,Chapter5 面向对象基础,多态性,定义:由于父类和子类可以有同名的方法,在运行时 JVM根据方法的参数个数和类型的不同来查找、决 定执行哪个版本的方法,称为多态性. 在程序执行时,JVM对对象某一方法的查找是从该对象类所在层次开始,沿类等级逐级向上进行,把第一个方法作为所要执行的方法。所以,子类的方法可以屏蔽父类的方法.,Chapter5 面向对象基础,面向对象程序设计方法,面向对象程序设计方法是: 对象 = (算法 + 数据结构) 程序 = (对象 + 对象 + ) 算法与数据结构是一个整体,算法离不开数据结构,算法只能适用于特定的数据结构。 面向对象中,算法与数据结构被捆绑成一个类 OOA - OOD - OOI,Chapter5 面向对象基础,目 录,Chapter5 面向对象基础,数据存在哪里,对程序运行时各部分是如何展开的一一特别是内存是 如何分配的,作一个直观的描述还是很有必要的. 数据可以存储在以下六个地方: 寄存器 栈 堆 静态存储 固定存储 非内存的存储,Chapter5 面向对象基础,数据存在哪里 - 1,寄存器 这是反应最快的存储,因为它所处位置不同:处理器里. 由于寄存器的数最非常有限,是由编译器分配的. 非但不能直接控制寄存器,甚至连它存在的证据也找不到. 栈 位于“常规内存区“里,处理器可以通过栈指针(stack pointer)对它进行直接访问. 栈指针下移就创建新的存储空间,向上移就释放内存空间. 仅次于寄存器的最快、最有效率的分配内存的方法. 由于Java 编译器必须生成能控制栈指针移动的代码,所以程序编译的时候,那些将被存储在栈中的数据的大小和生命周期必须是已知的. 使程序的灵活性受到了限制,所以尽管Java把某些数据-特别是对象的“引用“reference存放在栈里,但对象本身并没有放在栈里.,Chapter5 面向对象基础,数据存在哪里 - 2,堆 是 “多用途的内存池”(也在内存里面),所有Java对象都保存在这里. 堆的优点:分配空间的时候,编译器无需知道该分配多少空间,或者这些数据会在堆里呆多长时间.因此使用堆的空间会比较灵活. 只要想创建对象,用new就行了,程序执行的时候自会在堆里分配空间. 堆的缺点:当然得为这种灵活性付出代价,分配堆的存储空间要比分配栈的慢一些(假如能像C+那样在栈里创建对象). 静态存储 “静态”在这里的意思就是“在固定的位置”( 还是在RAM中)。 静态存储中的数据在整个程序的运行期间都能访问到。 可以用static关键词说明对象中的某个元索是静态的,但是Java对象本身是决不会放到静态存储中去的.,Chapter5 面向对象基础,数据存在哪里 - 3,固定存储 常量值通常直接放在程序里,这样它们就不会被改动,因而也更安全. 非内存的存储 如果数据完全独立于程序,那么即使程序不运行,它也应该也还在;即使程序失去了对数据的控制,它也仍然还在. 两个最主要的例子是“流对象(streamed object)“和“持久化对象(persistent object)“.,Chapter5 面向对象基础,类的定义,类定义的格式: 类修饰符 class 类名 extends 父类名 implements 接口名 成员变量定义; 方法定义; ,定义类的结构包含有类说明 和类的实体两部分。类的说明部分由关键字class与类名组成;类体包括变量的说明、方法的定义与实现两个部分。,类名的第一个字母要大写。 类体要用花括号 括起来。,创建类对象一般形式: 类名 对象变量=new 类名(参数1,参数2,); 或者 类名 对象变量; 对象变量=new 类名(参数1,参数2,);,Chapter5 面向对象基础,类的定义,/创建一个新人物 class People private String name, address; public void setInfo(String newname, String newaddress) name = newname; address = newaddress; public String toString() return “+ name + “, “ + address + “; public class ch05_01_People public static void main(String args) People someguy=new People(); someguy. setInfo( “佐助“, “火影村“ ); System.out.println(someguy.toString(); ,Chapter5 面向对象基础,声明对象时的内存模型,当用People类声明一个对象someguy: People someguy = new People(); 内存模型 仅建立了“someguy”对象的引用(reference) 尚未真正分配内存空间,Chapter5 面向对象基础,对象分配内存后的内存模型,当系统见到 someguy. setInfo( “佐助“, “火影村“ ); 做两件事: 为x和y成员变量分配内存,即类的所有成员变量被分配内存空间,然后执行构造方法中的语句. new运算符在为name和address成员变量分配内存后,将返回一个引用 给对象 someguy 。,Chapter5 面向对象基础,对象的初始化和构造方法,构造方法是一个类方法中方法名与类名相同的类方法, 它的作用是当使用new关键字创建一个对象时,自动 调用并对新建对象进行初始化操作. 构造方法的特点 构造方法与类名相同 构造方法没有返回值,不定义返回类型 构造方法可以重载,针对参数数量和类型定义多个同名构造方法 构造方法可以继承,子类可以继承父类的构造方法 构造方法不能由编程人员显式地直接调用,它是在对象创建时 由new运算符自动调用的 构造方法只用来对类实例进行初始化,目的在于简化初始化操作 在Java中,对象的创建和初始化是统一的两者缺一不可,Chapter5 面向对象基础,构造方法构造方法的作用,构造方法的作用 对象初始化 引入更多的灵活度(变量赋值或更复杂的操作) 类中可以不定义构造方法 每个类都至少有一个构造方法,如果程序员没有为类定义构造方法,系统会自动为该类生成一个默认的构造方法。 默认构造方法的名字与类名相同,它的参数列表和方法体均为空,自动将所有实例变量初始化为默认值 (数值型为0,布尔型为false,字符型为u0000,对象型为null ). 一旦定义了自己的构造方法,默认构造方法将不再起作用.,Chapter5 面向对象基础,Code,/如何将没有设计构造器的类添加构造器 / 研究带有构造器的类与没有构造器的类之间的区别 class Student /定义 Student 类 static long sum=0; String name; String address; String grade; static int score; public static long collect() /定义类的方法 sum+=score; return sum; public void setInfo(String x1,String x2,String x3) name=x1; address=x2; grade=x3; public void setScore(int y) score=y; public class ch05_04_Student public static void main(String args ) Student zhang=new Student(); /创建Student类的对象 zhang. setInfo (“张三”, “屯溪路”, “计算机学院“); zhang.setScore(90); zhang.collect(); Student wang=new Student(); /创建Student类的对象 wang. setInfo (“王五“, “屯溪路“, “计算机学院 “); wang.setScore(85); System.out.println (+zhang.address+zhang.grade); System.out.println (+wang.address+wang.grade); System.out.println ( “总成绩是 “+wang.collect( ); ,Chapter5 面向对象基础,Code,/采用构造方法实现上述功能,研究带有构造器的类与没有构造器的类之间的区别 class Student static long sum=0; String name; String address; String grade; static int score; public static long collect() /定义类的方法 sum+=score; return sum; Student (String x1, String x2, String x3, int y) name=x1; address=x2; grade=x3; score=y; public class ch05_05_Student public static void main(String args ) Student zhang; zhang=new Student(“张三“,“屯溪路“, “计算机学院“,90); zhang.collect(); Student wang=new Student (“李四“,“屯溪路“, “计算机学院“,85); System.out.println( + zhang.address + zhang.grade); System.out.println( + wang.address + wang.grade); System.out.println( “ 总成绩是 “+ wang.collect(); ,Chapter5 面向对象基础,目 录,Chapter5 面向对象基础,访问控制符,允许库创建者声明哪些东西是客户程序员可以使用的,哪些是不可使用的。这种访问控制的级别在“最大访问”和“最小访问”的范围之间. 分别包括:public,默认(无关键字),protected以及private。下面的列表说明访问控制修饰符含义:,Chapter5 面向对象基础,公共访问控制符public,无论是类或者类成员,只要被声明成public, 就意味着它可以被从任何地方访问. 一个类作为整体对程序的其他部分可见,并不能代表类内的所有属性和方法也同时对程序的其他部分可见,前者只是后者的必要条件,类的属性和方法能否为所有其他类所访问,还要看这些属性和方法自己的访问控制符. 实例变量采用public关键字,这是一种非常糟糕的做法,破坏封装.,Chapter5 面向对象基础,默认访问控制符,假如类或者类成员不含有一个明确的访问说明,说明它具有默认的访问控制特性。 默认的访问控制权规定类或者类成员只能被同一个包中的其他代码所访问,在包外不可见。这种访问特性称为包访问性。 Java语言中的包是类和接口的集合,它从更高级别上提供了对类和接口的存取保护和命名空间管理。,Chapter5 面向对象基础,私有访问控制符private,用private修饰的类成员只能被该类中的其他成员所访问,在该类外不可见. 例如,在Point2D类中有两个变量,它们被定义成以下形式: private double x; private double y; private(私有的)关键字用来确保可以访问这些实例变量的只能是Point2D类本身的方法。 在大多数实际应用的类中,有必要仅仅允许通过方法来对数据进行操作,维护封装.,Chapter5 面向对象基础,保护访问控制符protected,用protected修饰的类成员不但对于同一个包中 的其他类是可见的,而且对于其他包中该类的子类也是可见的。 Protected 仅用于继承情况中。,Chapter5 面向对象基础,目 录,Chapter5 面向对象基础,static & final,static 修饰的成员变量为静态变量 static 修饰的方法为静态方法,被static修饰的成员变量成为静态变量,保存在内存区的公共存储单元中,而不是保存在某个对象的内存区中。任何一个类对象在访问它时都会得到相同的数值。 如果某一个类对象对它进行了修改,所有对象的此成员变量也都做了修改。静态方法属整个类,不用进行实例化操作,使用时方法前加类名而不是对象名。,final 修饰的变量为最终成员变量 final 修饰的方法为最终方法,最终成员变量一般是在声明时进行初始化,一旦最终成员变量被赋值,则它在整个程序执行过程中不能改变。 当声明常量时,可以使用final 加上类型和常量名 最终方法不能被重复定义或更改方法的内容,不能被重载,Chapter5 面向对象基础,Code - static成员变量,/ 定义一个学生档案类,包括学生姓名、性别和所在学校 / 使用static修饰成员变量 class Student String name; String sex; static String school=“合肥工业大学“; public class ch05_06_Student public static void main(String args) Student me=new Student(); Student you=new Student(); =“李明 “; me.sex=“男 “; =“张敏 “; you.sex=“女“; /对类成员变量赋值 Student.school=“安徽大学“; System.out.println(+“ “+me.sex+“ “+me.school); System.out.println(+“ “+you.sex+“ “+you.school); ,Chapter5 面向对象基础,Code - final成员变量,/定义类及其方法,引用此方法时 /通过final实参对类进行初始化操作 class Calculate private double r; final double PI=3.14159; void area(double r) double x; x=PI*r*r; System.out.println(“Area=“ + x); public class ch05_07_Calculate public static void main(String args) Calculate dd = new Calculate(); dd.area(12.3); ,Chapter5 面向对象基础,Code - static方法,static修饰的方法称为静态方法或成为类方法, 属于整个类,在任何地方都可以使用, 而不必对类进行实例化操作 /如何引用类方法 /注意本程序需要从命令行输入两个整型参数 public class ch05_08_Sta_method int width, height; public static double area(int width,int height) return width*height; public static void main(String args) int i,j; double f; i=Integer.parseInt(args0); j=Integer.parseInt(args1); f= ch05_08_Sta_method.area(i,j); System.out.println(“Area= “+i+“*“+j+“ = “+f); ,Chapter5 面向对象基础,Code - final方法,使用final修饰的方法被称为最终方法,不能被更改, 也不能被当前类的子类重载 / 定义Final类及其最终方法并引用此方法 / 注意本程序需要从命令行输入两个整型参数 public class ch05_09_Fin_method int width,height; public static final double area(int width,int height) return width*height; public static void main(String args) int i,j; double f; i=Integer.parseInt(args0); j=Integer.parseInt(args1); f=ch05_09_Fin_method.area(i,j); System.out.println(“ Area= “+f ); ,Chapter5 面向对象基础,目 录,Ch

温馨提示

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

评论

0/150

提交评论