




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、继承的概念,父类或超类。实际上是所有子类的公共域和公共方法的集合 子类,父类的特殊化,是对公共域和方法在功能、内涵方面的扩展和延伸 ,祖先类的所有成员均将成为子类拥有的“财富” Object类是所有类的祖先,6.1.1 Java继承的实现,import java.awt.Color; class Pixel private int x; /x坐标 private int y; /y坐标 Color c; /颜色 /其他 ,6.1.1 Java继承的实现,import java.awt.Color; class Pixel extends Point Color c; /颜色 /其他 ,只有c属
2、性是新加入的,其它属性在Point类中均存在,6.1.2 继承关系中构造方法的作用,(1) 当子类未定义构造方法时,创建对象时将无条件地调用父类的无参构造方法; (2) 对于父类的含参数构造方法,子类可以在自己构造方法中使用关键字super来调用它,但super调用语句必须是子类构造方法中的第一个可执行语句; (3) 子类在自己定义构造方法中如果没有用super明确调用父类的构造方法,则在创建对象时,将自动先执行父类的无参构造方法,然后再执行自己定义的构造方法。,以下程序在编译时将出错,为什么?,class parent String my; public parent(String x) m
3、y=x; public class subclass extends parent ,【例6-1】类的继承中构造方法的调用测试,import java.awt.Color; class Point private int x, y; public Point(int x, int y) /有参构造方法 this.x = x; this.y = y; public Point() / 无参构造方法 this(0,0); / 用this调用本类的另一构造方法 public String toString() String s = 点: + x + ,+ y; return s; ,this代表当前
4、对象,【例6-1】续,public class Pixel extends Point Color c; public Pixel(int x,int y,Color c) super(x,y); /用super调用父类的构造方法 this.c=c; public String toString() return super.toString() +颜色:+c; / 用super访问父类的方法 public static void main(String a) Pixel x=new Pixel (3,24,Color.blue); System.out.println(x); ,super代
5、表父类对象,【注意】使用this查找匹配的方法时首先在本类查找,找不到时再到其父类和祖先类查找;使用super查找匹配方法时,首先到直接父类查找,如果不存在,则继续到其祖先类逐级往高层查找。,6.2.1 方法的重载(例),public class A void test(int x) System.out.println(test(int): + x ); void test(long x) System.out.println(test(long): + x ); void test(double x) System.out.println(test(double): + x); publi
6、c static void main (String args) A a1 = new A(); a1.test(5.0); a1.test(5); ,6.2 多态性,方法调用的匹配处理原则是,首先按“精确匹配”原则去查找匹配方法,如果找不到,则按“自动类型转换匹配”原则去查找能匹配的方法。 所谓“精确匹配”就是实参和形参类型完全一致。 所谓“自动转换匹配”是指虽然实参和形参类型不同,但能将实参的数据按自动转换原则赋值给形参。 【思考】 如果将test(int x)方法注释掉,则调用test(5)如何? 以上3个方法中,如果只将test(double x)方法注释掉,程序能编译通过吗?,例6-
7、3 复数的加法,public class Complex private double x, y; /x,y分别代表复数的实部和虚部 public Complex(double real, double imaginary) x = real; y = imaginary; public String toString() return (+ x+,+y+i+); /* 方法1: 将复数与另一复数a相加 */ public Complex add(Complex a) /实例方法 return new Complex(x+a.x ,y+a.y); ,/* 方法2: 将复数与另一个由两实数a,b
8、构成的复数相加 */ public Complex add(double a,double b) /实例方法 return new Complex(x+a , y+b); /* 方法3:将两复数a和b相加 */ public static Complex add(Complex a, Complex b) /静态方法 return new Complex(a.x+b.x , a.y+b.y); ,public static void main(String args) Complex x,y,z; x=new Complex(4,5); y=new Complex(3.4,2.8); z= a
9、dd(x,y); /调用方法3进行两复数相加 System.out.println(result=+z); z= x.add(y); /调用方法1进行两复数相加 System.out.println(result=+z); z= y.add(4,5); /调用方法2进行两复数相加 System.out.println(result=+z); ,6.2.2 方法的覆盖,以下类B定义的方法中,方法覆盖如何? class B extends A protected void test(int x) System.out.println(in B.test(int): + x); protected
10、void test(String x , int y) System.out.println(in B.test(String,int): + x+,+y); 【思考】通过子类B的对象可调用多少test方法?,关于方法覆盖有以下问题值得注意:,方法名、参数列表、完全相同才会产生方法覆盖;返回类型通常也要一致,只有返回类型为引用类型时,允许子类方法的返回类型是父类方法返回类型的子类型。其他情形导致类型不一致时编译将指示错误。 覆盖不能改变方法的静态与非静态属性。子类中不能将父类非静态方法定义为静态方法,反之也一样。 不允许子类方法的访问修饰符比父类有更多的限制。例如:子类不能将父类的public
11、方法定义为protected方法。但可以将父类的private方法在子类中重新定义为public方法. final方法不能被覆盖。,注意几点:,如果子类中定义了与父类同名的属性,在子类中将隐藏来自父类的同名属性变量。 对象执行方法时由实际对象的类型决定,而不是引用变量类型 ; 访问属性时则由引用类型决定,因为编译程序在分析程序时是基于类型来决定访问哪个属性变量 ; 静态成员的访问是基于引用类型,而不是对象类型.,【例6-4】访问继承的成员,class SuperShow int y = 8; / 父类SuperShow的y属性 int m = 2; void show() / 父类SuperS
12、how的show方法 System.out.println(sup.show,y=+y); public class ExtendShow extends SuperShow int y = 20; / 子类ExtendShow的y属性 int z = 1; void show() / 子类B的show方法 System.out.println(ext. show,y=+y); ,每个子类对象有4个属性,y z super.y m,public static void main(String args) ExtendShow b = new ExtendShow (); SuperShow a
13、 = b; System.out.println(ext.y= + b.y); System.out.println(sup.y= + a.y); b.show(); a.show(); System.out.println(z=+b.z+,m=+b.m); ,class SuperShow int y = 8; int m = 2; void show() System.out.println(sup.show,y=+y); public class ExtendShow extends SuperShow int y = 20; int z = 1; void show() System.
14、out.println(ext. show,y=+y); ,对象引用,6.3.1 Object类,Object类是所有Java类的最终祖先, 以下给出了3个常用方法: public boolean equals(Object obj) :该方法本意用于两个对象的“深度”比较,也就是比较两对象封装的数据是否相等;而比较运算符“=”在比较两对象变量时,只有当两个对象引用指向同一对象时才为真值。但在Object类中,equals方法是采用“=”运算进行比较; public String toString():该方法返回对象的字符串描述; public final Class getClass():返
15、回对象的所属类; protected void finalize(): 该方法Java垃圾回收程序在删除对象前自动执行。,例6-5 给Point类增加equals方法,public class Point private int x, y; public Point(int x,int y) this.x=x; this.y=y; public boolean equals(Point p) return (x=p.x ,public static void main(String arg) Point x=new Point(4,3); System.out.println(x=+x); S
16、ystem.out.println( x.equals(new Point(4,3) ); ,【思考】 观察有无toString()方法时程序运行结果的变化。 观察有无equals(Point p)方法程序运行结果的变化。,6.3.2 Class类,1获取Class类型的对象 Class类封装一个对象和接口运行时的状态,当装载类时,Class类型的对象自动创建。有以下3种方法可以获取Class的对象。 方法1:调用Object类的getClass()方法。 方法2:使用Class类的forName()方法。 方法3:如果T是一个Java类型,那么T.class就代表了与该类型匹配的Class对
17、象。例如,String.class代表字符串类型,int.class代表整数类型。,2Class类的常用方法,static Class forName(String className):返回给定串名相应的Class对象。 T newInstance():创建类的一个实例。 StringgetName():返回Class对象表示的类型(类、接口、数组或基类型)的完整路径名字符串。 MethodgetMethods():返回当前Class对象表示的类或接口的所有公有成员方法对象的数组。 进一步利用Method类提供的invoke方法可实现相应类的成员方法的调用。 Object invoke(Ob
18、ject obj,Object args) 其中,obj代表调用该方法的类实例对象,args代表存放方法参数的对象数组。 Method getMethods(String name,ClassparameterType):返回指定方法名和参数类型的方法对象。 Field getFields():返回当前Class对象表示的类或接口的所有可访问的公有域对象的数组。,【例6-6】 反射机制简单测试举例。,import java.lang.reflect.*; class Test public int add(int x,int y) return x+y; public int minus(in
19、t x,int y) return x-y; public class A public static void main(String args) throws Exception Class myclass = Class.forName(Test); System.out.println(myclass.getName( ); Object x = myclass.newInstance( ); /获取Test类的一个对象 Method m = myclass.getMethods( ); /获取Test类的所有方法 Object Args = new Object 1,2;,for (
20、int i = 0; i 2; i+) System.out.println(mi.toString( ); System.out.println(m0.invoke(x, Args); /调用对象的第1个方法 Method addm = myclass.getMethod(add,int.class ,int.class); System.out.println(addm.invoke(x, Args); /调用add方法 ,6.4.1 公共访问控制符 public,作为类的修饰符,将类声明为公共类, 表明它可以被所有的其它类所访问和引用 作为类的成员的访问修饰符,表明在其他类中可以无限制地
21、访问该成员。 要真正做到类成员可以在任何地方访问,在进行类设计时必须同时满足两点:首先类被定义为public,其次,类的成员被定义为public。,6.4.2 缺省访问控制符,没有给出访问控制符情形 该类只能被同一个包中的类访问和引用,6.4.3 私有访问控制符 private,用private修饰的域或方法只能被该类自身所访问 【例6-7】 测试对私有成员的访问。 class Myclass private int a; /私有变量 void display() System.out.println(a); public class test public static void main(
22、String arg) Myclass my=new Myclass(); my.a=5; my.display(); ,6.4.4 保护访问控制符 protected,用protected修饰的成员可以在三种类中所引用: 该类本身; 与它在同一个包中的其它类; 在其它包中的该类的子类。,【例6-8】测试包的访问控制,文件1:PackageData.java(该文件存放在sub子目录下) package sub;public class PackageData protected static int number=1; 文件2:Mytest.java import sub.*;public
23、class Mytest public static void main( String args ) System.out.println(result=+PackageData.number); ,各类访问控制符的作用,6.5final修饰符,final作为类修饰符 -最终类 (不能有子类) 用final修饰方法 -不能被子类重新定义 用final定义常量 -只能赋值一次 注意: 如果将引用类型的变量标记为final,那么该变量固定指向一个对象,但可以改变对象内的属性值。,例6-9 常量赋值测试,public final class test public static int totalNumber=5; public final int id; public int weight; public test(int weight) id=totalNumber+; this.weight=weight; public static void main(String args) final test t=new test(5); t.weight=t.weight+2; t=new test(4); /不允许 t.id+; /不允许 ,6.6.1 对象引用赋值转换,Object x=new Apple(); Fruit m=ne
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二年级口算题目练习汇编100道
- 中华料理供货合同范本
- 2025年河南省建筑安全员C证考试题库
- 临时工协议合同范本广州
- 医疗耗材补充合同范本
- 健身房设备采购合同范本
- 企业有效法律合同范本
- 厂家网店授权合同范本
- 出租美甲店合同范本
- 印刷 服务 采购合同范本
- 妊娠期合并症妇女的护理-妊娠合并心脏病的护理(妇产科护理课件)4EX
- 南航航空安全员培训
- 中职语文高教版基础模块上册《风景谈》公开课一等奖创新教学设计
- 汪小兰有机化学课件第四版
- Unit1 My day 单元作业设计(素材)人教PEP版英语五年级下册
- 赢的思考与态度课件
- 2024年2月国考海关面试题目及参考答案
- TZSA 158-2023 双引擎分布式视频处理器技术规范
- 2型糖尿病科普讲座课件
- 术中物品清点不清时应急预案及流程课件
- 第1课《生存的家园》课件
评论
0/150
提交评论