1 / 42

面向对象程序设计基础(下)

类属性 类方法 包 限定符 接口 内部类. 行. 言. 面向对象程序设计基础(下). 类变量(静态变量). 类变量 —— 为类的各实例共享的变量。 static 静态变量 ; 位于类的内存区域中,为该类的各个对象共享 . 无此限定符的变量是实例变量。 class ex { int i ; static int j ; static final int k=10 ; --- } 为节省空间, final 常量可同时 定义为 static. 类 ex j k=10. 对象 1

Download Presentation

面向对象程序设计基础(下)

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 类属性 • 类方法 • 包 • 限定符 • 接口 • 内部类 行 言 面向对象程序设计基础(下)

  2. 类变量(静态变量) • 类变量——为类的各实例共享的变量。 static 静态变量 ; • 位于类的内存区域中,为该类的各个对象共享. • 无此限定符的变量是实例变量。 class ex { int i ; static int j ; static final int k=10 ; --- } • 为节省空间, final 常量可同时 定义为static 类ex j k=10 对象1 i : 3 对象2 i : 5

  3. 类变量(静态变量) • 实现各实例之间的通讯。 • 跟踪创建的实例数。 public class Count { private int serial ; //成员变量 private static int counter = 0 ; //类变量 public Count() { counter++; serial = counter ; } } • 静态变量类似于某些语言中的全局变量。

  4. 类变量(静态变量) • 非private 的静态变量无须创建实例就可以从类的外部访问。 public class StaticVar { public static int x ; } public class test { public void m() { int m = StaticVar.x ; } } 1

  5. 类变量(静态变量) class PhoneCard200 { static final String connectNumber = “200”; static double additoryFee; long cardNumber ; int password; boolean connected; double balance; … } 2

  6. 类变量(静态变量) public class a { public static void main(String args[]) { PhoneCard200 my200_1 = new PhoneCard200(); PhoneCard200 my200_2 = new PhoneCard200(); PhoneCard200.additoryFee = 0.1; System.out.println(“第一张200卡的接入号码:” + my200_1.connectNumber); System.out.println(“200卡接入号码:” + PhoneCard200.connectNumber); System.out.println(“第二张200卡的附加费: ” + my200_2.additoryFee); System.out.println(“200卡类的附加费:” + PhoneCard200.additoryFee); } }

  7. 类方法( 静态方法) • 类方法: static 方法名(…) { …} • 使用类方法不用创建类的对象。调用这个方法时,应该使用类名做前缀,而不是某一个具体的对象名。 • 非static的方法是对象方法(或称实例方法)。 • 类方法中不能访问实例变量,而只能访问类变量(static方法 — static域)和自己的方法参数。 • 类方法中不能直接使用本类中的实例方法,只能使用其他的static方法。 • 类方法中没有this值。

  8. 类方法( 静态方法) public class a { public static void main(String[] args){ System.out.println(Math.round(3.54)); String s = to_char(2.718); System.out.println(“e=“ + s ); } static String to_char(double x) { return Double.toString(x); } } 3

  9. 类方法( 静态方法) • main方法是静态方法,这是为了系统在没有任何实例化对象之前可以运行一个应用程序。 • 如果main方法要调用本类的其它方法: • 将这些方法设计成静态方法, • 创建对象,使用对象方法。 • 一个静态方法不能被一个非静态方法所覆盖。

  10. 类的初始化-静态初始化器 • 由关键字static引导的一对大括号括起的语句组。用来完成类的初始化的工作, • 与构造方法的区别: • 构造方法是对每个新创建的对象初始化,而静态初始化器是对类自身进行初始化; • 构造方法是在用new运算符产生新对象时由系统自动执行,而静态初始化器则是在它所属的类加载入内存时由系统调用执行; • 不同于构造方法,静态初始化器不是方法,没有方法名、返回值和参数列表。 4

  11. 小结—类与对象 • 面向对象的数据和方法: • 一个类的对象虽然具有相同的属性,但对象却各不相同(属性值不同)。 • 一个类的对象方法虽然具有相同的代码,但表现不同,因为方法所操作的对象(数据)不同。 • 共享的数据和方法: • 类属性 — 在同一类的实例中共享数据(该数据不属于一个对象,而属于一个类)。 • 类方法 — 不需要实例就能使用静态的方法和数据,虽然它们也能通过实例来访问。

  12. 小结—类与对象 • 类名.域名 静态域,在类的空间里,是该类对象共享的单元 • 类名.方法名 静态方法 — 类方法的调用 • 类方法及域也可以用对象名调用,但最好用类名 • 对象名.属性名 实例变量 。提倡通过方法操作属性。 • 对象名.方法名 方法调用又称“消息传递”,实际上就是给指定对象发送消息:告诉它做什么,向它要信息(方法的返回值)。

  13. 小结—类与对象 • 访问一个类: • 创建该类的对象,并使用该类对象的可见属性与方法。 • 调用该类的可见静态方法,访问该类的可见静态属性。 • 继承该类。 • final • final类不能被继承。 • final 方法不能被覆盖。 • final 域不能被修改。

  14. 包(package) • 在操作系统中,目录用来组织文件,设置权限。 • Java利用包来组织相关的类,并控制访问权限。 • 包是一种松散的类的集合。一般不要求处于同一个包中的类有明确的相互关系,如包含、继承等等。 • 由于同一包中的类在缺省情况下可以互相访问,所以为了方便编程和管理,通常把需要在一起工作的类放在一个包里。 • 利用包来管理类,可实现类的共享与复用(类库)。

  15. 编译单元 • 一个java源代码文件称之为一个编译单元。 • 一个编译单元中只能有一个public类,该类名与文件名相同。编译单元中的其他类是该主public类的支撑类。 • 经过编译,编译单元中的每个类都产生一个 .class文件。 • java的工作程序是一串.class文件, JAVA解释器负责寻找、加载和解释这些文件。 (不象其它语言最终生成一个.exe的可执行文件)

  16. 类的名字空间 • 所有类成员的名字都是相互隔离的。类A中的方法m1与类B中的方法m1互不相干,但类名就有冲突的问题了。 • 在一个Java程序运行过程中,某些类会从internet上自动下载,而用户并不知晓。所以在java中需要名字空间的完全控制,以便可以建立一个唯一的类名。 • 包用于类的名字空间管理。 • 作为包的设计人员,利用包来划分名字空间以避免类名冲突(package 和 import)

  17. 包与目录 • 一个包要放在指定目录下。classpath 指定搜寻包的路径。 • 一个包可以包含若干个类文件,还可包含若干包。 • 包名本身又对应一个目录(用一个目录表示)。 • 包名可以有层次,以小数点分割。包名一般全小写(类名第一个字母大写) 。 d1 classpath = d:\d1; d:\d1\d2 d2 p1 p3 包 p2 类

  18. 编译单元与包 • 对象三步曲: • 打开包(import,package) • 加载类(程序中只有类定义的一份拷贝) • 建对象(用new运算符可以创建一个类的若干实例) 当前包 package 编译 单元 其他包 其他包 import

  19. 编译单元与当前包 • 显式指定编译单元的当前包。 package 包名 ; • 编译单元对当前包可以读写。 • 在一个编译单元中,只能有一个package语句,且为第一个语句。 • 如果编译单元中无package语句,则隐含的当前包是一个无名包(放在当前目录下)。 • 无名包中 的类是为了局部应用。 • 不管“当前包”是显式指定还是采用隐含值,总是当前名字空间的一部分。

  20. 使用其他包中的类 • import语句将指定包中的类引入当前的名字空间,即告诉编译到哪去找程序中使用的类。 • import语句不加载包中的类。 • import语句必须出现在所有类定义之前。 • 例:import java.util.* ; 该语句引入整个utility 类库(标准Java库的一部分) • 例:import java.util.Vector ; 该语句只引入Vector类,但utility类库中的其他类不可用。

  21. 从包中加载类 • 当程序需要建立一个类的对象,或是第一次访问类的静态成员时,会动态加载类文件。 • JAVA解释器加载类过程: • 将环境变量CLASSPATH包含的一个或多个目录作为起始目录。 • 解释器取出包名,将小数点换成斜杠,产生以CLASSPATH目录为起点的查找路径。 • 查找目录下的 .class文件 • import p1.p2.* 转换为 p1\p2\*.class 或 p1/p2/*.class (取决于操作系统)

  22. 创建包、添加类 package mypk ; public class myc{…} javac –d d:\ myc.java 会在指定目录下建包 set CLASSPATH=.;d:\; %CLASSPATH% import mypk.* ; public class testa { public static void main(String args[]) { myc c = new myc() ; …. } 5

  23. jar文件 • jar  cf j.jar *.class  建立jar文件 • jar  tf j.jar          列表jar文件 • java -cp j.jar test    执行jar文件中的类

  24. 访问控制符 • 访问控制符是一组起到限定类、域或方法是否可以被程序里的其他部分访问和调用的修饰符 。 • 类访问控制符 • 公共类 :public 类名 • 一般类 • 一个包中的类只能访问另一个包中的public类。 • 一般类只能在同一包中使用,一个包中的类不用说明可相互访问。 • 把常在一起协同工作的类放在一个包里是很自然的。

  25. 域和方法的访问限定符 • 一个类作为整体对程序的其他部分可见,并不能代表类内的所有域和方法也同时对程序的其他部分可见,前者只是后者的必要条件 • 域和方法的可见性 6

  26. 域和方法的访问限定符 • 为了使对象具有良好的封装性,一般将类的实例变量设计成私有。 • 为了使其它类或对象能够访问私有实例变量,本类必须提供访问私有变量的方法(公共方法)。 • 按照惯例,读私有变量的方法取名为get… 写私有变量的方法取名为 set…

  27. 接口 • “接口”是抽象类的概念。 • 接口中的方法都是没有方法体的抽象方法。 • 接口中只能定义 static final 属性 。 • 接口定义的仅仅是实现某一特定功能的一组方法的对外接口和规范,而并没有真正地实现这个功能。 • 接口的功能实现是在“继承”了这个接口的各个类中完成的,由这些类来具体定义接口中所有抽象方法的方法体。 • 通常把对接口的“继承”称为“实现”。

  28. 接口的实现 Object 接口 继承 实现 Abstract class 类 class class java—单重继承 final class

  29. 接口的定义 public interface 接口名[extends 父接口名列表] { // 常量域声明 public static final 域类型域名= 常量值; // 抽象方法声明 public abstract 返回值类型方法名( 参数列表) ; } • 接口是由常量和抽象方法组成的特殊类。

  30. 接口的实现 public class MyApplet extends Applet implements Runnable , MouseListener { … … } • 一个类只能有一个父类,但是它可以同时实现若干个接口。如果把接口理解成特殊的类,那么这个类利用接口实际上就获得了多个父类,即实现了多继承。 • instanceof 运算符可用来判断一个对象的类是否实现了某个接口。

  31. 接口例 interface CalArea { double pi = 3.14 ; double cal(double r) ; } class a implements CalArea { public double cal(double r) { return pi * r *r ; } } 7

  32. 接口的规定 • 类定义中使用 implements 指定实现某一接口 • 类中必须具体实现该 interface 中定义的抽象方法。 • 实现的方法必须指定为public限定符。 • 实现接口的类要实现接口的全部方法。如果不需要某个方法,也要定义成一个空方法体的方法。 Public 方法名() { }

  33. 接口的应用 • 声明多个类必须实现的方法。 • 编程者可以把用于完成特定功能的方法组织成相对独立的集合体—接口。凡是需要实现这种特定功能的类,都必须实现这个接口。 • 利用接口模拟多继承。 • java程序中的类层次结构是树状结构,这种树状结构在处理某些复杂问题时会显得力不从心。 • 接口在保持单继承优点的前提下,使Java程序的类层次结构更加合理,更符合实际情况。 • 只说明对象的编程接口,而不揭示实际的类体。 • 类库分发

  34. 系统定义的接口 public interface ActionListener extends EventListener { public abstract void actionPerformed(ActionEvent e); } • 该接口代表了监听并处理动作事件的功能,它包含了一个抽象方法 actionPerformed • 所有希望能够处理动作事件(如单击按钮、在文本框中回车等)的类都必须具有ActionListener接口定义的功能,也就是要实现这个接口,

  35. 内部类(inner class) • 在某个类的内部定义的类称之内部类。 • 内部类的定义方法 • 定义命名的内部类:可以在类中(甚至方法中)定义内部类,并在类的内部多次使用(创建多个对象)。 • 定义匿名内部类(一次性使用):可以在new关键字后定义内部类,并立即创建一个对象 • 内部类的类文件命名方法 设外层类名为Myclass,则该类的内部类名为: Myclass$c1.class (c1 为命名内部类名) Myclass$1.class (表示类中定义的第一个匿名内部类)

  36. 类中的内部类 • 在类中如同使用其他类一样使用自己的内部类。 • 内部类拥有对在外层类中定义的所有属性和方法的访问权。 • 其他类如果要使用一个类的内部类时,要使用类前缀。 8-Parcel2

  37. 类中的内部类 • 一般类只能是public和非public,而内部类可以指定为 private 和 protected。 • 如果内部类为private,只有本类可以使用它。 • 如果内部类为protected,只有外层类、与外层类处于同一包中的类、以及外层类的子类可以访问它。 • 内部类可以实现接口及抽象类中的抽象方法。 • 外层类可以将上述实现细节、乃至内部类都隐藏起来,给外界提供一个指向基类及接口的处理句柄。 8-Parcel3

  38. 方法中的内部类 • 内部类还可以定义在一个方法里,其作用域仅限于该方法的范围内(进一步隐藏),在其它方法里定义也没有名字冲突问题。 • 实现一个接口,但只返回一个句柄 • 在一编写好的代码中加一个类,但又不想公开化。 8-Parcel4

  39. 条件分支中的内部类 • 在条件分支中的内部类并不表示有条件的建立,同其他类一样,在编译时就一道解决了,内部类只是限定它的作用域(在条件分支中使用)。 if (e) {类定义} 8-Parcel5

  40. 实现接口的无名内部类 return new Contents() { //调用隐含构造函数 private int i = 11; //Contents是接口 public int value() { return i; } }; //分号表示表达式的结束 该语句将返回值同表示返回值类型的类定义结合在一起。它相当于: class MyContents implements Contents { private int i = 11; public int value() { return i; } } return new MyContents(); 8-Parcel6

  41. 有名内部类例 public class MyFrame extends Frame { … button1.addActionListener( new Button1Adapter()); … class Button1Adapter implements ActionListener { public void actionPerformed(ActionEvent e) { …. } } // end of Button1Adapter class } // end of Frame1 class

  42. 匿名内部类例 • 匿名类可实例化一个接口 button1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { …. } } ); } • 使用接口创建对象的一般途径是创建实现该接口的一个类定义,然后使用类来创建一个对象)。

More Related