大理学院课程教案(教学内容)
【例3-6】 import c#.io.*; class A{ void callme( ) { Console.WriteLine(\ } } class B extends A{ void callme( ) { Console.WriteLine(\ } } public class Dispatch{ public static void main(String args[]) { A a=new B(); a.callme( ); } } ◇ 方法重写时应遵循的原则: 1)改写后的方法不能比被重写的方法有更严格的访问权限(可以相同)。 2)改写后的方法不能比重写的方法产生更多的例外。 5. 其它 ◇ final 关键字 final 关键字可以修饰类、类的成员变量和成员方法,但final 的作用不同。
第15页
大理学院课程教案(教学内容)
1) final 修饰成员变量: final修饰变量,则成为常量,例如 final type variableName; 修饰成员变量时,定义时同时给出初始值,而修饰局部变量时不做要求。 2) final 修饰成员方法: final修饰方法,则该方法不能被子类重写 final returnType methodName(paramList){ … } 3) final 类: final修饰类,则类不能被继承 final class finalClassName{ … } ◇ 实例成员和类成员 用static 关键字可以声明类变量和类方法,其格式如下: static type classVar; static returnType classMethod({paramlist}) { … } 如果在声明时不用static 关键字修饰,则声明为实例变量和实例方法。 1) 实例变量和类变量 每个对象的实例变量都分配内存,通过该对象来访问这些实例变量,不同的实例变量是不同的。 类变量仅在生成第一个对象时分配内存,所有实例对象共享同一个类变量,每个实例对象对类变量的改变都会影响到其它的实例对象。类变量可通过类名直接访问,无需先生成一
第16页
大理学院课程教案(教学内容)
个实例对象,也可以通过实例对象访问类变量。 2) 实例方法和类方法 实例方法可以对当前对象的实例变量进行操作,也可以对类变量进行操作,实例方法由实例对象调用。 但类方法不能访问实例变量,只能访问类变量。类方法可以由类名直接调用,也可由实例对象进行调用。类方法中不能使用this或super关键字。 例3-7 是关于实例成员和类成员的例子。 【例3-7】 class Member { static int classVar; int instanceVar; static void setClassVar(int i) { classVar=i; // instanceVar=i; // 类方法不能访问实例变量 } static int getClassVar() { return classVar; } void setInstanceVar(int i) { classVar=i; //实例方法不但可以访问类变量,也可以实例变量 instanceVar=i; } int getInstanceVar( ) { return instanceVar; } } public class MemberTest{ public static void main(String args[]) {
第17页
大理学院课程教案(教学内容)
Member m1=new member(); Member m2=new member(); m1.setClassVar(1); m2.setClassVar(2); Console.WriteLine(\ m2.ClassVar=\ m1.setInstanceVar(11); m2.setInstanceVar(22); Console.WriteLine(\ ()+\ } } ◇ 类c#.lang.Object 类c#.lang.Object处于c#开发环境的类层次的根部,其它所有的类都是直接或间接地继承了此类。该类定义了一些最基本的状态和行为。下面,我们介绍一些常用的方法。 equals() :比较两个对象(引用)是否相同。 getClass():返回对象运行时所对应的类的表示,从而可得到相应的信息。 toString():用来返回对象的字符串表示。 finalize():用于在垃圾收集前清除对象。 notify(),notifyAll(),wait():用于多线程处理中的同步。 抽象类 c#语言中,用abstract 关键字来修饰一个类时,这个类叫做抽象类,用abstract 关键字来修饰一个方法时,这个方法叫做抽象方法。格式如下: abstract class abstractClass{ …} //抽象类 abstract returnType abstractMethod([paramlist]) //抽象方法 抽象类必须被继承,抽象方法必须被重写。抽象方法只需声明,无需实现;抽象类不能
第18页
大理学院课程教案(教学内容)
被实例化,抽象类不一定要包含抽象方法。若类中包含了抽象方法,则该类必须被定义为抽象类。 接口 接口是抽象类的一种,只包含常量和方法的定义,而没有变量和方法的实现,且其方法都是抽象方法。它的用处体现在下面几个方面: ◇ 通过接口实现不相关类的相同行为,而无需考虑这些类之间的关系。 ◇ 通过接口指明多个类需要实现的方法。 ◇ 通过接口了解对象的交互界面,而无需了解对象所对应的类。 1)接口的定义 接口的定义包括接口声明和接口体。 接口声明的格式如下: [public] interface interfaceName[extends listOfSuperInterface] { … } extends 子句与类声明的extends子句基本相同,不同的是一个接口可有多个父接口,用逗号隔开,而一个类只能有一个父类。 接口体包括常量定义和方法定义 常量定义格式为:type NAME=value; 该常量被实现该接口的多个类共享; 具有public ,final, static的属性。 方法体定义格式为:(具有 public和abstract属性) returnType methodName([paramlist]); 2)接口的实现 在类的声明中用implements子句来表示一个类使用某个接口,在类体中可以使用接口中定义的常量,而且必须实现接口中定义的所有方法。一个类可以实现多个接口,在implements子句中用逗号分开。 3) 接口类型的使用 接口作为一种引用类型来使用。任何实现该接口的类的实例都可以存储在该接口类型的变量中,通过这些变量可以访问类所实现的接口中的方法。
第19页