JAVA程序设计类与对象续.ppt
主讲教师:主讲教师:杨祥茂杨祥茂2012年2月教学辅助课件教学辅助课件JAVA程序设计西南财经大学 前一页 课间休息 回目录复习类与对象1 概念定义2 描述形式3 关键知识点封装,构造方法,引用传递,this,static,对象数组4 典型例子火车的描述(链)西南财经大学 前一页 课间休息 回目录西南财经大学 前一页 课间休息 回目录特征1 一个火车是由若干车厢组成,每节车厢由数据和连接组成2 每个火车节点的类包括(数据和指针)组成所以:属性包括data 和next行为包括(1)构造方法(2)4个set和get语句西南财经大学 前一页 课间休息 回目录oclass Nodeoprivate String data;oprivate Node next;opublic Node(String data)othis.data=data;oopublic String getData()oreturn this.data;oopublic void setNext(Node next)othis.next=next;oopublic Node getNext()/实际上取得下一个节点的地址oreturn this.next;ooopublic class nodetestopublic static void main(String args)oNode root=new Node(火车头);/定义火车头oNode n1=new Node(A车厢);/第一节火车oNode n2=new Node(B车厢);/第二节火车 oNode n3=new Node(C车厢);/第三节火车o root.setNext(n1);/连接火车头与第一节火车o n1.setNext(n2);o n2.setNext(n3);o print(root);oo public static void print(Node node)o (输出数据);o while(node!=null)o System.out.print(node.getData()+t);o node=node.getNext();o o o 西南财经大学 前一页 课间休息 回目录在现实中假定有一个人Person类,student类可以分析得到:Student类的属性和Person属性可以得到Person属性有name和ageStudent类有属性name,age,school三个属性写成java的类就是西南财经大学 前一页 课间休息 回目录Class PersonClass Person private String name;private int age;public String getName()return name;public void setName(String name)this.name=name;public int getAge()return age;public void setAge(int age)this.age=age;西南财经大学 前一页 课间休息 回目录Class studentClass Student private String name;private int age;private String school;public String getName()return name;public void setName(String name)this.name=name;public int getAge()return age;public void setAge(int age)this.age=age;public String getSchool()return school;public void setSchool(String school)this.school=school;西南财经大学 前一页 课间休息 回目录问题在student类中,存在在Person类中的属性name和age,且有相同的set和get方法。现在希望在定义student类的时候,保留Person类中属性和方法。-继承西南财经大学 前一页 课间休息 回目录继承类的继承格式:class 父类 /定义父类 .class 子类 extends 父类 /子类继承父类 例如西南财经大学 前一页 课间休息 回目录类继承示例oclass Personoprivate String name;oprivate int age;opublic String getName()oreturn name;oopublic void setName(String name)othis.name=name;oopublic int getAge()oreturn age;oopublic void setAge(int age)othis.age=age;oooclass Student extends Persono/不写任何代码,只是继承父类oopublic class extendtest1opublic static void main(String args)oStudent stu=new Student();ostu.setName(张三);/访问父类的方法ostu.setAge(20);/访问父类的方法o(姓名:+stu.getName()+年龄:+stu.getAge();ooo西南财经大学 前一页 课间休息 回目录类继承,在子类中添加自己的属性和方法oclass Personoprivate String name;oprivate int age;opublic String getName()oreturn name;oopublic void setName(String name)othis.name=name;oopublic int getAge()oreturn age;oopublic void setAge(int age)othis.age=age;oooclass Student extends Personoprivate String school;opublic void setSchool(String school)othis.school=school;oopublic String getSchool()oreturn school;oo oopublic class extendtest1opublic static void main(String args)oStudent stu=new Student();ostu.setName(张三);/访问父类的方法ostu.setAge(20);/访问父类的方法ostu.setSchool(西南财经大学);oo(姓名:+stu.getName()+年龄:+stu.getAge()+学校:+stu.getSchool();ooo西南财经大学 前一页 课间休息 回目录类继承要注意的地方1 只允许多层继承,不允许多重继承。例如 class A class B class c extends A,B /同时继承两个类,是不允许的 又如 class A.class B extends A /允许多层继承 classs c extends B/允许多层继承2 定义 继承的子类叫做派生类3 子类不能直接访问父类的私有成员,但是可以调用父类的非私有方法,可以通过get来访问父类的私有成员。例如;西南财经大学 前一页 课间休息 回目录子类访问限制,不能直接访问父类中的属性(成员)oclass Student extends Personoprivate String school;opublic void setSchool(String school)othis.school=school;oopublic String getSchool()oreturn school;oo opublic void fun()o(父类的name 属性+name);/错误,无法访问o (父类的age 属性+age);/错误oo西南财经大学 前一页 课间休息 回目录子类可以间接访问属性内容oclass Student extends Personoprivate String school;opublic void setSchool(String school)othis.school=school;oopublic String getSchool()oreturn school;oo opublic void fun()o(“父类的name 属性”+getName();/间接访问o (“父类的age 属性”+getAge();/间接 o西南财经大学 前一页 课间休息 回目录继承的问题1:子类对象实例化过程子类对象实例化的过程是先调用父类的构造方法,再调用子类的构造方法(就是先有父亲的行为再有儿子的行为)。例如西南财经大学 前一页 课间休息 回目录观察子类对象实例化过程oclass Personoprivate String name;oprivate int age;opublic Person()o(这是父类的构造方法);oopublic String getName()oreturn name;oopublic void setName(String name)othis.name=name;oopublic int getAge()oreturn age;oopublic void setAge(int age)othis.age=age;oooclass Student extends Personoprivate String school;opublic Student()o(这是子类的构造方法);oopublic void setSchool(String school)othis.school=school;oopublic String getSchool()oreturn school;oo opublic void fun()o(父类的name 属性+getName();/o (父类的age 属性+getAge();/ooopublic class extendtest1opublic static void main(String args)oStudent stu=new Student();ostu.setName(张三);/访问父类的方法,子类没有定义ostu.setAge(20);/访问父类的方法,子类没有定义ostu.setSchool(西南财经大学);/子类定义的方法oo(姓名:+stu.getName()+年龄:+stu.getAge()+学校:+stu.getSchool();ooo西南财经大学 前一页 课间休息 回目录说明上述的子类调用父类的构造方法,先执行父类的构造方法再执行子类的构造方法。上述程序中的构造方法public Student()(这是子类的构造方法);实际上在子类的构造方法中是这样的 public Student()super();/调用父类的无参构造方法 (“子类的构造方法”);西南财经大学 前一页 课间休息 回目录继承问题2:继承父类中的方法覆写 继承父类中的方法覆写方法覆写是指子类定义与父类相同名的方法。在覆写父类的方法中要考虑子类覆写的方法不能拥有比父类方法更严格的方法权限。前面介绍的权限Private default(缺省)public在父类中使用了public,则在子类中必须使用public,否则编译将出错。西南财经大学 前一页 课间休息 回目录例如,方法覆写(覆写权利扩大)oclass Personovoid print()/定义一个默认的访问权限的方法oSystem.out.println(Person-void print();oooclass Student extends Person /继承opublic void print()/覆写方法o o System.out.println(Student-public void print();o ooopublic class overridedemoopublic static void main(String args)onew Student().print();/执行被覆写的方法oo西南财经大学 前一页 课间休息 回目录覆写权利缩小,不能被编译oclass Personopublic void print()/定义一个默认的访问权限的方法oSystem.out.println(Person-void print();oooclass Student extends Person /继承o void print()/覆写方法,覆写权利缩小o o System.out.println(Student-public void print();o ooopublic class overridedemoopublic static void main(String args)onew Student().print();/执行被覆写的方法oo西南财经大学 前一页 课间休息 回目录还是可以调用父类中被覆写的方法在子类中使用super 关键字,例如oclass Personovoid print()/定义一个默认的访问权限的方法oSystem.out.println(Person-void print();oooclass Student extends Person /继承o o void print()/覆写方法o super.print();/调用父类中的方法o System.out.println(Student-public void print();o ooopublic class overridedemoopublic static void main(String args)onew Student().print();/执行被覆写的方法oo西南财经大学 前一页 课间休息 回目录继承中的属性覆写,少用,不讲就是在继承中,子类中新属性名与父类中属性名相同,使用时采取就近原则,本类中的属性的使用用:This.属性名父类中的属性的使用用:Super.属性名西南财经大学 前一页 课间休息 回目录方法重载与方法覆写的比较 方法重载 方法覆写定义不同 方法名相同、参数类型与个数不同 方法名、参数类型、返回值全相同 对权限没有要求 覆写的方法不能拥有更严格权限范围不同 发生在一个类中 发生在继承类中 西南财经大学 前一页 课间休息 回目录 super关键字的作用使用super可以调用父类中的构造方法,普通方法,属性。在子类中访问父类的属性 super.属性名 在子类中调用父类中的普通方法 super.方法名(参数);在子类中构造方法中调用父类中的构造方法 在子类的构造方法的第一行 写 super(参数值)例如 西南财经大学 前一页 课间休息 回目录oclass Personoprivate String name;oprivate int age;opublic Person(String name,int age)othis.setName(name);othis.setAge(age);oopublic String getName()oreturn name;oopublic void setName(String name)othis.name=name;oopublic int getAge()oreturn age;oopublic void setAge(int age)othis.age=age;oopublic String getInfor()oreturn 姓名:+this.getName()+年龄:+this.getAge();oooclass Student extends Person /继承o private String school;o public Student(String name,int age,String school)o super(name,age);/调用父类的构造方法o this.setSchool(school);o o public void setSchool(String school)o this.school=school;o o public String getSchool()o return school;o o public String getInfor()/覆写方法o return super.getInfor()+学校:+this.getSchool();o ooopublic class superdemoopublic static void main(String args)oStudent stu=new Student(张三,20,西南财经大学);oSystem.out.println(stu.getInfor();oo西南财经大学 前一页 课间休息 回目录This 与super 区别西南财经大学 前一页 课间休息 回目录 final关键字的应用在java中final表示最终的意思。常用来声明类、属性、方法。声明时要注意的是:1 使用final声明类不能有子类2 使用final声明方法不能被子类所覆写3 使用final声明变量就是常量,不能被修改西南财经大学 前一页 课间休息 回目录Final 声明类,不能有子类Final class AClass B exrends A /编译出错,因为不能 有子类西南财经大学 前一页 课间休息 回目录声明方法不能被子类覆写 class A public final void print()System.out.println(“Hello”);class B extends A public final void print()/子类不能覆写final方法 System.out.println(“swufe”);西南财经大学 前一页 课间休息 回目录Final修饰成为常量 class A private final infor=“hello”;public final void print()infor=“swufe”;/错误,不能修改常量 西南财经大学 前一页 课间休息 回目录使用 final注意事项 final声明变量时,其变量名要求全部为大写字母,一般使用的技巧是 public static final 类型 变量名=变量值;作为全局变量使用。西南财经大学 前一页 课间休息 回目录对象的另一个重要概念,多态性在java 中多态性体现为(1)方法的重载与覆写(2)对象的多态性下面说说对象的多态性(1)把子类对象类型转换为父类对象类型(2)把父类对象类型转换为子类对象类型规范:子类转换为父类 父类 父类对象=子类对象实例;父类转换为子类 子类 子类对象=(子类)父类对象实例西南财经大学 前一页 课间休息 回目录子类对象转换为父类对象oclass Aopublic void fun1()oSystem.out.println(A-public void fun1();oopublic void fun2()othis.fun1();oooclass B extends Aopublic void fun1()/覆写父类方法oSystem.out.println(B-public void fun1();oopublic void fun3()oSystem.out.println(B-public void fun3();ooopublic class sampleopublic static void main(String args)oB b=new B();/子类实例化o A a=b;/子类向父类转换,多态性o a.fun1();/此方法被子类覆盖过oo不能调用 a.fun3()西南财经大学 前一页 课间休息 回目录 父类对象转换为子类对象 oclass Aopublic void fun1()oSystem.out.println(A-public void fun1();oopublic void fun2()othis.fun1();oooclass B extends Aopublic void fun1()/覆写父类方法oSystem.out.println(B-public void fun1();oopublic void fun3()oSystem.out.println(B-public void fun3();ooopublic class sampleopublic static void main(String args)oA a=new B();/子类向父类对象转换,不能使用A a=new A()o B b=(B)a;/父类对象向子类对象转换,多态性o b.fun1();/此方法被子类覆盖过o b.fun2();/调用父类的方法o b.fun3();/调用子类自己定义的方法oo西南财经大学 前一页 课间休息 回目录 instanceof关键字在java中使用instanceof判断对象是属于哪个类的。规范是对象名 instanceof 类 返回一个true或者false例如西南财经大学 前一页 课间休息 回目录Instanceof的应用oclass Aopublic void fun1()oSystem.out.println(A-public void fun1();oopublic void fun2()othis.fun1();oooclass B extends Aopublic void fun1()/覆写父类方法oSystem.out.println(B-public void fun1();oopublic void fun3()oSystem.out.println(B-public void fun3();ooopublic class sampleopublic static void main(String args)oA a=new B();/子类向父类对象转换,不能使用A a=new A()o System.out.println(A a=new B()+(a instanceof A);o System.out.println(A a=new B()+(a instanceof B);o A a2=new A();o System.out.println(A a=new A()+(a2 instanceof A);o System.out.println(A a=new A()+(a2 instanceof B);o oo西南财经大学 前一页 课间休息 回目录抽象类前面对类的继承,可以实现从父类派生出新类,继承父类的属性与方法在java中,也可以创建一种专门用来当成父类,称谓“抽象类”。作用类似“模板”。目的是要设计者依据它的格式来修改并创建新的类。但是并不能直接由抽象类创建对象,只能通过抽象类派生出新类,再由新类来创建对象注意:一个子类只能继承一个抽象类。抽象类的定义格式:abstract class 抽象类名 属性;访问权限 返回值类型 方法名(参数)/普通方法 return 返回值 访问权限 abstract 返回值类型 方法名(参数);/抽象类 /在抽象方法中没有方法体西南财经大学 前一页 课间休息 回目录使用抽象类的说明1包含一个抽象方法的类必须是抽象类2抽象类与抽象方法使用abstract来声明3抽象方法只需要声明,不需要代码实现4抽象类必须被子类继承,子类必须覆写抽象类中的全部抽象方法5例如西南财经大学 前一页 课间休息 回目录定义抽象类oabstract class A /定义抽象类opublic static final String FLAG=SWUFE;o private String name=aaaa;o public String getName()o return name;o o opublic void setName(String name)othis.name=name;oopublic abstract void print();/定义抽象方法o西南财经大学 前一页 课间休息 回目录继承抽象类oclass B extends Aopublic void print()/覆写父类的抽象方法oSystem.out.println(FLAG-+FLAG);o(姓名:+super.getName();ooopublic class sampleopublic static void main(String args)oB b=new B();ob.print();o o西南财经大学 前一页 课间休息 回目录注意的问题1 一个抽象类不能使用final关键字来声明,因为如果使用了final,则不能覆写,而抽象类要求子类要覆写抽象方法。2 一个抽象类可以定义构造方法。西南财经大学 前一页 课间休息 回目录接口接口是java中最重要的概念之一。可以理解为特殊的类,是由全局常量和公共抽象方法组成。常用来制定标准。接口的定义格式 interface 接口名 全局常量;抽象方法;注意:在接口中的抽象方法必须为public 权限。是不可以改变的。即使在方法前面不写public,也是public权限。西南财经大学 前一页 课间休息 回目录接口的示范 interface A public static final String school=“西南财经大学”;public abstract void print();public abstract String getInfor();可以简化为(等价上述描述):interface A String school=“西南财经大学”;void print();String getInfor();西南财经大学 前一页 课间休息 回目录接口中是抽象方法,要通过子类来实现,办法是implement 实现接口实现接口的格式 class 子类 implement 接口A,B例如西南财经大学 前一页 课间休息 回目录接口的示范ointerface Aopublic String Author=swufe;/定义全局变量opublic void print();/定义抽象方法opublic String getInfor();/定义抽象方法oointerface Bopublic void say();ooclass X implements A,B /实现接口opublic void say()oSystem.out.println(Hello,world!);oopublic String getInfor()oreturn HELLO;oopublic void print()o(作者:+Author);ooopublic class interfacedemoopublic static void main(String args)oX x=new X();ox.say();ox.print();oo一个子类同时实现了两个接口,覆写两个接口中的抽象方法。西南财经大学 前一页 课间休息 回目录继承抽象类实现接口ointerface Aopublic String Author=swufe;/定义全局变量opublic void print();/定义抽象方法opublic String getInfor();/定义抽象方法ooabstract class B /定义抽象类opublic abstract void say();ooclass X extends B implements A /实现接口同时继承实现接口同时继承opublic void say()/覆写抽象类中的抽象方法oSystem.out.println(Hello,world!);oopublic String getInfor()/覆写接口A中的抽象方法oreturn HELLO;oopublic void print()/覆写接口A中的抽象方法o(作者:+Author);ooopublic class interfacedemoopublic static void main(String args)oX x=new X();/实例化子类对象ox.say();/调用被覆写过的方法ox.print();/调用被覆写过的方法oo西南财经大学 前一页 课间休息 回目录抽象类实现接口ointerface Aopublic String Author=swufe;/定义全局变量opublic void print();/定义抽象方法opublic String getInfor();/定义抽象方法ooabstract class B implements A /定义抽象类实现接口定义抽象类实现接口opublic abstract void say();ooclass X extends B /实现继承opublic void say()/覆写抽象类中的抽象方法oSystem.out.println(Hello,world!);oopublic String getInfor()/覆写接口A中的抽象方法oreturn HELLO;oopublic void print()/覆写接口A中的抽象方法o(作者:+Author);ooopublic class interfacedemoopublic static void main(String args)oX x=new X();/实例化子类对象ox.say();/调用被覆写过的方法ox.print();/调用被覆写过的方法oo西南财经大学 前一页 课间休息 回目录接口的继承ointerface Aopublic String Author=swufe;/定义全局变量opublic void printA();/定义抽象方法oointerface B /定义接口opublic void printB();/定义抽象方法oointerface C extends A,B/接口接口C继承继承A,Bopublic void printC();ooclass X implements C /实现接口opublic void printA()/覆写抽象方法oSystem.out.println(printA_Hello,world!);oopublic void printB()/覆写接抽象方法oSystem.out.println(printB_HELLO);oopublic void printC()/覆写接口C中的抽象方法oSystem.out.println(printC_作者:+Author);ooopublic class interfacedemoopublic static void main(String args)oX x=new X();/实例化子类对象ox.printA();/调用被覆写过的方法ox.printB();/调用被覆写过的方法ox.printC();oo西南财经大学 前一页 课间休息 回目录抽象类与接口的应用西南财经大学 前一页 课间休息 回目录抽象类的实例化oabstract class Aopublic abstract void printA();/定义抽象方法ooclass B extends A /子类继承抽象类opublic void printA()o(子类继承抽象类);ooopublic class abstractdemoopublic static void main(String args)oA a=new B();/通过子类为抽象类实例化oa.printA();/调用被覆写过的方法oo西南财经大学 前一页 课间休息 回目录ointerface Aopublic abstract void print();/定义抽象方法ooclass B implements A /子类实现接口opublic void print()oSystem.out.println(HELLO);ooopublic class interfacedemoopublic static void main(String args)oA a=new B();/通过子类为接口实例化oa.print();/调用被覆写过的方法oo西南财经大学 前一页 课间休息 回目录抽象类的实际应用模板设计假设人分为学生,和工人.学生和工人的说话的内容是不一样的。则,可以利用abstract来实现这个场景.先定义一个抽象的Person类,学生和工人继承 Person类则,abstract class Person就是一个抽象类。西南财经大学 前一页 课间休息 回目录oabstract class Personoprivate String name;oprivate int age;opublic Person(String name,int age)othis.name=name;othis.age=age;oopublic String getName()oreturn name;oopublic int getAge()oreturn age;oopublic void say()oSystem.out.println(this.getContent();oopublic abstract String getContent();/抽象方法没有方法体o o oclass Student extends Personoprivate float score;opublic Student(String name,int age,float score)osuper(name,age);othis.score=score;oopublic String getContent()oreturn 姓名 +super.getName()+年龄 +super.getAge()+成绩:+this.score;oooclass Worker extends Personoprivate float salary;opublic Worker(String name,int age,float salary)osuper(name,age);othis.salary=salary;oopublic String getContent()oreturn 姓名 +super.getName()+年龄 +super.getAge()+薪水:+this.salary;ooopublic class abstractdemoopublic static void main(String args)oPerson p1=null;oPerson p2=null;op1=new Student(张三,20,99.0F);op2=new Worker(里斯,45,3000F);op1.say();op2.say();ooo西南财经大学 前一页 课间休息 回目录接口的应用制定标准在经济管理中,符合什么规范的就进入,那么规范就是标准,标准就用接口来实现。例如,在市场经济中,例如,在产品的设计,也是采用标准来进行采购。例如,汽车生产商采购零部件就是这样的思路。例如,银行的电子货币交易就是制定标准,其他公司生产产品卖给用户,让用户来使用。所以,在本科学习阶段,.例如,在计算机上USB接口就是标准,这种思路适合非民族的产品,就是说中国独特的就是世界的。西南财经大学 前一页 课间休息 回目录ointerface USB /定义USB接口opublic void start();opublic void end();ooclass Computer /计算机提