面向对象程序设计基础.ppt_第1页
面向对象程序设计基础.ppt_第2页
面向对象程序设计基础.ppt_第3页
面向对象程序设计基础.ppt_第4页
面向对象程序设计基础.ppt_第5页
已阅读5页,还剩66页未读 继续免费阅读

下载本文档

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

文档简介

第三章面向对象程序设计基础,OOP,3.1 类和方法,3.1.1 类,人:姓名(name) 身份证号(id) 性别(sex) 身高(height) 体重(weight),说话 走路 思维 吃饭,状态描述表明了对象的状态特征,方法描述确定了对象具有的能力,3.1 类和方法,一。 类:类是模板或蓝图,是用来创建对象的,它包含被创建对象的状态描述和方法定义。 类的定义包括两部分: 1.声明和类体,其格式如下: class 类名 类体 ,Class Human float hight,weight; String name,sex, id; void speak(String x, String y, String z) name=x;sex=y;id=z; System.out.println(name +sex+ id); ,float walk(float x,float y) float z; weight=x; hight=y; z=weight+hight; return z; void think() void eat() ,2.类体由两部分构成:一为变量定义 二为方法定义 Class Shape float area; int color; float x,y; void draw() void erase() void move() int getColor() ,成员变量: 类定义时,变量部分所定义的变量 局部变量: 方法体中定义的变量和方法的参数 上例:float hight,weight; String name,sex,id; 其中的hight,weight,name,sex,id 为成员变量 而方法定义中的float f(float x,float y) float z; 中的 x ,y,z 为局部变量,有效区域,成员变量在整个类内都有效;,局部变量只在定义它的方法内有效。,例:class Ex2 int x; int f() int a; x=a;/X为全局变量 int g() int y; y=a;/a为局部变量 ,成员变量的隐藏性,局部变量与成员变量名字相同时,则成员变量被隐藏,即在这个方法内暂时失效, 例:局部变量起作用 class tom int x=98,y; void f() int x=3; y=x; /y=3 ,成员变量起作用 class tom int x=98,y; void f() int x=3; y=this.x; /y=98 ,这是this第一种用法,实例变量、类变量,成员变量又分为实例(成员)变量和类(成员)变量 用static修饰的成员变量为类变量,也叫静态变量,否则为实例变量。 例: calss example float x; static int y; ,3. 类之间的关系 类之间最常见的关系: 依赖 (uses-a):如果一个类中的方法操作了另一个类的对象,那么这个类就依赖于另一个类 聚合 (has-a) :类A的对象包含类 B 的对象 继承 (is-a) :表示一个特定的类和一个一般的类之间的关系.一般来说,如果类A扩展了类 B ,那么类A不仅继承类 B 的方法和状态,而且还有属于自己的方法和状态。,3.1.2 方法定义,1. 方法的定义包括两部分: 方法声明和方法体 格式为: 方法声明部分 方法体 ,.2.方法的声明:名字、类型和参数等属性的说明 例:void natural(string x, string y, string z) float f(float x,float y) 注:方法的类型描述的是返回值类型 无返回值时类型为void 3.方法体:由局部变量定义和 java 语句组成 例1:int f(int x,int y) int z; z=x* x+y* y+1; return z; ,例 2 :void natural(string x,string y,string z) name=x sex=y; id=z; system.out.println;(name +sex+ id) 4.静态方法 用static修饰的方法叫静态方法或类方法 静态方法和静态变量可通过对象或类名来调用,实例方法和类方法的区别,实例方法只能通过对象来调用 类方法还可以直接由类名来调用 class A int x,y; static float f(int a) float g(int x1,x2) ,class B public static void main(String args) A a1=new A(); a1.f(2,3);/ok a1.g(2,5);/ok A.f(4,6);/ok A.g(8,9);/Error ,System.out.println(“*”);,3.1.3 方法的重载(overloading): wash the shirt wash the car wash the dog 我们通过判断被wash的物体知道该用哪种方法来wash 早期语言,比如C语言,不同的函数不能通明,导致 shirtWash(shirt) carWash(car) dogWash(dog),一个类中可以有多个方法具有相同的名字,相同的类型,不同的参数,这种情况叫重载 例:class Wash Cloth wash(Cloth shirt) return shirt; Auto wash (Auto car) return car Animal wash (Animal dog,int n) return n; 例:Overloading.java,参数的不同体现在类型和个数上的不同,3.1.4 构造方法 也叫构造器,是一种特殊的方法,其作用是用来构造并初始化对象。 它的名字必须与它所在的类名字相同 且类型为void。 例:class Rock Rock() / This is the constructor System.out.println(“Creating Rock“); public class SimpleConstructor public static void main(String args) for(int i = 0; i 10; i+) new Rock(); ,例 2 class Student public Student (String n, double s) name =n; score =s; public string getName() return name; private double score; private String name; 例:SimpleConstructor2.java,当用某一个类创建一个对象时,这个类的构造方法将自动被执行,调用另一个构造器 当成员变量与局部变量同名时,可用关键字指向隐式参数,完成对成员变量的引用 如果构造器第一个语句为 this (); 此处表示调用此类中的另一个构造器 例:class Student public Student (string n, double s) name =n; score =s; public Student ( double s) this (“no.4: wanghong“,s); ,第二种用法,当调用new Student (628) 时, Student ( double s) 构造器首先调用 Student (string s, double n)构造器 使用关键字this很有用,只需对公共的类定义一次 例:b.java This的用法:1.调用全局变量 2.调用本类中其它构造方法 3.对当前对象的引用(Leaf.java) 4.用当前类作监听器,3.2 对象,1.对象的定义 当使用一个类创建了一个对象时,就说给出了这个类的一个实例,只有通过对象才可以访问该类中的变量、调用该类中的方法(static变量、static方法除外) 定义对象包括对象的声明和创建对象两部分 对象的声明: 类的名字 对象名字 例:,class Student public Student() System.out.println(“我是学生”); public Student (stringn, double s) name =n; score =s; public string getName() return name; private double score; private String name; ,声明对象: Student wanghong,liwei; 声明后内存情况: wanghong,liwei,创建对象即是为声明的对象分配内存 用new 运算符和构造方法为对象分配内存 例: wanghong= new Student() liwei=new Student(“liwei“,640) 声明和创建也可一次完成 Student wanghong= new Student() Student liwei=new Student(“liwei“,640),创建后内存情况: wanghong,liwei,liwei,640,初始化,类定义的变量中含有静态变量时,该类 所有对象的静态变量共享同一存贮单元 class Student public Student (String n, double s,String c) name =n; score =s; classno=c; 。 private double score; private String name; Private Static String Classno. Student wanghong= new Student(); Student liwei=new Student(“liwei“,640,0209);,创建后内存情况: wanghong,liwei,liwei,640,0209,例:StaticEx.java,2.默认字段初始化 如果在构造方法中没有明确地给某个字段赋值,那么此字段会被自动赋以一个默认值。 数值型: 0 布尔型:false 对象引用:null 例:在上例 中: wanghong的name应为:null score为:0,3 默认构造器 如果编写了一个没有构造器的类,则系统会自动为该类提供一个默认的构造器,其名字为类名,无参,方法体为空。 用该类创建对象时,实例变量将被初始化为默认值。,4 初始化块。 为成员变量初始化可用如下方法: *在构造器中设置值 *声明的同时赋值 *用初始化块 class Student private double score; private String name; / object initialization block score=0; name=“; ,不管是哪个构造器构造了一个对象,初始化块首先被运行,然后构造器的主体部分被执行。 静态初始化块常用来初始化静态值 例:static int nextid; static Random gen =new Random(); nextid=gen.nextInt(1000); ,public class b b() this(12); System.out.println(“bbb“); b(int x) System.out.println(“ccc“); System.out.println(“123“); public static void main(String args) new b(); ,总结: 1.重载的构造器 2.使用this()调用另一个构造器 3.默认构造器 4.初始化块 5.静态初始化块 6.实例字段初始化 例:一个关于构造器的例子Constructortest.java,3.3包(package),Java常常把多个类放在一起,形成一个包,class1,class2,class3,class4,package,1.使用包 一个类可以使用它所在包中的所有类,也可以使用来自其它包中的所有public类 访问其它包中的类有两种方式: a.类名前加上完整的包名 例:Java.awt.Button button1; Java.util.Date today;,b.利用import语句导入特定的类 例:import java.util.* import java.awt.Button ; 再使用这些包中的类时就不必指明包名 上例可改为: Button button; Date today;,程序,包,import,2 .向包中添加类 要把类放入一个包中,首先用package语句指明包的名字,且该语句应为程序的第一条语句,然后才是定义类的语句 例:package com.horstmann.corejava; public class Employee 如果源文件中不使用package语句指明包名,源文件的类将属于默认包,当一个源文件中使用了package语句时,那么这个包中所有的类文件都必须放在与包名相匹配的子目录中 上例中,Employee.class文件必须位于 comhorstmanncorejava子目录下 当程序中所使用的类位于不同包时,这点特别重要。 例:PackageTest类属于默认包;Employee类属于com.horstmann.corejava 其源文件和类文件必须如下组织:,当前目录,PackageTest.java PackageTest.class,com,horstman,corejava,Employee.java Employee.class,例:package.java,Classpath指定的目录,3.4继承,1.继承定义 继承就是用已有类来构建新的类的一种机制 当你继承了一个类时,就继承了这个 类的方法和变量,同时你也可以在新类中添加新的方法和变量 例:现在要定义一个教师类,Class People float hight,weight; String name,sex, id; void natural(string x, string y, string z) name=x; sex=y; id=z; system.out.println;(name +sex+ id); ,class Teacher extends People String position; float wage; /*加上其它的方法/ 继承可定义如下: class 新类名 extends 已有类名 extends 表明你用已有类构建了一个新类,或新类继承了已有类 已有类称为:超类、基类或父类 而新类称作子类或者派生类 例:ExtendsEx.java,2.继承的执行 a.当一个类继承了其父类时,当用该类构造对象时,先首先执行父类的构造方法,然后再执行该类的构造方法。 例:继承的例子Extends.java b.在子类中显性调用父类的方法 例: public Teacher( ) super.getName(); 例:Chess.java (c06),3.多态 java 中,对象变量是多态的 例:People liwei,wanghai; liwei=new People(); wanghai=new Teacher(); 例:Music.java(c07) 多态叙述的是同根类之间的转换问题,4. 重写(overriding) 重写是运行时的一种多态形式,即可以在子类中重写父类的方法。 例:Rewrite.java 当在子类中重写了父类中的方法时,就意味着在源程序中存在两个名字、类型 、参数都一样的方法,一个属于父类,一个属于子类。此时,编译程序会自动 识别所要执行的方法。 执行的应是子类中的方法 要执行父类中的方法应用super,5.造型转换 如果要把一个超类对象赋给一个子类对象变量,就必须进行类型转换 格式: 子类 对象(子类)(父类对象) 例:People p1=new People(); Teacher t1=(Teacher) p1; Object-所有类的超类,3.5修饰符 一.访问权限,a.private,我是自私的 ,别碰我!,私有变量或私有方法只能在定义它的类中使用,class Sundae private Sundae() static Sundae makeASundae() return new Sundae(); ,public class IceCream public static void main(String args) Sundae x = new Sundae();/error Sundae x = Sundae.makeASundae(); ,class Sundae private Sundae() static Sundae makeASundae() return new Sundae(); public static void main(String args) Sundae x = new Sundae(); Sundae x = Sundae.makeASundae(); ,b.public,公有变量或公有方法在任何其它 类 中都可以访问,import c05.dessert.*; public class Dinner public Dinner() System.out.println(“Dinner constructor“); public static void main(String args) Cookie x = new Cookie(); /! x.bite(); / Cant access ,我有,你有,全都有!,package c05.dessert; public class Cookie public Cookie() System.out.println(“Cookie constructor“); void bite() System.out.println(“bite“); ,同一个包、不同的包中的类,不用修饰符修饰的变量和方法称为友好变量和友好方法,可以在同一包中的不同类之间访问,c.friendly,package c05.dessert; public class Cookie public Cookie() System.out.println(“Cookie constructor“); void bite() System.out.println(“bite“); ,package c05.dessert; public class Dinner public Dinner() System.out.println(“Dinner constructor“); public static void main(String args) Cookie x = new Cookie(); x.bite(); / Can access,有事您call我,谁让咱们是朋友呢!,tected,当子类和父类不在同一个包时,子类可以访问父类中的protect成员,import c05.dessert.*; public class ChocolateChip extends Cookie public ChocolateChip() System.out.println(“ChocolateChip constructor“); public static void main(String args) ChocolateChip x = new ChocolateChip(); /! x.bite(); / Cant access bite ,package c05.dessert; public class Cookie public Cookie() System.out.println(“Cookie constructor“); void bite() System.out.println(“bite“); ,package c05.dessert; public class Cookie public Cookie() System.out.println(“Cookie constructor“); Protected void bite() System.out.println(“bite“); ,import c05.dessert.*; public class ChocolateChip extends Cookie public ChocolateChip() System.out.println(“ChocolateChip constructor“); public static void main(String args) ChocolateChip x = new ChocolateChip(); x.bite(); / Can access bite ,我真想独立,摸 摸兜里没有多少钱!,例:class Tom public String name; private float wage; int age; class Jerry void g() Tom cat=new Tom(); =“jitty”;/合法/ cat.wage=4300.00f;/不合法/ cat.age=34;/若Tom和Jerry的 在同一包中是合法的/ 方法和类都同变量是一样的,二. 与继承相关的修饰符 1. final可用于变量、方法和类的说明 A.如果类的定义上有final修饰,那么,这个类就是不可扩展,即不能有子类的。 例: class SmallBrain final class Dinosaur int i = 7; int j = 1; SmallBrain x = new SmallBrain(); void f() ,class Further extends Dinosaur /error! public class Jurassic public static void main(String args) Dinosaur n = new Dinosaur(); n.f(); n.i = 40; n.j+; ,B.如果方法定义的前面用final修饰,那么子类就不能重写该方法 c.如果变量定义前面用final 修饰,就定义了一个常量 private final int Max=100; 一个对象变量前用final说明,意味着它不再能指向别的对象,但对象变量的内容是可变的 如果一个变量被说明成static和final的,那它将有一块无法改变的存贮空间 class Value int i = 1; ,public class FinalData ,final int i1 = 9; static final int VAL_TWO = 99; public static final int VAL_THREE = 39;,final int i4 = (int)(Math.random()*20); static final int i5 = (int)(Math.random()*20);,Value v1 = new Value(); final Value v2 = new Value(); static final Value v3 = new Value();,final int a = 1, 2, 3, 4, 5, 6 ;,编译阶段常量,非编译阶段常量,对象常量,public static void main(String args) FinalData fd1 = new FinalData(); fd1.i1+; / Error: cant change value fd1.v2.i+; / Object isnt constant! fd1.v1 = new Value(); / OK - not final /! fd1.v2 = new Value(); / Error: Cant /! fd1.v3 = new Value(); / change reference /! fd1.a = new int3; fd1.print(“fd1“); System.out.println(“Creating new FinalData“);,FinalData fd2 = new FinalData(); fd1.print(“fd1“); fd2.print(“fd2“); public void print(String id) System.out.println( id + “: “ + “i4 = “ + i4 + “, i5 = “ + i5); 例:FinalData.java,b.abstract-抽象类和方法 例:abstract class A abstract void draw(); abstract类不能创建对象,只能产生子类,再由其子类创建对象,且子类必须实现父类的abstract方法 abstract方法,只能声明,不能实现,3.6 接口与内部类 1。接口定义 Java不支持多继承性,即一个类只能有一个父类。为了克服单继承的缺点,Java使用了接口,一个类可以使用多个接口。 接口的声明: interface 接口名 例:interface printable ,2。接口体 接口体中包含常量定义和方

温馨提示

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

评论

0/150

提交评论