收藏 分享(赏)

三、类和对象.ppt

上传人:11xg27ws 文档编号:8118265 上传时间:2019-06-09 格式:PPT 页数:33 大小:166KB
下载 相关 举报
三、类和对象.ppt_第1页
第1页 / 共33页
三、类和对象.ppt_第2页
第2页 / 共33页
三、类和对象.ppt_第3页
第3页 / 共33页
三、类和对象.ppt_第4页
第4页 / 共33页
三、类和对象.ppt_第5页
第5页 / 共33页
点击查看更多>>
资源描述

1、类和对象,面向对象程序设计(OOP),Java是完全的面向对象语言,Java程序是由对象组成的,这些对象有自己的属性和能够执行的操作。 每个对象负责执行一组相关的任务,一个对象不能直接访问其他对象的数据,也不能让其他对象直接访问自己的数据 OOP的本质:将大量问题归纳为一个简单的解 OOP技术的三大特性 封装性、继承性、多态性,类的声明(class),类声明语法:,class AClassName /* class body */ ,方法、参数和返回值,方法只能作为类的一部分创建 方法能访问所在类中所有的成员变量和方法,returnType methodName(/*argument list

2、*/) /* method body */ ,访问权限修饰符,public : 对任何人可用 private : 除了包含该成员的类之外,其他任何类都无法访问这个成员 protected : 该类自身、子类、包中其他类可访问 public和protected方法可以被其子类重写,对象,类实例化可生成对象 对象通过消息传递进行交互 消息传递即激活指定的某个对象的方法以改变其状态或让它产生一定的行为。 表现为调用该对象的某个方法。 对象的生命周期 生成、使用、清除,对象的使用,通过运算符“.”可以访问数据和对方法的调用。objectReference可以是一个已生成的对象,也可以是可以产生对象的表

3、达式,objectReference.variable objectReference.methodName(paramlist);,p.x = 10; tx = new Point().x; p.move(30,20); new Point().move(20, 30);,对象的生成,包括声明、实例化和初始化 格式:type objName = new type(paramlist); 声明 type objName 声明并不为对象分配内存空间,而只是分配一个引用空间。 实例化 运算符new:为对象分配内存空间,它调用对象的构造器,返回引用。 初始化 执行构造器进行初始化 根据参数不同调用相

4、应的构造器,对象初始化,在C+中引入了“构造器”(constructor)的概念,这是一个在创建对象时被自动调用的特殊方法。Java同样也采用了此方法。 构造器的命名方式:与类名一致。注意,构造器没有返回值,如果存在一个与类名相同但是有返回值的方法,那么此方法不是构造器。 构造器不是方法,不能像方法一样调用,class Rock int weight;Rock() / This is the constructorSystem.out.println(“Creating Rock“);weight = 100; ,默认构造器,如果没有显式定义任何构造器,那么编译器会插入一个“后台”的不可见的无

5、参数的构造器。一旦自己创建了构造器,Java就不支持默认的无参数的构造器了。,class Rock /相当于 class Rock Rock() ,默认构造器,class Base Base(int i) System.out.println(“single int constructor“); public class Cons public static void main(String args) Base c = new Base(); / will not compile/Base c = new Base(10); / correct ,方法的重载(overloading),多个方

6、法享有相同的方法名称为重载 区分:参数类型不同或个数不同,甚至是顺序不同(例如int , String与String, int,但一般不推荐这样使用),class Printer print() . print(String s) . print(int i) . print(boolean b) . print(int i, boolean b) . ,以返回值区分重载方法,是否可以以返回值区分重载方法?如果编译器可根据语境明确判断出语义,如int x=f(),那么的确可以区分此重载方法,但有时我们并不关心方法的返回值,而只关心方法的效果,如f(),这种情况下,Java无法判断应该调用一个方

7、法 所以,不能以返回值区分重载方法,void f() int f() ,构造器的重载,构造器的名字由于已经由类名决定,当我们需要以多种方式创建一个对象时,就必须使用重载,String a= new String(); /空串 String b = new String(“Java World!“); char chars1=a,b,c; String c = new String(chars1);,this关键字,this用在一个方法内部,表示对“调用方法的那个对象”的引用,class Employee private String name;private double salary;.pu

8、blic void raiseSalaryByPer(double byPercent)double raise = salary * byPercent / 100;salary += raise; public void raiseSalary(double salary)this.salary += salary; ,this关键字,如何得到this?Java编译器实际上在幕后将“所操作对象的引用”作为第一个参数传递给f(),这个参数就是this,class Banana void f(int i) Banana a = new Banana(), b = new Banana(); a

9、.f(1); b.f(2);,Banana.f(a, 1); Banana.f(b, 2);,this关键字的特殊用法-构造器中调用构造器,Java中,可能一个类有多个构造器,可以在一个构造器中调用另一个构造器,以避免重复代码 在构造器中,如果为this添加了参数列表,则产生对符合参数列表的某个构造器的明确调用,调用形式Flower.java,this(arguements list);,其他初始化方式,声明时初始化,class InitialValues boolean b = true;char c = x;byte B = 47;short s = 0xff;int i = 999;lo

10、ng l = i;float f = 3.14f;String ss = new String(“ssss“);int j = f();int f() return 100; ,其他初始化方式,初始化块 在类的声明中,可以包含多个代码块,只要构造类的对象,这些块就会被执行,class MyPoint private int x;private int y; static int classNum;classNum +;if (classNum 10) x = 200;y = 200; ,初始化顺序,1、所有数据域初始化为默认值(保证数据域一定能被初始化) 2、按照在类声明中出现的次序依次执行所

11、有域初始化语句和初始化块 3、如果构造器第一行调用了第二个构造器,则执行第二个构造器主体 4、执行这个构造器主体,对象的清除,当不存在对一个对象的引用时,该对象成为一个无用对象 无用对象的内存释放由Java系统自动进行(自动垃圾收集) 开发者无法控制垃圾收集器的工作,但可以使用System.gc()建议垃圾收集器工作,但并不能保证执行,垃圾回收机制,引用计数:每个对象有自己的REFERENCE计数器,计数器减为零时对象丢失,系统在其后某个时刻自动回收不再可用的对象。 缺陷:难以处理循环引用的问题,Rock R1=new Rock(1); /计数为1Rock R2=R1; /计数为2 /计数为1

12、 /计数为0,finalize(),Java允许在类中定义一个finalize()方法,以在垃圾回收时刻做一些重要的清理工作 finalize()不是C+中的析构函数 finalize()不负责内存资源的释放,但有时候我们需要清理通过其他方式申请的资源,例如 文件 本地方法:在Java中使用非Java方式分配的存储空间 尽量避免使用finalize(),一般应调用明确的清理方法,类的继承,类的复用 继承:利用现有类型生成新类型(is-a) 组合:新的类是由现有类的对象所组成(has-a) 继承关键字:extends Java不支持多重继承,class Tree Tree() System.ou

13、t.println(“Tree constructor“) class Oak extends Tree Oak() System.out.println(“Oak constructor“) ,Object类,Java中所有的类都派生自一个类:Object 下面的定义实际上隐含了一个继承关系,public class HelloApplication ,public class HelloApplication extends Object ,子类的初始化,继承并不只是复制基类的接口,当创建一个子类对象时,该对象包含了一个基类的子对象,class Tree Tree() System.out

14、.println(“Tree constructor“); class Oak extends Tree Oak() System.out.println(“Oak constructor“); public class OakInit public static void main(String args) Oak a = new Oak(); ,带参数的构造器,class Tree Tree(int i) System.out.println(“Tree constructor “ + i); class Oak extends Tree Oak(int i) System.out.pri

15、ntln(“Oak constructor“ + i); public class OakInit public static void main(String args) Oak a = new Oak(10); ,这段代码有没有问题?,super,Java中用super关键字表示对父对象的“引用” super的用法可同this类比,class Fruit void f() System.out.println(“Fruit.f()“); class Banana extends Fruitvoid f() System.out.println(“Banana.f()“);void g()

16、f(); / Banana.f();super.f(); / Fruit.f(); ,带参数的构造器,如果父类的构造器有参数,那么必须显式调用super来完成基类的初始化,class Tree Tree(int i) System.out.println(“Tree constructor “ + i); class Oak extends Tree Oak(int i) super(i); / must be first statementSystem.out.println(“Oak constructor“ + i); public class OakInit public static

17、 void main(String args) Oak a = new Oak(10); ,final关键字,final 修饰方法 表示此方法不能被子类重写,也即,保证方法行为保持不变 final 修饰类 此类不能被继承,多态性,多态意味着“不同的形式” 在面向对象程序设计中,我们持有相同的外观(基类的通用接口)以及使用该外观的不同形式:不同版本的动态绑定方法 Shapes.java,方法调用绑定,方法调用绑定:将一个方法调用同一个方法主体关联起来称为绑定 前期绑定:在程序执行前进行绑定(编译和连接阶段进行绑定) C语言中只有前期绑定 后期绑定(动态绑定、运行时绑定):运行时根据对象的类型进行绑定 Java中除了static方法和final方法(private属于final方法),其他所有方法都是后期绑定,Static修饰符,静态数据 在整个类中仅有一个,实际存放于静态区中 仅在载入类时被初始化静态方法 静态方法不能对对象实施操作,调用静态方法也不需要对象存在 当一个方法不需要访问对象状态,或只需要访问类中的静态数据时,可将此方法声明为static,class Tree static int amounts = 0; / only initialize once ,Math.sin(x);,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报