第八章类的继承抽象类和接口详解演示文稿
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
28 public Student (String name,int age,String dep)
29 { 30 super(name,age); //调用父类的有参构造方法,在第10行定义的
31 department=dep;
32 System.out.println(“我是”+department +”的学生”);
我是信息系的学生
调用了学生的有参构造方法Student(String dep) 姓名:null 年龄:0
姓名:李小四 年龄:23
第16页,共108页。
课堂练习:分析输出结果和程序的构造过程
第17页,共108页。
8.1.2 在子类中访问父类的成员
格式:
super.<变量名> super.<方法名>
第八章类的继承抽象类和接口详解演示文 稿
第1页,共108页。
优选第八章类的继承抽象类和接口
第2页,共108页。
8.1 类的继承
1.Java语言的特点有:代码的重用
2.通过继承可以实现代码的复用。
3.父类或超类(superclass) 被继承的类
4.子类(subclass) 由继承而得到的类
Student
22 {
23 private String department;
24 public Student() // Student的无参构造方法 25 {
26 System.out.println(“调用了学生的无参构造方法Student()”);
27 }
第14页,共108页。
【例8.2】续
程序执行结果为:
子类Student中的成员变量age=20 姓名:李小四 年龄:25
系别:信息系
第24页,共108页。
8.1.3 覆盖
对于Java中的方法而言,有两种特殊的形式,即方法 的重载和方法的覆盖,前面已经论述了方法的重载。请同学 们回顾:方法重载的要求? 覆盖(Overriding) 也称为方法的重写,是指在子类中 定义名称、参数个数与类型均与父类相同的方法,用以重 写父类里同名方法的功能。
第25页,共108页。
1.覆盖父类的方法
子类在重新定义父类已有的方法时,应保持与父类完 全相同的方法头声明,即应与父类有完全相同的方法名、返 回值和参数类型列表。
举例:见【例8.4】
第26页,共108页。
补充:对象的上转型
第27页,共108页。
对象的上转型
Person p; p=new Student();
5.一个父类可以同时拥有多个子类,但由于 Java中不支持多重继承,所以一个类只能有一个直接
父类。
第3页,共108页。
在Java语言中有一个称为ng.Object的
特殊类,所有的类都是直接或间接地继承该类而得到 的。
第4页,共108页。
8.1.1 子类的创建
格式:
class SubClass extends SuperClass
13 =name;
14 this.age=age;
15 }
第13页,共108页。
【例8.2】续
16 public void show()
17 { 18 System.out.println(“姓名:“+name+” 年龄:”+age); 19 } 20 }
21 class Student extends Person //定义继承自Person类的子类
1.子类中定义的成员变量与父类中的成员变量名称相同 ;
2.子类在引用与父类成员变量同名的此成员变量时,默认是引
用子类自己定义的成员变量,而将从父类那里继承而来的成 员变量“隐藏”起来; 3.如果在子类程序中要引用与子类同名的父类的成员变量时,
可以使用“super”关键字来指示;
第21页,共108页。
this.age=age;
}
第8页,共108页。
【例8.1】续
public void show()
{
System.out.println(“姓名:“+name+” 年龄:”+age);
}
}
class Student extends Person //定义Student类,继承自Person类
{
private String department;
27 super.show(); //去掉super而只写show()亦可
28
System.out.println(“系别:”+ department );
29 }
30 }
第23页,共108页。
【例8.3】续
31 public class app8_3 //主类 32 { 33 public static void main(String args[ ]) 34 { 35 Student stu=new Student(“李小四”,”信息系”); 36 } 37 }
7
public Person(String name, int age) //定义有参构造方法
8
{
9
=name;
10
this.age=age;
11 }
12 protected void show()
13 {
14 System.out.println(“姓名:“+name+” 年龄:”+age);
41 Student stu2=new Student(“李小四”,23,”信息系”); //调用有参构造方法
42 stu1.show();
43 stu2.show();
44 }
45 }
第15页,共108页。
【例8.2】续
程序运行结果如下: 调用了Person的无参构造方法 调用了学生的无参构造方法Student() 调用了Person的有参构造方法
【例8.3】在子类中访问父类的成员。
1
//app8_3.java 用protected修饰符和super关键字访问父类的成员
2 class Person //定义Person
3{
4 protected String name;
5 protected int age;
6 public Person() {} //定义“不做事”的无参构造方法
p s的上转型对象
Student s; s=new Student();
p=s;
s
S对象
新增变量 新增方法
从父类继承或 重写的变量
从父类继承或 重写的方法
第28页,共108页。
对象上转型举例一(1)
第29页,共108页。
对象上转型举例一(2)
第30页,共108页。
上转型对象可通过强制类型转换成为子类对象。
public Student() // Student的构造方法
{
System.out.println(“调用了学生构造方法Student()”);
}
第9页,共108页。
【例8.1】续
public void SetDepartment(String dep)
{
department=dep;
System.out.println(“我是”+department +”的学生”);
private int age;
//age表示年龄
public Person() //定义无参构造方法
{
System.out.println(“调用了个人构造方法Person()”);
}
public void SetNameAge(String name, int age)
{
=name;
{ ……
}
把SubClass声明为类SuperClass的直接子类,如果SuperClass 又是某个类的子类,则SubClass同时也是该类的间接子类。
第5页,共108页。
如果没有extends关键字,则该类默认 为ng.Object类的子类。因此,在 Java中所有的类都是通过直接或间接地继 承ng.Object类得到的。所以在此 之前的所有例子均是ng.Object类
stu.show();
//调用父类的show()方法
stu.SetDepartment(“计算机系”);//调用子类SetDepartment{}方法
}
}
第10页,共108页。
【例8.1】续
程序执行的结果为:
调用了个人构造方法Person() 调用了学生构造方法Student() 姓名:张小三 年龄:21 我是计算机的学生
}
} public class app8_1
//主类
{
public static void main(StStudent(); //创建Student对象
stu.SetNameAge(“张小三”,21);//调用父类的SetNameAge()方法
6 public Person() //定义无参构造方法
7
{
8
System.out.println(“调用了Person的无参构造方法”);
9
}
10 public Person(String name, int age) //定义有参构造方法
11 {
12 System.out.println(“调用了Person的有参构造方法”);
第19页,共108页。
子类与父类的成员变量与方法
1.子类继承父类的所有成员变量和方法,但不包括父类中的由private修饰的部 分
2.子类中新增加的属性和方法是对父类的扩展 3.子类中定义的与父类同名的属性是对父类属性的隐藏,同名的方法是对父类
方法的覆盖
第20页,共108页。
子类与父类成员变量同名
33 System.out.println(“调用了学生的有参构造方法Student(String dep)”);
34 }
35 }
36 public class app8_2
//主类
37 {
38 public static void main(String args[ ])
39 {
40 Student stu1=new Student(); //创建对象,并调用无参构造方法
第11页,共108页。
说明: (1)通过extends关键字,可将父类的成员继承给子类。 (2)Java在执行子类的构造方法之前,会先自动调用 父类中没有参数的构造方法,其目的是为了帮助继承自父 类的成员做初始化的操作。 (3)在严格意义上说,构造方法是不能被继承的,如 父Person有一个构造方法Person(String,int),不能说子类 Student也自动有一个构造方法Person(String,int),但这并
不意味着子类不能调用父类的构造方法。
第12页,共108页。
2.调用父类中特定的构造方法
【例8.2】调用父类中某指定的构造方法。
1 //app8_2.java 调用父类中的特定构造方法
2 class Person //定义Person
3{
4 private String name;
5 private int age;
的子类。
第6页,共108页。
继承中的构造方法
第7页,共108页。
1.子类的构建方法 【例8.1】类的继承
//app8_1.java 继承的简单例子
class Person //Person类是ng.Object类的子类
{
private String name; //name表示姓名
15 }
16 }
第22页,共108页。
【例8.3】续
17 class Student extends Person //定义子类Student,其父类为Person
18 {
19 private String department;
20 int age=20; //新添加了一个与父类的成员变量age同名的成员变量 21 public Student (String xm,String dep) //定义Student的有参构造方法
22 {
23 name=xm; //在子类里直接访问父类的protected成员
24 department=dep;
25 super.age=25; //利用super关键字将父类的成员变量age赋值为25
26 System.out.println(“子类Student中的成员变量age=”+age);
第18页,共108页。
Super关键字
关键字super,提供了对父类的访问。 1.可以使用super访问父类被子类隐藏的变量或覆 盖的方法。
2、可以通过Super([参数表])来调用父类中特定 的构造方法。即根据super( )传入的参数去调用
父类中指定的构造方法,默认情况下调用的是无 参构造方法。