资源预览内容
第1页 / 共46页
第2页 / 共46页
第3页 / 共46页
第4页 / 共46页
第5页 / 共46页
第6页 / 共46页
第7页 / 共46页
第8页 / 共46页
第9页 / 共46页
第10页 / 共46页
亲,该文档总共46页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第 6 章 类的扩展精读本章引言!6.1 扩展类之例研究Attr和ColorAttr这两个类的代码 6.2 扩展类中的构造器精读本节正文和代码!以下代码说明P108第一行文字含义class MyException extends Exception class X int x; X() throws MyException throw new MyException(); X(int y) try this(); catch (MyException e) System.out.println(e.toString(); x=y; 以下代码说明利用可能引发异常的构造器创建对象class MyException extends Exception class X int x; X(int y) x=y; X() throws MyException throw new MyException(); class Y public static void main(String args) X r=new X(1); try r=new X(); catch (MyException e) System.out.println(“error“); System.out.println(r.x);6.3 方法的改写和域的隐藏精读本节正文和代码!本节补充代码如下补充代码1:子类继承下来的方法操作继承下来的域class SuperClass int x;void method() x=1;class SubClass extends SuperClass int x;static void main(String args) SubClass rSub=new SubClass();SuperClass rSuper=rSub;rSub.method(); /rSuper.method();System.out.println(rSuper.x+“,“+rSub.x);补充代码2:子类继承下来的方法使用改写后的方法class SuperClass int x;void method0() method1();void method1() x=11;class SubClass extends SuperClass int x;void method1() x=2; public static void main(String args) SubClass rSub=new SubClass();SuperClass rSuper=rSub;rSub.method0();System.out.println(rSuper.x+“,“+rSub.x);问题: 如果用private修饰method1(), 情况如何?6.4 类型兼容与类型转换精读本节正文和代码!6.5 protected的真正含义 protected成员在包外可以在扩展类中通过对象引用 的方式被访问,但该引用应该与该扩展类具有同样 的类型或其子类型,书上例 一个综合例文件一: . package1Point.javapackage package1;public class Point public double x=1;protected int c=4; 文件二: .Demo.javaimport package1.*;class Demo1 extends Point int y=2;void method1() System.out.println(“method1:“+this.c);Point o=new Point();/System.out.println(“method1:“+o.c);class Demo2 extends Point int z=3;void method2() System.out.println(“method2:“+c);void method3() Demo1 o=new Demo1(); o.method1();/System.out.println(o.c+1);Demo3 o1=new Demo3();System.out.println(o1.c+1); class Demo3 extends Demo2 void method4() System.out.println(c+2);Demo2 o2=new Demo2();/System.out.println(o2.c+3); class Demo static void main(String args) Demo2 w=new Demo2();Demo3 w1=new Demo3();w.method2();w.method3();w1.method4();Demo1 p=new Demo1();/System.out.println(p.c); protected静态成员可被任何扩展类访问 一个综合例文件一: . package1Point.javapackage package1;public class Point public double x=1;protected static int c=4; 文件二: .Demo.javaimport package1.*;class Demo1 extends Point void method1() System.out.println(Point.c); class Demo2 extends Demo1 void method2() System.out.println(Point.c);System.out.println(Demo1.c); class Demo static void main(String args) /System.out.println(Point.c);Demo1 o1=new Demo1();o1.method1();Demo2 o2=new Demo2();o2.method2(); protected成员在同一包中可被任何代码访问例:可以使用super访问超类的protected成员.package1P.javapackage package1;public class P protected int x=1;.MyClass.javaimport package1.*;public class MyClass extends P int x=2;void method() System.out.println(super.x);System.out.println(x);static void main(String a) MyClass obj=new MyClass();obj.method();另例:super在类层次中寻找最邻近的超类class A int x=1;class B extends A int x=2;class C extends B int x=3;void methodC()System.out.println(super.x);public static void main(String args) C obj=new C();obj.methodC();结果为2综合例:class MyClass int x=1;class MySubClass extends MyClass int y=2;class MySubClass1 extends MySubClass int y1=3;class MyClass1 int z;void method(Object o) System.out.println(“OK“);void method(MySubClass o) System.out.println(o.y);class Demo static void main(String args) MyClass1 p=new MyClass1();MySubClass p1=new MySubClass();p.method(p1);/2p.method(“Hello“);/OkMyClass p2=p1;p.method(p2);/Ok,利用引用类型进行最优匹配MySubClass1 p3=new MySubClass1();p.method(p3);/26.6 final方法和类 标记为final的域为常量 把一个方法标记为final,意思是扩展类不能在改写 它的实现,即这是该方法的最终版本 一个类标记为final后,不能再派生子类,final类的 所有方法隐含地成为final 虽然final类不能再派生子类,但却仍然可以定义引 用和创建对象 final方法有两个重要作用:安全性和优化。精读本 节相关正文和代码!6.7 抽象的类和方法 没有给出具体实现的方法称为抽象方法,标记为 abstract 包含抽象方法的类必须用abstract标记为抽象类 抽象类只能用来派生子类,不能用来创建对象,但 可以用来定义引用 抽象类中可以没有抽象方法 抽象类中的抽象方法必须被其非抽象子类实现,否 则该子类也必须是抽象的 抽象类不能再标记为final,final类也不能是抽象的 ,因此final类不能有抽象方法 静态方法是类特有的,不能是抽象的6.8 Object类 Object类是类层次的根,所有的类都直接或间接地 扩展了Object类,所以一个Object类型的变量可以 引用任何对象,但不能持有基本类型的值,如果需 要,可使用包装类的对象。 Object类定义了一组供所有对象继承的方法。这些 方法被分为两个范畴:通用的工具方法和支持线程 的方法。 Object类中定义了一个如下equals方法,public boolean equals(Object obj),比较当前对象与obj 所引用的对象是否相等(对象的相等性);如果要 检测两个引用是否指向同一对象(同一性 ),可 使用=和!=来比较。 Object中equals的缺省实现假 定一个对象只与自身相等,故此可以说equals的缺 省实现认为相等性和同一性是一样的。class A int x; public static void main(String args) A r1,r2; r1=r2=new A(); System.out.println(r1=r2)+“,“+r1.equals(r2); r2=new A(); System.out.println(r1=r2)+“,“+r1.equals(r2); Object类中定义了一个如下hashCode方法,public int hashCode(),返回这个对象的散列码,每个 对象都有一个散列码,缺省实现返回一个值,该值 对不同对象通常是唯一的。例class A int x; public static void main(String args) A r1,r2; r1=r2=new A(); System.out.println(r1.hashCode()+“,“+ r2.hashCod
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号