1、类、对象和接口,-李冉,J2EE网络编程课件,2,修饰符,3,方法重载,方法重载是指一个类中可以有多个方法具有相同的名字,但这些方法的参数必须不同,即或者是参数的个数不同,或者是参数的类型不同。(类的构造方法) class Area float getArea(float r)return 3.14f * r * r; double getArea(float x,int y) return x * y;float getArea(int x,float y) return x*y; double getArea(float x,float y,float z) return (x*x+y*y
2、+z*z)*2.0; ,注:方法的返回类型和参 数的名字不参与比较。,4,每次创建一个实例都需要初始化所有变量,Java允许对象在创建时就初始化。而这种自动初始化是通过使用构造方法(Constructor)来实现的。构造方法的名字与包含它的类相同,在语法上类似于一个方法。构造方法没有返回值,甚至连void修饰符都没有。因为一个类的构造方法返回值应是该类本身。,构造方法,5,(1)构造函数的方法名与类名相同; (2)构造函数没有返回类型; (3)如果类中没有定义构造函数,编译器会自动创建一 个缺省的、不带参数的构造函数; (4)构造函数的主要作用是完成对类对象的初始化工作; (5)构造函数不能由
3、程序显式地直接调用; (6)在创建一个类的新对象的同时,系统会自动调用该 类的构造函数为新对象初始化。,构造方法的特殊性,6,一个对象的生命周期是: 创建使用销毁。 创建对象时执行构造方法 4.3.4 对象的销毁时使用析构方法finalize() 销毁一个对象 Java的垃圾回收机制自动判断对象是否在使用,并能够自动销毁不再使用的对象,收回对象所占的资源。,对象生命周期,7,为什么要有this和super引用? 在子类继承父类的过程中,子类新增的成员变量与成员方法的名称与父类的可能一样。或者在同一个类中的成员方法的参数和成员变量的名字相同。,this、super引用和instanceof对象运
4、算符,8,this 代表当前对象本身(当前对象的引用),以区分于同名的局部变量和其他同名的方法。有时方法体中定义的变量和成员变量名字相同,还有时方法的入口参数和成员变量名字相同,这就需要将三者区别清楚,可以使用 this 专门指明当前对象的成员变量或当前对象的方法。,Class ThreeNumber int x,y,z; ThreeNumber(int x,int y,int z) this.x=x; this.y=y; this.z=z; ,this关键字,9,在 java 中父类可以派生子类,子类的成员变量、子类的方法可以和父类的成员变量、父类的方法同名。当需要调用父类的同名成员变量或方
5、法时,可以在子类中使用关键字 super 作前缀,指明父类的成员变量或方法。super( ) 表示调用父类的构造函数super.f( ) 表示调用在父类中声明的方法 f( )。super.number 表示调用父类中的成员变量 number 。,程序,super关键字,10,使用super调用父类的构造方法,子类不继承父类的构造方法,因此,子类如果想使用父类的构造方法,必须在子类的构造方法中使用,并且必须使用关键字super表示,而且super必须是子类构造方法中的头一条语句。需要注意的是,如果在子类的构造方法中,没有显示使用super关键字调用父类的某个构造方法,那么默认地有super();
6、语句,即调用父类的不带参数的构造方法。如果父类没有提供不带参数的构造方法,就会出现错误。,11,使用super操作被隐藏的成员变量和方法,如果我们在子类中想使用被子类隐藏了的父类的成员变量或方法就可以使用关键字super。比如super.x、super.play()就是被子类隐藏的父类的成员变量x和方法play()。,12,对象运算符instanceof用来测试一个指定对象是指定类(或它的子类)的实例,若是则返回true,否则返回false。,instanceof对象运算符,13,访问权限,使用修饰符private、protected和public来说明访问权限。 4.7.1 私有变量和私有方
7、法修饰符:privateclass Tom private float weight; /weight被修饰为私有的private float f(float a,float b) /方法f是私有方法,14,补充,权限修饰符允许的访问级别,15,类的继承,4.8.1 创建子类 4.8.2 子类的继承性 4.8.3 成员变量的隐藏和方法的重写 4.8.4 final类final方法,16,继承是一种由已有类创建新类的机制。实现代码的复用和事物的抽象,图示 继承性,17,创建子类,在类的声明中,通过使用关键字extends来创建一个类的子类,格式如下: class 子类名 extends 父类名
8、例如:class Students extends People ,18,子类的继承性,子类和父类在同一个包中的继承性如果子类和父类在同一个包里,那么子类自然地继承了其父类 中不是private的成员变量作为自己的成员变量,方法同样。2. 子类和父类不在同一个包中的继承性如果子类和父类不在同一个包中,那么子类继承了父类的protected、public成员变量作为子类的成员变量,方法类似于变量。子类不能继承父类的友好变量和友好方法。,19,成员变量的隐藏和方法的重写,当我们在子类中定义的成员变量和父类中的成员变量同名时,则父类中的成员变量不能被继承,此时称子类的成员变量隐藏了父类的成员变量。当
9、子类中定义了一个方法,并且这个方法的名字、返回类型及参数个数和类型同父类的某个方法完全相同时,父类的这个方法将被隐藏。也就是说,我们重写了父类的方法或置换了父类的方法。,20,多态性,多态(polymorphism):在一个类中,可以定义多个同名的方法,只要保证它们的参数个数和类型不同即可,这就叫类的多态。好处:使得程序简洁给程序员带来方便。当程序要实现多个相近的功能时,就给相应的方法起一个相同的名字,用不同的参数代表不同的功能。这样在使用时,不论传递什么参数,只要能被程序识别就可以得到确定的结果。实现类的多态性有两种方法:重载和覆盖,21,方法的覆盖,子类继承超类中所有可被子类访问的成员方法
10、,如果子类方法与超类方法同名,则不能继承,此时子类的方法称作覆盖(override)了超类中的那个方法。 在进行覆盖时,应注意以下3点: 子类不能覆盖超类中声明为final或static的方法。 子类必须覆盖超类中声明为abstract的方法,或者子类也声明为abstract。 子类覆盖超类中同名方法时,子类方法声明必须与超类被覆盖方法的声明一样。,22,abstract类和abstract方法,用关键字abstract修饰类称为abstract类(抽象类) 格式:abstract class A例如:abstract class D1 /合法,D1为抽象类class D2 extends D
11、1 /合法,D2可以为抽象类的子类D1 vd1=new D1() /非法,抽象类不能实例化D2 vd2=new D2() /合法,抽象类可由其子类创建对象,23,abstract类和abstract方法(续),abstract方法只允许声明,不允许实现。如abstract void draw();如果一个类是一个abstract类的子类,它必须具体实现父类的abstract方法。如果一个类中含有abstract方法,那么这个类必须用abstract来修饰( abstract 类可以没有abstract 方法)。一个abstract类只关心它的子类是否具有某种功能,并不关心功能的具体行为,功能的
12、具体行为由子类负责实现。,24,接口,Java只支持单继承机制,不支持多继承,即一个类只能有一个父类。单继承性使得Java结构简单,层次清楚,易于管理,更安全可靠。Java提供了接口用于实现多重继承,一个类可以实现多个接口。这样,既实现了多重继承的功能,同时又避免了C+中因多重继承而存在的安全隐患。,25,接口的声明与使用,1. 接口声明 接口(interface)从数据结构上看接口是一种特殊的类。是没有实现的方法和变量的集合。格式为:interface 接口名方法1;方法2;,可以是public或者省略,省略时接口只能被他同处一包的成员访问,当是public时,接口可被任何地方的类成员访问。
13、,26,说明,例如:interface Myinterfacevoid method1(); 注意: 接口定义用关键字interface,而不是class。 修饰符public用来指示任意一个类都可以调用此接口,如果没有public修饰则该接口只能被那些与本接口在同一个包里的类访问。 接口中的方法都是抽象方法,即默认的都是用public和abstract修饰符修饰的,即使没有写出来这两个修饰符也是如此。 如果接口声明为默认,接口中的变量全部隐含为final和static,并且即使接口的定义中没有说明他们为final和static时也是如此,它们不能被实现接口的类改变,且必须设置初值。 接口没有
14、构造方法。 接口也有继承性,可以通过extends关键字声明接口的父接口,而且可以有一个以上的父接口。,27,Java允许多个类实现同一个接口,这些类之间可以是毫无联系的,每个类各有自己实现方法的细节。这一点与继承机制不同。同时一个类也能实现多个接口,这就解决了多重继承的问题,如下所示:,2. 接口体(续),28,3. 接口的使用,实现接口的类声明的格式是:修饰符class类名extends超类名 implements接口名1,接口名2, 注意: 类的修饰符可以是public或者是默认的。在类中,用implements关键字调用接口,一个类可以调用多个接口,这时要在implements后用逗号
15、隔开多个接口的名字。如果实现某接口的类不是abstract修饰的抽象类,则在类的定义部分必须实现指定接口的所有抽象方法,而且方法头部分应该与接口中的定义完全一致,另外所有的方法用public修饰。如果实现某接口的类是abstract修饰的抽象类,则他可以不实现该接口中的所有方法。但是对于这个抽象类的任何一个非抽象的子类而言,他们父类所实现的接口中的所有抽象方法都必须有实在的方法体,不允许存在未被实现的接口方法。接口的抽象方法的访问限制符都已被指定为 public ,所以类在实现这些抽象方法时,必须显式的使用 public 修饰符。,29,例4.2 实现接口的类。 interface Stude
16、nt_info /学生情况接口 int year = 2002;int age();void output(); public class Stu1 implements Student_info /实现学生情况接口 String name; int birth_year; /类自己的成员变量public Stu1(String n1,int y) name = n1;birth_year = y; public int age() /实现接口的方法 return year - birth_year; public void output() /实现接口的方法 System.out.print
17、ln(this.name +“ “+ this.age()+“岁“); public static void main (String args) Stu1 s1 = new Stu1(“李明“,1980);s1.output(); ,举例Stu1.java,举例,30,例 一个类实现多个接口,本例声明一个接口Student_scoure表示学生成绩,其中有两个成员方法total和output。 interface Student_scoure /学生成绩接口 float total();void output(); 本例声明的类Stu2实现两个接口Student_info和Student_scoure,此时必须写出两个接口中的所有方法。,举例Stu2.java,31,接口回调,接口回调:可以把实现某一接口类创建的对象的引用赋给该接口声明的接口变量,那么该接口变量就可以调用被类实现的接口中的方法。实际上,当接口变量调用被类实现的接口中的方法时,就是通知相应的对象调用接口的方法。,