资源预览内容
第1页 / 共39页
第2页 / 共39页
第3页 / 共39页
第4页 / 共39页
第5页 / 共39页
第6页 / 共39页
第7页 / 共39页
第8页 / 共39页
第9页 / 共39页
第10页 / 共39页
亲,该文档总共39页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
1,Java类设计,继承与多态,2,本节内容,Java类的继承 访问控制符 方法的重写 Super关键字 子类的构造函数 子类与父类的转换 instanceof运算符,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;public Date birthDate;public String school;public String getInfo() . ,5,类的继承 (3) extends 关键字,通过继承,简化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 * Java只支持单继承,不允许多重继承 一个子类只能有一个父类 一个父类可以有多个子类 Object类是所有Java类的最高层父类,7,单继承举例,8,类的访问控制,类的访问控制符或者为public,或者默认public class 类名 如果类用public修饰,则该类可以被其他类所访问 如果类默认访问控制符,则该类只能被同包中的类访问在讨论类成员的访问属性的时候,首先就要注意类的访问属性,如果类的访问属性是default的,那么该类的成员无论怎样也不能在包外被访问。,9,类成员的访问控制,访问控制符规定了类、属性和方法可以被程序的哪些部分访问和调用: 属性和方法的访问控制符:,举例,package p1; import p2.B; public class Aint id; /默认的protected int jewellry; /保护的 class Cvoid f() B b=new B();b.jewellry=200; /可以访问么? ,10,package p2; import p1.A; public class B extends Avoid f()jewellry=100; / 可以访问么?id=10; /可以访问么? class C void f() B b=new B();b.jewellry=200; /可以访问么? ,11,12,域的继承与隐藏、添加 域:数据成员,域的继承:子类可以继承父类的所有域(只要该域不是private) 域的添加:定义子类时加上新的域成员 域的隐藏:子类重新定义一个与父类那里继承来的数据成员完全相同的数据成员时,称为域的隐藏,class Baseint x = 2; /父类成员int method() return x; class Subclass extends Baseint x = 3; /子类同名成员int method () return x ; / 访问的是哪一个? 同名隐藏原则,13,14,关键字super:解决子类与父类命名冲突问题,在Java类中使用super来引用父类的成员 class Baseint x = 2; /父类成员 class Subclass extends Baseint x = 3; /子类同名成员int method () return super.x ; ,15,方法的重写(覆盖)overwriting 相当于C+中的virtual,在子类中可以根据需要对从父类中继承来的方法进行改造-方法的重写 重写方法必须和被重写方法具有相同的方法名称、参数列表和返回值类型 重写方法不能使用比被重写方法更严格的访问权限,16,方法重写举例(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 getInfo() return “Name: “+ name + “nage: “+ age + “nschool: “+ school;,return super.getInfo() +“nschool: “ +school;,17,方法重写举例(2),class Parent public void method1() 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.method1(); ,18,子类当中的构造方法,子类继承父类所有的成员变量和成员方法,但不继承父类的构造方法 使用super关键字,19,关键字super,在Java类中使用super来引用父类的成员 super可用于访问父类中定义的属性 super可用于调用父类中定义的成员方法 super可用于在子类构造方法中调用父类的构造方法,20,调用父类构造方法举例 (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; 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 ,21,调用父类构造方法举例 (2),1 public class Student extends Person 2 private 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 public Student(String s) / 编译出错: no super() 13 school = s; 14 ,22,派生类构造方法的执行顺序,使用this()来调用本类的其他构造方法 使用super()语句调用父类的构造方法 如果子类的构造方法中没有使用super显示地调用父类构造方法,也没有使用this关键字调用重载的其它构造方法,则系统默认调用父类无参数的构造方法,相当于super(),如果父类中没有无参的构造方法,则编译出错 super()或者this()必须在构造方法的第一行,只能有一句。,23,构造和初始化对象举例,class Living public Living() . class Person extends Livingprotected String name;protected e int age = 0;protected Date birthDate;public Person(String n, Date d) / 隐式super();name = n;birthDate = 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; ,24,父类和子类的构造机理,在内存机制中,父类和子类是占用同一块内存的,只不过子类在父类的基础上增加了自己的部分(属性)。子类是依附于父类的,先有父类再有子类。一个子类对象的产生,必须先调用父类的构造方法产生一个父类实例,然后在这个实例基础上添加自己的部分。举例: Father01.java,25,父类对象与子类对象的转换 赋值兼容规则,转换规则: 子类对象可以被视为其父类的一个对象 父类对象不能被当作其某个子类的对象 如果一个方法的形式参数定义的是父类对象,那么调用这个方法时,可以使用子类对象作为实际参数,26,/ student.java: class Person /父类. class Student extends Person /子类.public static void main (String args)Person p1 = new Person (“Liming“,50);Student s1 = new Student (“Wangqiang“,20,“PKU“);Person p2 = new Student (“Zhangyi“,18,“dlut“); ,父类引用指向子类对象,27,父类形参,子类实参,方法声明的参数类型为父类类型,可以使用子类的对象作为实参调用该方法 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 ); ,28,同类收集( 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();,
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号