收藏 分享(赏)

Java课件 e.ppt

上传人:dzzj200808 文档编号:3660784 上传时间:2018-11-15 格式:PPT 页数:63 大小:184KB
下载 相关 举报
Java课件 e.ppt_第1页
第1页 / 共63页
Java课件 e.ppt_第2页
第2页 / 共63页
Java课件 e.ppt_第3页
第3页 / 共63页
Java课件 e.ppt_第4页
第4页 / 共63页
Java课件 e.ppt_第5页
第5页 / 共63页
点击查看更多>>
资源描述

1、面向对象程序设计基础(上),抽象,所有编程语言都提供“抽象”功能。 你所能解决问题的复杂程度取决于抽象的种类和质量。 汇编语言对于计算机(机器语言)是一步很小的抽象。 过程化语言(高级语言)对于汇编语言的抽象迈了一大步。但你所考虑的仍然是机器的结构而非问题的结构。 面向对象方法为程序员提供了一种表示问题空间元素的全新的方法,而且不受问题类型的约束。,抽象,问题空间元素方法空间中的表示:对象 “对象”是现实世界的实体或概念在计算机逻辑中的抽象表示。 面向对象的程序设计是以要解决的问题中所涉及到的各种对象为主要考虑因素。 面向对象语言更加贴近人的思维方式。OOP允许你用问题空间中的术语来描述问题。

2、 在面向对象程序设计中还需要一些其他对象,而它们没有在问题空间的对应体。,对象,“对象”就象是一台小“计算机”: 对象有状态 对象有你要求它执行的操作 现实世界中的对象: 它们都有自己的状态它们又都有自己的行为 程序中的对象 用属性表示状态 用方法(代码)实现行为,对象与过程,考虑对象 考虑过程 :前者更有意义 设计对象 设计过程:前者更富挑战性,尤其是设计可重用的对象。 面向对象的程序设计和问题求解力求符合人们日常自然的思维习惯,降低分解问题的难度和复杂性,提高整个求解过程的可控制性、可监测性和可维护性,从而达到以较小的代价和较高的效率获得较满意效果的目的。,封装-信息隐藏,“ 封装”是一种

3、组织软件的方法。其基本思想是把客观世界中联系紧密的元素及相关操作组织在一起,使其相互关系隐藏在内部,而对外仅仅表现为与其他封装体间的接口。从而构造出具有独立含义的软件实现。 封装并不是一个新的概念,但在面向对象的程序设计中提出了一种全新的封装方法类,封装-信息隐藏,每个类里都封装了相关的数据和操作。在实际的开发过程中,类多用来构建系统内部的模块, 由于封装特性把类内的数据保护得很严密,模块与模块间仅通过严格控制的界面进行交互,使它们之间耦合和交叉大大减少,从而降低了开发过程的复杂性,提高了效率和质量,减少了可能的错误,同时也保证了程序中数据的完整性和安全性。,封装-软件复用,封装使得对象: 对

4、内成为一个结构完整、可自我管理、自我平衡、高度集中的整体。 对外则是一个功能明确、接口单一、可在各种合适的环境下都能独立工作的有机的单元。 类的封装特性使得类可重用性大为提高,这样的有机单元特别适宜构建大型标准化的应用软件系统,可以大幅度地提高生产效率。,在程序中定义你抽象出的类,新类必须在已有类的基础上构造。 在已有类的基础上构造新类的过程称为派生。 派生出的新类称为已有类的子类。已有类称为超类(父类)。 子类继承父类的方法和属性。 当没有显式指定父类时,父类隐含为java.lang包中的Object类。,父类,子类,类定义属性说明,class Employee String name ;i

5、nt age ;float salary ;Employee e = new Employee( ) ;e.name=“张立” ;e.age=21;e.salary = 528.37F ;,final 类型 常量名=值,实例变量成员变量 其生命周期与对象存在的时间相同。,类定义方法说明,为Employee类增加打印方法将数据和代码封装在一个单一的实体中。 class Employee String name;int age;float salary ;void print() System.out.println(name + ”年龄为: ” +age + “ 月薪为: ” + salary

6、); /class,对象方法的含义,Employee emp = new Employee( ) ;emp.name=“张立” ;emp.age=21;em.salary = 528.37F ; 一旦对象被建立并被初始化,就可以调用该方法打印这个对象的数据。emp.print() ; 对象emp执行print 方法操作自己的数据;而不是从外部操作对象的数据。 向对象发消息,让对象做某件事。,对象的几个特征,Everything is an object 原则上说,你可以将所要解决的问题中的任何一个“概念组件”在程序中表示为一个对象。 对象类似一个记录,可以存储数据,但你还可以让它执行某些操作(

7、作用在它自身的数据上)。 A program is a bunch of objects telling each other what to do by sending messages 所谓 对一个对象发信息,就是调用该对象的一个方法。 Every object has a type each object is an instance of a class 对象+消息,数据的隐藏-封装,属性的访问权限 private public 默认(相当于package 使用private 修饰符修饰属性后,就不能从对象的外部直访问这些属性(类内方法仍可以访问) ,而只能通过该类的方法来操作这些属性

8、。 私有属性公有方法 方法可以保护数据(做各种合法性检查)。 使得代码可维护性好(代码可变,接口不变),1,类方法的定义规则,方法名后的小括号是方法的标志。 形式参数是方法从调用它的环境输入的数据。 返回值是方法在操作完成后返还给调用它的环境的数据。 要指定方法返回值类型。如没有返回值,类型要写 void 方法名相同,但参数不同,是不同的方法。 与类名相同的所有方法都是类的构造方法。,修饰符 返回类型 方法名(参数列表) throws 例外 ,方法体的定义,在方法中定义的变量称为局部变量。 其生命周期:执行进入方法体时建立,退出方法时撤消。 局部变量使用之前必须初始化。 在方法体中可以访问所有

9、的类属性,可以调用所有类中定义的方法。 方法可以递归调用。,方法的参数,方法的参数要有名有型,参数的作用域在本方法中,在方法体中可以象方法体自己定义的变量一样使用。 参数是值传递 !对象的内容可以改变,但对象的引用决不会改变。 方法的参数可以与类的成员变量同名,这时,参数在方法体中将隐藏同名的成员变量。 class circle int x,y radius ;setCircle (int x , int y , int radius ) ,引用类型值传送,基本类型值传送,地址传送,值传送与地址传送,3.14,3.14,A,B,3.14,A,B,0x2F,0x2F,A,B,参数传递例,publ

10、ic class PassTest float m_float ;void change1(int pi) pi = 100; void change2(String ps) ps=new String(“Right”) ; void change3(PassTest po ) po.m_float=100.0 ; public static void main(String args) PassTest pt = new PassTest() ;,参数传递例,int i = 22 ;pt.change1( i ) ;System.out.println(“i value is ” + i);

11、String s = new String( “Hello” ) ;pr.change2( s ) ;System.out.println(“s value is ” + s);pt.m_float = 22.0F ; pt.change3( pt ) ;System.out.println(“Current pt.m_float is ” + pt.m_float); / main() / class,2,实参,形参,3 数组,copy,方法中使用“this”,class Banana void f(int i) . Banana a = new Banana(), b = new Bana

12、na(); a.f(1); b.f(2); 方法如何知道是处理哪个对象? 编译做了一些内部处理: Banana.f(a,1); Banana.f(b,2); 把一个隐含的参数传给了方法指向被操作对象的引用。 因为是内部处理,引用没有标识名。 如果你在方法中想拿到这个引用 this,this,class Banana void pick() void pit() this.pick(); / pick() public class MyDate int day , month , year ;public void tomorrow() this.day = this.day + 1 ; /da

13、y = day + 1 ,this,this 只能在方法中使用,表示当前对象,或类的当前实例。 this 适用用于一些特殊的场合。 例: public class MyDate int day , month , year ;public void born() Birthday bd = new Birthday(this) ; ,this 例,class Leaf private int i = 0; Leaf increment() i+; return this; void print() System.out.println(“i = “ + i); public class a p

14、ublic static void main(String args) Leaf x = new Leaf(); x.increment().increment().increment().print(); ,Overloding 重载方法名,用同一个名字来表示不同的方法。这些方法同名的原因,是因为它们的最终功能和目的都相同,但由于在完成同一功能时,可能遇到不同的具体情况,所以需要定义含不同的具体内容的方法。 方法名必须相同(是同一类中定义同名方法的情况)。 方法的参数必须不同(同名不同方法是靠不同形式的参数列表来区分,包括形式参数的个数、类型、顺序的不同)。 返回类型可以不同,但不是重载的标

15、志。 利用“重名”现象提高程序的抽象度和简洁性。,方法的重载,例:(相同类型的工作,不同的参数)public void println(int i) public void println(float f) public void println(String s) Integer类: String toString() static String toString(int i) static String toString(int i , int radix) Double 类: String toString() static String toString(double d),4重载,在

16、一个类中,不可以存在两个只有返回值不同的方法 。,构造方法,实例化对象初始化对象 类名 对象引用名 new 构造方法(); Employee emp = new Employee(); new运算符的参数就是调用类的构造方法,初始化新建的对象。 new运算符为对象分配内存空间,并返回对该对象的一个引用。 构造方法的名字必须是类的名字。 构造方法没有返回类型说明。 当没定义任何构造方法时,系统配一个隐含的构造方法(如:Employee())里面没有内容。 一旦定义了一个构造方法,隐含构造方法失效!,定义构造方法,Employee(String n,int a,float s)name = n ;

17、if(a=18 ,对象初始化三步曲,当为对象分配内存空间后,首先将属性单元置为: 0 (数值型,字符型) false (逻辑型) null (引用型) 对象建立后,有明确的状态,属性都有值。 执行显式初始化class a private int x=10;private String s = new String(“first”) ;private MyTime mt = new MyTime() ; 执行构造方法,cardNumberpasswordbalanceconnectNumber,D200_Card,构造方法的重载,D200_Card() /没有参数的构造方法 D200_Card(

18、long cn) /有一个参数的构造方法cardNumber = cn; /初始化电话卡号 D200_Card(long cn,int pw ) /两个参数的构造方法cardNumber = cn ;password = pw; /密码 D200_Card(long cn,int pw,double b) cardNumber = cn; /三个参数的构造方法 password = pw; balance = b; /余额 ,构造方法的重载,D200_Card(long cn,int pw,double b,String c) cardNumber = cn; /四个参数的构造方法passwo

19、rd = pw; balance = b; connectNumber = c; /接入号码 调用不同的构造方法 D200_Card my200 = new D200_Card ( ) ; D200_Card my200 = new D200_Card ( 12345678,1234) ; D200_Card my200 = new D200_Card ( 12345678,1234,50.0) ;,构造方法之间的调用,D200_Card(long cn) cardNumber = cn; D200_Card(long cn,int pw ) this(cn); password = pw;

20、D200_Card(long cn,int pw,double b) this(cn,pw);balance = b; D200_Card(long cn,int pw,double b,String c) this(cn,pw,b);connectNumber = c; ,构造方法之间的调用,public class Employee Employee(String n,int a,float s)name = n ;if(a=18 ,构造方法之间的调用,在一个构造方法中,当使用this 并给它一个参数列表时,this显式调用参数匹配的另一个构造方法。 在一个构造方法中,不能象调用一般方法那

21、样调用另一个构造方法。构造方法不是用来调用的,而是new算符的参数。,继承,继承是一种由已有的类创建新类的机制,是面向对象程序设计的基石之一。 子类继承父类的非私有属性和方法,还可以定义新的属性和方法,改写父类的方法。 继承实际上是存在于面向对象程序中的两个类之间的一种关系。 Java要求每个类都有父类。(隐含为java.lang包中的Object类。super 是对父类的引用,引用父类的构造方法、父类成员属性和方法。,继承,属性: name age salary 方法: upSalary getInfo,Employee,Engineer,Manager,Secretary,Director

22、,属性: allowance 方法: setAllowance getInfo,属性: telephone department 方法: setTel getInfo,增加属性和方法,class Employee String name ; int age ; float salary ;void upSalary(float inc) salary = salary + inc ; class Manager extends Employee float allowance ;void setAllowance(float a) allowance = a ; class Direator

23、extends Manager String telephone ,department ; void setTel(String tel) telephone = tel ; ,调用父类的构造方法,子类继承父类所有的属性和方法(非private),但不继承构造方法。 子类或定义自己的构造方法,或使用隐含构造方法。 为了保证安全性,在子类的所有构造方法中,必须首先调用一个父类的构造方法, 子类可在自己的构造方法中使用super() 来调用父类带参数的构造方法。super()调用语句必须是子类构造方法中的第一个可执行语句。 若子类 的构造方法中没有super()语句,系统将隐含调用父类无参数构造

24、方法。,调用父类构造方法,在继承情况下的对象初始化: 为对象分配内存并初始化(0、null、false) 执行每一层的类的显式初始化。 执行每一层的类的构造方法(由于显式或隐式调用) 。,5,抽象与抽象类,程序员可以先创建一个定义共有属性和方法的一般类,再从一般类派生出具有特性的新类。 抽象类实际上是所有子类的公共域和公共方法的集合,而每一个子类则是父类的特殊化,是对公共域和方法在功能、内涵方面的扩展和延伸。,类继承树,Object,class,abstract class,class,final class,class,java单重继承,抽象类与最终类,abstract 抽象类 没有具体对象

25、的概念类 较高层次的概括 抽象类的作用是让其他类来继承它的抽象化的特征。 在程序中不能用抽象类作为模板来创建对象。 final 最终类 该类不能有子类 。,抽象类与最终类,abstract class PhoneCard class Number_PhoneCard extends PhoneCard final class D200_Card extends Number_PhoneCard .抽象类经常要包含某些抽象方法(方法的具体实现要在子类中实现)。 final可以与abstract一起使用吗?,抽象方法,abstract 抽象方法 仅有方法头而没有方法体的方法,为该类的子类定义一个方

26、法的接口标准。 abstract void performDial () ; 一个抽象类的子类如果不是抽象类,则它必须为父类中的所有抽象方法书写方法体。,最终方法,final 最终方法 不能被当前类的子类重新定义的方法。 子类不能再重新定义与此方法同名的自己的方法,而仅能使用从父类继承来的方法。只能继承但不能修改。 固定了这个方法所对应的具体操作,可以防止子类对父类关键方法的错误的重定义,保证了程序的安全性和正确性。,类继承图,域的继承与扩充,域的覆盖,class D200_Card extends Number_PhoneCard double additoryFee; /新增double

27、balance; /隐藏boolean performDial() if( balance (0.5 + additoryFee ) balance -= (0.5 + additoryFee);return true;elsereturn false; ,定义自己的域 隐藏了父类域,balance,balance,域的覆盖,如何访问被隐藏的父类域: 调用从父类继承的方法操作的是从父类继承的域。 使用super.域名。 class test public static void main(String args)a a1 = new a(); a1.print(); 1b b1 = new b

28、(); b1.print(); 1 1 100 ,class a int x = 1;void print()System.out.println(x);,class b extends aint x=100;void print()System.out.println(“super.x= “+ super.x);super.print();System.out.println(“x= “ + x);,方法覆盖(overriding),在面向对象的程序设计中,子类可以把从父类那里继承来的某个方法改写,形成同父类方法同名、解决的问题也相似、但具体实现和功能却不尽一致的新方法。 定义与父类完全相同

29、的方法,实现对父类方法的覆盖: 完全相同的方法名 完全相同的参数列表 完全相同类型的返回值 注意:在满足上述三个条件同时,还必须保证:访问权限不能缩小,抛出的例外要相同 三个条件有一个不满足,就不是方法的覆盖,而是子类自己定义与父类无关的方法,父类的方法未被覆盖,因而仍然存在。 调用父类被覆盖的方法 super.方法名,11-a,方法覆盖-抽象方法的实现,PhoneCard类抽象了一个其子类共有的方法:abstract boolean performDial(); 这个方法代表的相同功能(拨打电话),但在不同种类的电话卡中,其具体实现是不同的。不同的子类可以重新定义 该方法。 但是所有的类中,

30、凡是实现拨打电话这种功能的方法,尽管内容不同,却共享相同的名字performDial 由于同名的不同方法是属于不同的类,所以只需在调用方法时指明是哪个类的方法即可区分(类名.方法名或对象名.方法名)。,方法的覆盖,abstract PhoneCard类:abstract boolean performDial();double getBalance() abstract Number_PhoneCard类:abstract boolean performDial(); double getBalance() boolean performConnection(long cn,int pw) f

31、inal D200_Card类:boolean performDial() 覆盖 实现抽象方法double getBalance() 覆盖 实现细节不同boolean performConnection(long cn,int pw),6,系统类中方法覆盖例,java.lang.Object 方法1:public boolean equals(Object obj) 比较引用型变量(引用同一个对象时为真)class Myclass /继承了equals方法String m_s ;Myclass(String s) m_s = s ; 而类String Date File Integer 都覆盖

32、了equals方法, 当对象的类型和内容相同时为真。,系统类中方法覆盖例,class test static void main(String args) Myclass mc1 = new Myclass(“wang”);Myclass mc2 = new Myclass(“wang”);if (mc1.equals(mc2) System.out.println(“true”) ;else System.out.println(“false”) ; String s1 = new String(“wang”) ;String s2 = new String(“wang”) ;if (s1.

33、equals(s2) System.out.println(“true”) ;else System.out.println(“false”) ; ,7,系统类中方法覆盖例,Object定义的方法:toString() 将一个对象转换为一个字符串表示。返回对象类型及引用地址。 System.out.println( mc1.toString() ) Myclass7a52dd00 System.out.println(mc1) ; /隐含调用toString() 很多类覆盖了该方法。如基本类型封装类将该方法改为:返回对象表示的数据的字符串形式。 Integer i1 = new Integer

34、(123) ; System.out.println (i1);,方法重载/方法覆盖/域隐藏,方法的覆盖与方法重载的区别 重载:一个类中,同名方法(参数不同) 覆盖:子类对父类方法的覆盖(不同类的同名方法) 方法的覆盖与域的隐藏的区别: 子类隐藏父类的域只是使之不可见,父类的同名域在子类对象中仍然占有自己独立的内存空间; 而子类方法对父类同名方法的覆盖将清除父类方法占用的内存,从而使父类方法在子类对象中不复存在。,多态-Polymorphism,一个对象只有一种形式(构造函数确定的) 一个对象引用是多态的,因为它可以指向不同形式的对象。Employee e1 = new Manager() ;

35、e1.allowance = 300.0F ; ?e1.setAllowance(500.0F) ; ?e1.upSalary(200.0F) ; e1.getInfo() ; 子类具有父类的所有方法和属性,任何对于父类合法的操作对于子类也是合法的。 只限于父类定义的方法和域。但实际对象决定访问的属性和调用的方法。,11-b,多态应用,同质收集(collection) Employee staff = new Employee100 ; staff0 = new Manager() ; staff1 = new Director() ; 多态参数(接收通配对象) class Employee

36、static float findTax(Employee e) Manager m = new Manager(); System.out.println(Employee.findTax(m),11-e,实例类型的判断与转换,public void method(Employee e)if( e instanceof Manager) Manager m = (Manager)e ;m.setAllowance(500.0F) ; else if (e instanceof Director) Director d = (Director)e;d.department=“d02” ;d.s

37、etTel(“9999”) ; else /employee,实例类型转换规则,按类层次向上转换(cast upward)总是允许的,且不用转换,只需直接赋值即可。Manager m = new Manager();Employee e = (Employee)m ;Employee e = m ;System.out.println(e.getInfo(); 按类层次向下转换(cast downwand),编译会首先检查是否可能。 如果编译允许,运行时还要看实际的情况。在没有使用instanceof做检查的时候,对象正好不是要转换的类型,出运行错误。,11-c,d,cast,Employee e,Manager m,Director d,emp,director,谢谢再见!,

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

当前位置:首页 > 网络科技 > Java

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


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

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

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