java继承学习教案

上传人:莉**** 文档编号:88737202 上传时间:2022-05-11 格式:PPT 页数:50 大小:1.25MB
返回 下载 相关 举报
java继承学习教案_第1页
第1页 / 共50页
java继承学习教案_第2页
第2页 / 共50页
java继承学习教案_第3页
第3页 / 共50页
点击查看更多>>
资源描述
会计学1java继承继承(jchng)第一页,共50页。一般(ybn)具体动物蛇蜥蜴鲸爬行动物哺乳动物狗巨蜥 壁虎壁虎 是一种 蜥蜴 爬行动物是 动物的 一种第1页/共49页第二页,共50页。最顶端的类是Object,它在中定义(dngy),是所有类的始祖。一个类可以有多个子类,也可以没有子类,但它必定有一个父类(Object除外)。第2页/共49页第三页,共50页。parent class父类子类child classbase class基类派生类derived classsuper class超类次类subclass扩展类extended class继承:子类从父类中继承可访问的数据(shj)域和方法,也可以添加新数据(shj)域和新方法。第3页/共49页第四页,共50页。public class A public int a = 10; protected int b = 20; int c = 30; private int d = 40; public int getD() return d; public class B extends A public int e; public void tryVariables() System.out.println(a); /允许(ynx) System.out.println(b); /允许(ynx) System.out.println(c); /同包则允许(ynx) System.out.println(d); /不允许(ynx) System.out.println(getD(); /允许(ynx) 不能继承(jchng)访问权限为private的成员变量和方法第4页/共49页第五页,共50页。注意:1、子类可以继承父类中可访问的【访问权限设定为public, protected或无权限修饰符(若同包)】成员变量和方法。但是不能继承访问权限为private的成员变量和方法。2、父类的构造方法不能被子类继承。3、一个类只能(zh nn)有一个直接父类。4、父类包括所有直接或间接被继承的类。5、子类和父类的关系为 is aclass B extends A class A 第5页/共49页第六页,共50页。public class Person public String name;public String getName() return name; public class Employee extends Person public int employeeNumber; public int getEmployeeNumber() return employeeNumber; public class Manager extends Employee public String responsibilities; public String getResponsibilities() return responsibilities; Manager 继承(jchng)了Employee、Person和Object类第6页/共49页第七页,共50页。三个类的UML表示(biosh)Color第7页/共49页第八页,共50页。class A private int x = 1; int y; void printX() System.out.println(x); class B extends A int z;public class Test public static void main(String s) B b = new B(); b.printX();x=1y=0printX()z=0bB类对象(duxing)A类对象(duxing)Object类对象toString()clone()其它第8页/共49页第九页,共50页。this用途1:成员变量和局部变量重名时 this.用途2:构造方法中调用另一构造方法,简化(jinhu)代码。如this(参数)Super(first line)用途1:使用从父类继承来的被隐藏属性 super.变量使用从父类继承来的方法也可间接访问这些属性用途2:子类构造方法中调用父类的构造方法 super() super(参数)用途3:调用父类的普通方法 super.方法(参数)第9页/共49页第十页,共50页。11.3.1 在子类构造方法中调用(dioyng)父类的构造方法构造方法不会被继承(jchng)调用父类的构造方法必须用super,而且必须是构造方法的第一条语句语法:super() 或 super(参数)第10页/共49页第十一页,共50页。class Person String name; int id;/身份证号 Student(String name, int id) this.name = name; this.id = id; class UniStudent extends Person String university; String school; UniStudent(String name, int id) this(name, id, “西南大学”, “计信院);/此行删除(shnch)编译错 UniStudent(String name, int id, String university, String school) super(name, id); /此行删除(shnch)编译错 this.university = university; this.school = school; public class Test public static void main(String arguments) UniStudent s = new UniStudent(张三(zhn sn),201622); 第11页/共49页第十二页,共50页。说明:1、每一个构造方法,如果既没有用this(可能有参数)来调用本类的另一个构造方法,也没有用super(可能有参数)来调用父类的某个构造方法,那么,编译器将在其第一行为它添加(tin ji)super(),以此来调用父类的无参构造方法。2、构造方法中,this()或者super()必须是第一条语句。所以,this()和super()不可能并存,也不可能有两条this()或两条super()。第12页/共49页第十三页,共50页。l利用super可以调用父类的构造函数lsuper(参数)调用父类的的构造函数。l必须(bx)是子类构造函数的第一条语句。l如果子类构造函数中没有显式地调用父类的构造函数,那么将自动调用父类的无参构造函数。l这就是为什么先构造父类,再构造子类l父类的构造函数在子类构造函数之前执行。l调用父类的成员l(如果父类属性在子类可访问)lsuper.method(parameters)(如果父类方法在子类可访问)lCircle代码里可以写getDateCreated()或super.getDateCreated()l不能使用super.super.p()这样的super链第13页/共49页第十四页,共50页。11.3.2 构造方法链子类A无构造方法public A()super();public A()public A()super();public A(参数(cnsh)super();语句public A(参数(cnsh)语句;自动(zdng)添加无参构造方法自动添加自动添加等价于等价于等价于没有this()没有super()没有this()没有super()第14页/共49页第十五页,共50页。构造方法链l在任何(rnh)情况下,构造一个类的实例时,会沿着继承链调用所有父类的构造方法,这叫构造方法链。CBACBA继承(jchng)链构造(guzo)链如果要构造C类对象父类子类第15页/共49页第十六页,共50页。缺少(qusho)无参构造函数的后果class Fruit public Fruit(String name) System.out.println(调用Fruit的构造函数);class Apple extends Fruit 父类没有(mi yu)无参构造函数,但子类没有(mi yu)定义构造函数,所以子类Apple的无参构造函数会调用父类的无参构造函数,所以程序不能编译。第16页/共49页第十七页,共50页。class AA()System(A);class B extends AB()System.out.println(B);class C extends BC()System.out.println(C);class Testpublic static void main(String args)new C(); new B();课堂(ktng)提问第17页/共49页第十八页,共50页。11.3.3 调用(dioyng)父类的一般方法public class Person public String name; public String getName() return name; public class Employee extends Person public int employeeNumber; public void print() System.out.print(super.getName()+ employeeNumber); 这里(zhl)super.常省略第18页/共49页第十九页,共50页。方法覆盖的哲学涵义:子类对象当然(dngrn)可以修改父类的行为变量变量(binling)(binling)的隐藏:的隐藏:子类中声明了与父类中相同的成员变量子类中声明了与父类中相同的成员变量(binling)(binling)名,则从父类继承的变量名,则从父类继承的变量(binling)(binling)将被隐藏将被隐藏子类拥有了两个相同名字的变量子类拥有了两个相同名字的变量(binling)(binling),一个继承自父类,另一个由自,一个继承自父类,另一个由自己声明己声明静态方法的隐藏:静态方法的隐藏:子类中声明了与父类中相同的静态方法子类中声明了与父类中相同的静态方法实例方法的覆盖:子类修改(重写)了父类中定义的方法。实例方法的覆盖:子类修改(重写)了父类中定义的方法。父类的被覆盖方法仍然存在父类的被覆盖方法仍然存在子类中用子类中用super.super.方法方法() () 来调用父类中的方法(包括被覆盖方法)来调用父类中的方法(包括被覆盖方法)子类对象子类对象.super.super.方法方法()()是语法错是语法错super.super.super.super.方法方法()()也是语法错也是语法错第19页/共49页第二十页,共50页。override(覆盖)的说明:override就是在类的继承过程中发生的方法覆盖。一旦父类中的方法被覆盖,则不能通过子类对象访问被覆盖的父类方法。在子类类体中可以使用super引用(ynyng)被覆盖的父类方法。发生覆盖的条件:1、覆盖的方法的方法名称和参数类型必须要和被覆盖的方法的标志完全匹配,才能达到覆盖的效果;2、覆盖的方法的返回值必须和被覆盖的方法的返回一致;3、覆盖的方法所抛出的异常必须和被覆盖方法的所抛出的异常一致,或者是其子类,或者什么也不抛出;4、被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。第20页/共49页第二十一页,共50页。override(覆盖)的说明(续):5、覆盖的方法的访问权限必须大于等于被覆盖方法的访问权限。例如:被覆盖方法的访问权限是“无”,那么覆盖的方法的访问权限可以是“无”、protected、public。6、被覆盖的方法不能是final类型的,因为final类型的方法就是声明不能被覆盖。但是覆盖的方法可以是final类型的,不会影响覆盖效果。7、静态的方法不会发生覆盖。所以如果父类中的方法为静态的,而子类中的方法不是静态的,但是两个方法除了这一点外其他都满足覆盖条件,那么会发生编译错误。反之亦然。即使父类和子类中的方法都是静态的,并且满足覆盖条件,但是仍然不会发生覆盖,因为静态方法是在编译的时候(sh hou)把静态方法和类的引用类型进行匹配。第21页/共49页第二十二页,共50页。public class Test public static void main(String args) A a=new A(); a.p(10); class B public void p(int i)class A extends B public void p(int i)System.out.println(i);public class Test public static void main(String args) A a=new A(); a.p(10); class B public void p(int i)class A extends B public void p(float i)System.out.println(i);覆盖(fgi)重载(zhn zi)第22页/共49页第二十三页,共50页。方法重载的说明: 方法的重载只跟方法的名字和参数个数和参数类型(lixng)有关,与方法前面的修饰符【包括返回值、static、访问控制关键字(public,protected,private)、final】无关发生重载的条件:1、在使用重载时只能通过不同的参数样式。例如,不同的参数类型(lixng),不同的参数个数,不同的参数顺序;2、是否重载跟访问权限、返回类型(lixng)、抛出的异常无关;3、对于继承来说,如果某一方法在父类中是访问权限是priavte,那么就不能在子类对其进行重载,如果定义的话,也只是定义了一个新方法,而不会达到重载的效果。第23页/共49页第二十四页,共50页。l类是所有类的父类。如果一个类在声明时没有指定父类,那么这个类的父类是Object类。lequals方法:用于测试两个对象是否相等。Object类的默认实现是比较两个对象是否引用同一个对象。ltoString方法:返回代表这个对象的字符串。Object类的默认实现是返回由类名、和hashCode组成。l Circle circle = new Circle();l circle.toString();/Circle15037e5lObject的toString方法提供的信息不是很有用。因此通常(tngchng)子类应该覆盖该方法,提供更有意义的信息。第24页/共49页第二十五页,共50页。void method(Person p)Student s = new Student();method(s);第25页/共49页第二十六页,共50页。public class PolymorphismDemo public static void main(String args) m(new GraduateStudent(); m(new Student(); m(new Person(); m(new Object(); public static void m(Object x) System.out.println(x.toString(); class GraduateStudent extends Studentclass Student extends Personpublic String toString()return Student;class Person extends Objectpublic String toString()return Person;由于继承,子类有多个toString()方法执行(zhxng)时到底用哪个方法,需要动态绑定方法m()的执行(zhxng)结果呈现多态性第26页/共49页第二十七页,共50页。这段程序的微妙之处在于:PolymorphismDemo类的m方法的参数是Object类型,那么该行为应该是Object对象的行为。但是在实际运行时我们看到随着实参对象类型的变化(binhu),m方法却表现出了多种不同的行为,这种机制称为多态仔细观察程序,可以发现产生多态的三个重要因素:1:不同类之间有继承链2:m方法的参数类型用的父类类型3:m调用(dioyng)的toString方法都被子类用自己的行为覆盖满足了这三个条件,用继承链中不同类的对象做为方法的实参去调用(dioyng)方法会使该方法表现出不同的行为。由于子类的实例也是父类的实例,所以用子类对象作为实参传给方法中的基类型的形参是没有问题的。第27页/共49页第二十八页,共50页。GraduateStudentStudentPersonObject1、一般程序设计:需要父类对象作为参数时,可用子类对象。m()具有一般性、通用性。2、动态绑定/多态性:需要访问(fngwn)子类的方法时,从该子类向上查询。找到一个就停止。第28页/共49页第二十九页,共50页。l父类变量可以引用子类对象,针对父类对象设计的任何代码都可以应用于子类对象。l多态性允许方法使用更通用的类作为形参。l如果方法参数是父类,那么这个参数可以接受任何子类对象作为实参。当调用这对象的方法时,将动态绑定方法的实现(shxin)。l通用编程(一般程序设计)的好处:l假设java不支持多态,m函数怎么办?(答案:需要定义多个重载的m函数。)第29页/共49页第三十页,共50页。Person p=new Student(); 向上,隐式类型转换Student s=(Student) p; 向下,显式类型转换(p指向Student对象)Student s=new Person(); Student s=(Student)(new Person(); 编译通过,执行异常(ychng)向上转换:把子类实例引用赋值给父类引用变量,总是可行的向下转换:把父类引用转换为子类变量,必须显式转换。若父类对象不是子类的一个实例,编译通过,但执行时会发生错误ClassCastException对象 instance 类 判断对象是否是类的实例if(p instanceof Manager)Manager m = (Manager)p;Person p = new Manager();第30页/共49页第三十一页,共50页。if(object1.equals(object2) /判断两个对象(duxing)是否同一个elsepublic boolean equals(Object o)return(this=o);Object中的equals方法(fngf)如下:第31页/共49页第三十二页,共50页。class Circledouble radius;Circle()radius = 1;Circle(double r)radius = r;public boolean equals(Circle o)/语法正确(zhngqu),但这是重载而非覆盖return radius = o.radius;public class Testpublic static void main(String args) Circle c = new Circle();Circle d = new Circle(2);System.out.println(c.equals(d); 例1第32页/共49页第三十三页,共50页。class Circledouble radius;Circle()radius = 1;Circle(double r)radius = r;public boolean equals(Object o)/是覆盖return radius = o.radius; /编译(biny)错,Object没有radiuspublic class Testpublic static void main(String args) Circle c = new Circle();Circle d = new Circle(2);System.out.println(c.equals(d); 例2第33页/共49页第三十四页,共50页。class Circledouble radius;Circle()radius = 1;Circle(double r)radius = r;public boolean equals(Object o)/是覆盖return radius = (Circle)o.radius; /.运算(yn sun)优先级高,2个错误public class Testpublic static void main(String args) Circle c = new Circle();Circle d = new Circle(2);System.out.println(c.equals(d); 例3第34页/共49页第三十五页,共50页。class Circledouble radius;Circle()radius = 1;Circle(double r)radius = r;public boolean equals(Object o)/是覆盖(fgi)return radius = (Circle)o).radius;/正确覆盖(fgi),但存在隐患public class Testpublic static void main(String args) Circle c = new Circle();Circle d = new Circle(2);System.out.println(c.equals(d);/ d!=circle error 例4万一o不是(b shi)Circle的实例呢?第35页/共49页第三十六页,共50页。class Circledouble radius;Circle()radius = 1;Circle(double r)radius = r;public boolean equals(Object o)/最健壮(jinzhung)的覆盖if(o instanceof Circle)return radius = (Circle)o).radius;elsereturn false;例5第36页/共49页第三十七页,共50页。对象数组可以存储对象引用,但长度(chngd)固定,如用ArrayList存储对象,长度(chngd)不固定,任何类的对象都可插入java.util.ArrayList a=new java.util.ArrayList();a.add(“London”);/末尾插入String对象引用(ynyng)a.add(2,new Circle();/在下标2位置插入Circle对象引用(ynyng)System.out.println(a.get(0);/输出字符串”LOndon”System.out.println(a.size();/输出元素个数类 a=new 类n;第37页/共49页第三十八页,共50页。import java.util.ArrayList;class Personclass Circlepublic class Test public static void main(String arguments) ArrayList a = new ArrayList(); System.out.println(a.size(); a.add(London); a.add( new Person(); System.out.println(a.size(); a.add(1,new Circle(); System.out.println(a.size(); System.out.println(a.get(0); asize0asize2“London”对象(duxing)Person对象(duxing)asize3“London”对象(duxing) Person对象Circle对象第38页/共49页第三十九页,共50页。4011.12 对ArrayList有用(yu yn)的方法对象数组对象列表String array = china,usa,japan;ArrayList list = new ArrayList(Arrays.asList(sa);对象列表对象数组String array1 = new Stringlist.size();list.toArray(array1);排序(pi x)(针对数值、字符串等可比较类型)Collections.sort(list);最大最小元素(针对数值、字符串等可比较类型)Collections.max(list);Collections.min(list);随机打乱顺序Collections.shuffle(list);import java.util.*;第39页/共49页第四十页,共50页。用数组线性表类ArrayList来自定义一个可以存储(cn ch)对象的栈类import java.util.ArrayList;public class MyStackprivate ArrayList list=new ArrayList();public Object pop()Object o=list.get(getSize()-1);list.remove(getsize()-1);return o;public void push(Object o)list.add(o);第40页/共49页第四十一页,共50页。类型类型无修无修饰饰public同包的类yesyes异包的类noyesprivate无修饰无修饰protectedpublic同一类同一类yesyesyesyes同包子类同包子类noyesyesyes同包非子类同包非子类noyesyesyes异包子类异包子类nonoyesyes异包非子类异包非子类nononoyesprotected:除了保内可访问外,还希望某成员(chngyun)能被包外的子类访问。不允许保外的非子类访问。C1类成员(chngyun)类型C2类访问C1成员第41页/共49页第四十二页,共50页。package p1;public class A protected void m( ) System.out.println(hello); import p1.*;class B extends A public class C extends A public static void main(String args) C o1=new C( ); o1.m( ); /正确(zhngqu) B o2= new B( ); /o2.m( ); /错误 protected的复杂性第42页/共49页第四十三页,共50页。格式说明例final 类型 数据;不能修改,常量final int x=1;final 类不能扩展,完美类/终极(zhngj)类public final class c1final 方法不能被覆盖,终极(zhngj)方法final void p( )第43页/共49页第四十四页,共50页。class Aint x;/可被隐藏(yncng)static int y; /可被隐藏(yncng)void setx(int m)x=m;/可被覆盖static void sety(int m) /可被隐藏(yncng)class B extends Aint x;static int y;void setx(int m)x=m*2;static void sety(int m)实例方法可以(ky)被覆盖数据域(实例或静态)及静态方法可隐藏,不能被覆盖第44页/共49页第四十五页,共50页。l属性的隐藏(yncng)举例lclass All int x = 2; l public void setx(int i) l x = i;l l void printa()l System.out.println(x);l lclass B extends A int x=100; void printb() super.x = super.x +10; (super.x= + super.x + x= + x); public class Test public static void main(String args) A a = new A(); a.setx(4); a.printa(); B b = new B(); b.printb(); b.printa(); b.setx(6); / 将继承(jchng)来的x值设置为6 b.printb(); b.printa(); a.printa(); 运行(ynxng)结果4super.x= 12 x= 10012super.x= 16 x= 100164如果在A中的int x=2前加static,结果4super.x= 14 x= 10014super.x= 16 x= 1001616第45页/共49页第四十六页,共50页。使用引用变量调用实例方法时,变量所引用对象的实际类在运行时决定使用该方法的哪个实现(shxin)。访问数据域或静态方法时,引用变量所声明的类型在编译时决定使用哪个数据域或静态方法。A p=new B();p.变量p.静态方法()p.实例(shl)方法()第46页/共49页第四十七页,共50页。class Aint x = 1;static void m() System.out.println(A中的m方法执行); void print() System.out.println(A的print,x=+x); class B extends Aint x = 2;static void m() System.out.println(B中的m方法执行); void print() System.out.println(B的print,x=+x); public class Testpublic static void main(String s)A p = new B();/x=1System.out.println(p.x);p.m();/静态看左p.print();/实例(shl)方法,看右面输出(shch)结果:1A中的m方法执行B中的print,x=2第47页/共49页第四十八页,共50页。class Aint x;static int ObjectNum;ObjectNum+;static实例(shl)初始化模块(每个构造方法都要先执行的公共代码)静态初始化模块(m kui)(装入类时调用,静态方法引用)第48页/共49页第四十九页,共50页。NoImage内容(nirng)总结会计学。1、子类可以继承父类中可访问的【访问权限设定为public, protected或无权限修饰符(若同包)】成员变量和方法。这就是为什么先构造父类,再构造子类。子类A无构造方法。构造函数会调用父类的无参构造函数,所以程序不能编译。该行为应该(ynggi)是Object对象的行为。向上转换:把子类实例引用赋值给父类引用变量,总是可行的。向下转换:把父类引用转换为子类变量,必须显式转换。格式说明例第五十页,共50页。
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!