收藏 分享(赏)

JAVA程序员培训定制课程c06.ppt

上传人:hwpkd79526 文档编号:8315627 上传时间:2019-06-20 格式:PPT 页数:43 大小:331.50KB
下载 相关 举报
JAVA程序员培训定制课程c06.ppt_第1页
第1页 / 共43页
JAVA程序员培训定制课程c06.ppt_第2页
第2页 / 共43页
JAVA程序员培训定制课程c06.ppt_第3页
第3页 / 共43页
JAVA程序员培训定制课程c06.ppt_第4页
第4页 / 共43页
JAVA程序员培训定制课程c06.ppt_第5页
第5页 / 共43页
点击查看更多>>
资源描述

1、第六章,Java类设计,2,本章内容,Java类的继承 方法的重载、重写 多态性及其应用 成员访问控制 对象的创建和初始化细节 几种常用的Java类,3,类的继承 (1),为描述和处理个人信息,定义类Person:,public class Person public String name;public int age;public Date birthDate;public String getInfo() . ,4,类的继承 (2),为描述和处理学生信息,定义类Student:,public class Student public String name;public int age;

2、public Date birthDate;public String school;public String getInfo() . ,5,类的继承 (3),通过继承,简化Student类的定义:,public class Person public String name;public int age;public Date birthDate;public String getInfo() . public class Student extends Personpublic String school; ,6,类的继承 (4),类继承语法规则:class extends * Obje

3、ct类是所有Java类的最高层父类 Java只支持单继承,不允许多重继承 一个子类只能有一个父类 一个父类可以继承出多个子类,7,单继承举例(1),8,单继承举例(2),public class TestAnimals public static void main (String args) Horse b = new Horse();System.out.println(b.getI(); class Animal private int i=1;public int getI()return i;public void setI(int i)this.i=i; class Horse e

4、xtends Animal int i=2;,9,访问控制,可以对Java类中定义的属性和方法进行访问控制-规定不同的保护等级:,10,访问控制举例(1),class Parentprivate int f1 = 1;int f2 = 2;protected int f3 = 3;public int f4 = 4;private void fm1() System.out.println(“in fm1() f1=“ + f1);void fm2() System.out.println(“in fm2() f2=“ + f2);protected void fm3() System.out

5、.println(“in fm3() f3=“ + f3);public void fm4() System.out.println(“in fm4() f4=“ + f4); ,11,访问控制举例(2),class Child extends Parentprivate int c1 = 21;public int c2 = 22; private void cm1()System.out.println(“in cm1() c1=“ + c1);public void cm2()System.out.println(“in cm2() c2=“ + c2);public static vo

6、id main(String args)int i; Parent p = new Parent(); i = p.f2; / i = p.f3; i = p.f4; p.fm2(); / p.fm3(); p.fm4(); Child c = new Child();i = c.f2; / i = c.f3; i = c.f4; i = c.c1; / i = c.c2; c.cm1();c.cm2(); ,12,访问控制分析,f1_private,f2_default,c2_public,f3_protected,f4_public,c1_private,内存空间中子类对象携带的数据,子类

7、的对象可以调用的方法,fm2()_default,fm3()_ protected,fm4()_ public,cm2()_public,cm1()_private,父类Parent和子类Child在同一包中定义时:,13,Ex,改造上述应用程序后,分析其结果,体会Java访问控制机制,可分下述几种情形: 应用程序入口main()方法定义在一个非子类中 Parent和Child类位于不同包中 Parent和Child类位于不同包中, main()方法定义在不同包内的非子类中,14,方法的重写,在子类中可以根据需要对从父类中继承来的方法进行改造-方法的重写 重写方法必须和被重写方法具有相同的方法

8、名称、参数列表和返回值类型 重写方法不能使用比被重写方法更严格的访问权限,15,方法重写举例(1),public class Person protected String name;protected int age;protected Date birthDate; /java.util包中定义过类Datepublic String getInfo() return “Name: “+ name + “n“ +“age: “+ age;public class Student extends Person protected String school;public String getI

9、nfo() return “Name: “+ name + “nage: “+ age + “nschool: “+ school;,16,方法重写举例(2),public class Parent public void method1() public class Child extends Parent private void method1() /illegal public class UseBoth public void doOtherThing() Parent p1 = new Parent();Child p2 = new Child();p1.method1();p2.

10、method1(); ,17,关键字super,在Java类中使用super来引用父类的成分 super可用于访问父类中定义的属性 super可用于调用父类中定义的成员方法 super可用于在子类构造方法中调用父类的构造方法 super的追溯不仅于直接父类,18,关键字super举例,public class Person private String name;private int age;private Date birthDate;public String getInfo() return “Name: “ + name + “nage: “ + age;public class S

11、tudent extends Person private String school = “New Oriental“;public String getSchool() return school; public String getInfo() / 调用父类的方法return super.getInfo() +“nschool: “ +school;,19,多态性(1),多态-在Java中,子类的对象可以替代父类的对象使用 一个对象只能有一种确定的数据类型 一个引用类型变量可能指向(引用)多种不同类型的对象Person p = new Student();Object o = new P

12、erson();o = new Student();,20,多态性(2),一个引用类型变量如果声明为父类的类型,但实际引用的是子类对象,那么该变量就不能再访问子类中添加的属性和方法Student m = new Student();m.school = “pku“; /合法Person e = new Student(); e.school = “pku“; /非法,21,虚方法调用 (Virtual Method Invocation),正常的方法调用Person e = new Person();e.getInfo();Student e = new Student();e.getInfo

13、();虚拟方法调用(多态情况下)Person e = new Student();e.getInfo();编译时类型和运行时类型,22,多态性应用举例(1),同类收集( homogenous collections)MyDate m = new MyDate2;m0 = new MyDate(22, 12, 1964);m1 = new MyDate(22, 7, 1964);异类收集(heterogeneous collections)Person p= new Person3;p0 = new Student();p1 = new Person();p2 = new Graduate();

14、,23,多态性应用举例(2),方法声明的参数类型为父类类型,可以使用子类的对象作为实参调用该方法 public class Test public void method(Person e) /e.getInfo();public static void main(Stirng args)Test t = new Test();Student m = new Student();t.method(m); ,24,instanceof 操作符,public class Person extends Object public class Student extends Person public

15、 class Graduate extends Person - public void method1(Person e) if (e instanceof Student) / 处理Student类型及其子类类型对象 else if (e instanceof Graduate) /处理Graduate类型及其子类类型对象 else /处理Person类型对象 ,25,对象造型 (Casting ),对Java对象的强制类型转换称为造型 在造型前可以使用instanceof操作符测试一个对象的类型 从子类到父类的类型转换可以自动进行 从父类到子类的类型转换必须通过造型(强制类型转换)实现

16、无继承关系的引用类型间的转换是非法的,26,对象造型举例,public class Test /Person及Student类的定义见第17页public void method(Person e) System.out.pritnln(e.getschool(); /非法if(e intstanceof Student)Student me = (Student)e;System.out.pritnln(me.getschool(); public static void main(Stirng args)Test t = new Test();Student m = new Student

17、();t.method(m); ,27,方法名重载,在同一个类中可以定义多个同名方法-方法名重载public class PrintStreampublic void println(int i) public void println(float f) public void println(String s) 重载方法的参数列表必须不同重载方法的返回值类型可以相同,也可以不同,28,构造方法重载,构造方法重载举例:public class Personpublic Person(String name, int age, Date d) public Person(String name,

18、 int age) public Person(String name, Date d) 构造方法重载,参数列表必须不同 可以在构造方法的第一行使用this关键字调用其它(重载的)构造方法,29,构造方法重载举例,public class Person private String name;private int age;private Date birthDate;public Person(String name, int age, Date d) this.name = name;this.age = age;this.birthDate = d;public Person(Strin

19、g name, int age) this(name, age, null);public Person(String name, Date d) this(name, 30, d);public Person(String name) this(name, 30); ,30,构造方法不能继承,子类继承父类所有的成员变量和成员方法,但不继承父类的构造方法 在一个Java类中可以通过两种方式获得构造方法 使用系统默认的无参构造方法 显式定义一个或多个构造方法 一旦显式定义了构造方法,则系统不再提供默认构造方法,31,调用父类构造方法,在子类的构造方法中可使用super(argument_list

20、)语句调用父类的构造方法 如果子类的构造方法中没有显示地调用父类构造方法,也没有使用this关键字调用重载的其它构造方法,则系统默认调用父类无参数的构造方法 如果子类构造方法中既未显式调用父类构造方法,而父类中又没有无参的构造方法,则编译出错,32,调用父类构造方法举例 (1),1 public class Person 2 3 private String name; 4 private int age; 5 private Date birthDate; 6 7 public Person(String name, int age, Date d) 8 this.name = name;

21、9 this.age = age; 10 this.birthDate = d; 11 12 public Person(String name, int age) 13 this(name, age, null); 14 15 public Person(String name, Date d) 16 this(name, 30, d); 17 18 public Person(String name) 19 this(name, 30); 20 21 / 22 ,33,调用父类构造方法举例 (2),1 public class Student extends Person 2 privat

22、e String school; 3 4 public Student(String name, int age, String s) 5 super(name, age); 6 school = s; 7 8 public Student(String name, String s) 9 super(name); 10 school = s; 11 12 public Student(String s) / 编译出错: no super() 13 school = s; 14 15 ,34,对象构造和初始化细节,分配存储空间并进行默认的初始化 按下述步骤初始化实例变量 绑定构造方法参数 如有

23、this()调用,则调用相应的重载构造方法,然后跳转到步骤5 显式或隐式追溯调用父类的构造方法(Object类除外) 进行实例变量的显式初始化操作 执行当前构造方法的方法体,35,构造和初始化对象举例,public class Object public Object() . public class Person extends Object private String name;private int age = 0;private Date birthDate;public Person(String n, Date d) / implicit super();name = n;bir

24、thDate = d;public Person(String n) this(n, null); public class Student extends Person private String school;public Student(String n, String d) super(n);school = d; ,36,Ex2 初始化过程引申,public class Person private String name;private int age = 0;private Date birthDate;private String info;public Person(Str

25、ing n, Date d) /step 3name = n;birthDate = d;info = getInfo(); public Person(String n) this(n, null); /step 2public String getInfo() return “Name: “ + name + “nage: “ + age+ “nBirth Date: “ + birthDate;public class Student extends Person private String school;public Student(String n, String d) /step

26、 0super(n); /step 1school = d; /step 4public String getInfo() return super.getInfo() + “nSchool: “ + school;,37,Object 类,Object类是所有Java类的根父类 如果在类的声明中未使用extends关键字指明其父类,则默认父类为Object类 public class Person .等价于: public class Person extends Object . ,38,=操作符与equals方法,=操作符与equals方法的区别:引用类型比较引用;基本类型比较值; eq

27、uals()方法只能比较引用类型,“=“可以比较引用类型及基本类型; 特例:当用equals()方法进行比较时,对类File、String、Date及封装类(Wrapper Class)来说,是比较类型及内容而不考虑引用的是否是同一个实例; 用“=“进行比较时,符号两边的数据类型必须一致(可自动转换的基本数据类型除外),否则编译出错;,39,=操作符与equals方法举例,class TestEquals /请自行定义能满足需要的MyDate类 public static void main(String args) MyDate m1 = new MyDate(24, 3, 2001);My

28、Date m2 = new MyDate(24, 3, 2001);if ( m1 = m2 ) System.out.println(“m1=m2“); else System.out.println(“m1!=m2“);if ( m1.equals(m2) ) System.out.println(“m1 is equal to m2“); else System.out.println(“m1 is not equal to m2“); Integer n1=new Integer(2);Integer n2=new Integer(2);if ( n1.equals(n2) Syste

29、m.out.println(“n1 equals n2“); else System.out.println(“n1 not equals n2“); ,40,toString 方法,toString()方法在Object类中定义,其返回值是String类型,描述当前对象的有关信息 在进行String与其它类型数据的连接操作时,自动调用toString()方法 可以根据需要在用户自定义类型中重写toString()方法 基本类型数据转换为String类型时,调用了对应封装类的toString()方法,41,封装类,针对八种基本定义相应的引用类型封装类,42,封装类用法举例,int i = 50

30、0; Integer t = new Integer(i); int j = t.intValue(); / j = 500 String s = t.toString(); / s = “500“ String s1 = Integer.toString(314); / s1= “314“,43,Ex3,练习M3-38页=操作符与equals方法用法例子;其中用到的数据类型MyDate 的定义见m6TestEqualsMyDate.java 将1中的数据类型MyDate 改为String或封装类型;体会其区别;参见m6TestEquals_StringTestEquals_String.java,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报