Presentation is loading. Please wait.

Presentation is loading. Please wait.

西南科技大学网络教育系列课程 高级语程序设计(Java) 第五章 继承、接口与范型.

Similar presentations


Presentation on theme: "西南科技大学网络教育系列课程 高级语程序设计(Java) 第五章 继承、接口与范型."— Presentation transcript:

1 西南科技大学网络教育系列课程 高级语程序设计(Java) 第五章 继承、接口与范型

2 类的继承 继承的定义 类继承就是子类继承父类的成员变量和方法作为自己的成员变量和方法。 继承是一种由已有的类创建新类的机制。
执行继承时,子类将获得父类的属性和方法,并具有自己特有的属性和方法。 Emoloyee类: name sex Worker类: category workshop Officer类: empClass vehicle

3 继承一个类 extends关键字用于继承类。 声明一个继承父类的类的通常形式如下: class subclass-name extends superclass-name { //类体 } 没有关键字extends,默认父类为Object。 单继承,只能有一个父类,即extends后面不能有多个类的名字

4 子类的继承性 Java不支持多重继承,一个子类只有一个父类。 Object类是所有类的父类。 子类和父类在同一包中的继承性
子类自然地继承了其父类中非private的成员变量和方法作为自己的成员变量和方法。 子类继承到的成员变量以及方法的访问权限保持不变。

5 子类和父类不在同一包中的继承性 子类只能继承其父类中的public和protected成员变量和方法作为自己的成员变量和方法。 子类继承到的成员变量以及方法的访问权限保持不变。

6 子类对象的构造过程 子类的构造方法总是先调用父类的某个构造方法,如果子类的构造方法没有指明使用父类的哪个构造方法,子类就调用父类的不带参数的构造方法。 子类对象构造的结果 将子类中声明的成员变量做为子类对象的成员变量,并分配内存空间。 父类的成员变量也都分配了内存空间,但只将其中一部分(继承的那部分)做为子类对象的成员变量。

7 子类未继承的成员 引用 子类对象 子类继承的成员 子类声明的成员 子类对象内存示意图

8 成员变量的隐藏和方法的重写 成员变量的隐藏 当在子类中定义和父类中同名的成员变量时,子类就隐藏了继承的成员变量。 super.y
class A{ protected double y=12.56; } class B extends A{ int y=0; void g(){ y=y+100; System.out.printf("y=%d\n",y); 使用关键字super可以使用父类中被子类隐藏掉的成员变量。 super.y

9 方法重写 方法重写是指:子类中定义一个方法,并且这个方法的名字、返回类型、参数个数和类型与从父类继承的方法完全相同。 子类通过方法重写来隐藏继承的方法。 子类通过方法的重写可以把父类的状态和行为改变为自身的状态和行为。 使用关键字super可以使用父类中被子类隐藏掉的成员方法。

10 继承过程中,protected的访问权限不变
A B C D class A{ protected int n = 5; protected int increaseNum(int a){ return a+1; } class E{ …… D object1 = new D(); object1.firstnum = 10; object1.n = 50; } 要求E类和A类在同一个包中 要求E类和D类在同一个包中

11 Super关键字 Super关键字有两种用法 子类使用super调用父类的构造方法。 super必须是子类构造方法中的第一条语句。

12 final类和final方法 final类不能被继承,即不能有子类 final方法不能被重写

13 使用abstract类 用关键字abstract修饰类称为abstract类。
在继承的过程中,祖先类的方法更通用,这样,可以把尽可能多的通用属性和功能放到祖先类中,作为继承的基础。 这样一个祖先类,抽象程度更高,可以定义为一个抽象类。 抽象类不能被实例化,即不能用new运算符创建对象,必须产生其子类,由子类创建对象。

14 abstract class Person{ private String; public Person(String n){
name = n; } public abstract String getDescription(); public String getName(){ return name; 对于abstract方法,只允许声明,不允许实现

15 class Student extends Person{ private String major;
pulbic Student(String n,String m){ super(n); major = m; } public String getDescription(){ return “a student majoring” + major; 抽象类的子类必须实现abstract方法,即重写父类的abstract方法。

16 接 口 接口的定义 接口方法定义和常量值的集合,而没有方法的实现。 通过接口可以实现不相关类的相同行为,而不需要考虑这些类之间的层次关系
使用关键字interface定义接口 [public] interface interfaceName [extends SuperInterfaceList]{ …… // 常量和方法定义 }

17 接口的使用 接口不能实例化,即不能用new运算符创建对象。 一个类通过使用关键字implements声明自己实现一个或多个接口。 在类体中可以使用接口中定义的常量,而且必须实现接口中定义的所有方法。 接口中的方法是自动公有的,在实现接口时必须把方法声明为public。

18 class FIFOQueue implements Collection
{ void add ( Object obj ) …… } void delete( Object obj ) Object find( Object obj ) int currentCount() interface Collection { int MAX_NUM=100; void add (Object obj); void delete (Object obj); Object find (Object obj); int currentCount ( ); }

19 内部类 一个类中声明另一个类,这样的类称作内部类,而包含内部类的类成为外嵌类。
内部类同类中声明的方法或成员变量一样,一个类把内部类看作是自己的成员。 外嵌类的成员变量在内部类中仍然有效,内部类中的方法也可以调用外嵌类中的方法。 内部类的类体中不可以声明类变量和类方法。

20 class A{ private double y=12.56; class B { int y=0; public void g(){ y=y+100; System.out.printf("y=%d\n",y); }

21 匿名类 类创建对象时,除了构造方法还有类体,称作匿名类。
new Hello (){ public int getNum(){ //匿名类的类体 …… } 匿名类也是内部类,因此匿名类可以访问外嵌类中的成员变量和方法,不可以声明类变量和类方法。

22 匿名类的主要用途就是向方法的参数传值。 this.addwindowListener(new WindowAdaPter(){
publie void windowClosing(WindowEvent e){ System.exit(0); } });

23 异常类 在错误发生点,你可能不知道如何处理,但你知道无法再继续下去;你得停下来,而必须有某个地点的某个人知道如何处理才行,这就是异常及其处理。 Java运行环境就用异常类Exception的相应子类创建一个异常对象,并等待处理异常。 异常处理 使用try~catch语句捕获异常。

24 语法结构 try{ 可能产生异常的代码段; } catch(异常类名1 对象名1){ 处理语句组1; catch(异常类名2 对象名2){ 处理语句组2; ……

25 catch捕获并处理try语句块里面的异常
public class ExceptionExample{ public static void main(String[ ] args){ int n=0,m=0,t=0; try{ t=9999; m=Integer.parseInt("8888"); n=Integer.parseInt("12s3a"); System.out.println("我没有机会输出"); }catch(Exception e){ System.out.println("发生异常"); n=123; } System.out.println("n="+n+",m="+m+",t="+t); 不能转换成数字,出现异常 catch捕获并处理try语句块里面的异常

26 需要注意的问题 try语句块必须有catch语句块或finally语句块匹配。 try块内的任何代码抛出了由catch指定的异常,则: 程序跳过try块的其他代码; 程序执行catch语句块中的代码。 如果try块内没有代码出现异常,则跳过catch语句。

27 throws可以列举方法可能引发的所有异常。
通过声明方法来抛出异常,由调用者处理。 throws可以列举方法可能引发的所有异常。 Java中定义好了一些异常类,可以使用throws语句抛出该异常,由Java运行环境自动处理,比如: public static void main(String[ ] args) throws IOException{ ……………… i=Integer.parseInt(din.readLine()); ……………... }

28 自定义异常类 可以扩展Exception类实现自定义异常类。 自定义异常类必须是java.lang.Exception类(或者Exception类的子类)的子类。 java.lang.Exception类的有两个构造方法: Exception();Exception(String message)。 自定义异常类可以不定义构造方法。 SimpleException() { super(); }

29 Throw SimpleException from f() SimpleException Caught it!
class SimpleException extends Exception { public MyException() { } } public class MyExceptionDemo { public void f() throws SimpleException { System.out.println("Throw SimpleException from f()"); throw new SimpleException(); } public static void main(String[] args) { SimpleExceptionDemo sed = new SimpleExceptionDemo(); try { sed.f(); } catch(SimpleException e) { System.out.println(e); System.out.println("Caught it!"); 运行结果: Throw SimpleException from f() SimpleException Caught it!

30 泛型类 泛型(Generics)是SDK1.5中推出的,其主要目的是可以建立具有类型安全的集合框架,如链表、散列映射等数据结构。
泛型类的声明 可以使用“class 名称<泛型列表>”声明一个类。如:class A<E > 范型列表中的每个范型可以是任何对象或接口,但不能是基本类型数据。 泛型类的类体由成员变量和方法构成。

31 class Chorus<E,F>{
void makeChorus(E person,F yueqi){ person.toString(); yueqi.toString(); }

32 使用泛型类声明对象时,必须要指定类中使用的泛型的具体实际类型。
Chorus<Student,Button> model model = new Chorus<Student,Button>(); 这里是具体的类名


Download ppt "西南科技大学网络教育系列课程 高级语程序设计(Java) 第五章 继承、接口与范型."

Similar presentations


Ads by Google