第三章面向对象高级特性
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
调用父类的成员
– –
类的继承
给定以下代码:
下列描述哪些是正确的_____? A. 编译失败 C. 在第7行抛出异常 B. 代码正常运行 D. 在第2行抛出异常 答案:A
类的继承
☻ 练习 Officer.java
在Officer类中,创建一个构造方法,要求在调用该构造方法时,
可以对name、birth、salary、department属性赋初值
类的继承
☻ 练习
给定类
class A { int method1(int a, double b) { return 0; }
,在其子类中
下列哪些覆盖方法可以正确的声明_____
A. int method1(int a, double b) { return 1; } B. int method1(int a, long b) { return 1; } C. int method1(int b,double a){return 1;} D. short method1(int a, double b) { return 1: } E. int method1(double b, int a) { return 1; }
•
类的继承 假如你在为某个公司做一个企业管理软件,来管理企业的雇员,比如:
在Java中定义一个类时,让该类通过关键字extends继承一个已有的类,这 工人(Worker)有姓名、出生日期和薪酬属性,需要获得名字、年龄、薪酬 就是类的继承 和服装津贴; 主任(Officer)同样包含姓名、出生日期和薪酬属性,另外 被继承的类称为父类(超类,基类),新的类称为子类(派生类)。 还有一个 department(他所管理的部门),同样他也有获得姓名、年龄和 子类继承父类的所有属性和方法,同时也可以增加自己的属性和方法。
3.final 类
• final修饰类,则类不能被继承。如果一个类被
final关键字修饰,说明这个类不能再被其他类 所继承,该类被称为最终类。 final class finalClassName{ … } 在默认情况下,所有的成员变量或成员方法都 可以被隐藏或重写,如果父类的成员不希望被 子类的成员所隐藏或重写则将其声明为final。
本例将报出错误
public class Demo { public static void main(String[] args) { Circle c = new Circle(2.5f); //实例化"圆"类对象 } }
构造方法的执行顺序
• 当实例化子类的对象时,必须先执行父类的构
造方法,然后再执行子类的构造方法;
super总结
•
调用父类的构造函数
– – –
super(parametersopt)调用父类的构造函数。 必须是子类构造函数的第一条语句。 如果子类中没有显式地调用父类的构造函数,那么将自
动调用父类不带参数的构造函数。
–
•
父类的构造函数在子类构造函数之前执行。 super.data super.method(parameters)
方法:不能在子类中被覆盖,即不能修改。
1.final 修饰成员变量
final修饰变量,则成为常量,例如 final type variableName;
修饰成员变量时,定义时同时给出初始值,而修饰 局部变量时不做要求。
2.final 修饰成员方法
final修饰方法,则该方法不能被子类重写。
final returnType methodName(paramList){ … }
或父类),创建的新类称作派生类(子类)。
• Java中所有的类都是通过直接或间接地继承java.lang.Object类
得到的。
•
在Java中定义一个类时,让该类通过关键字extends继承一个已有的类,这 就是类的继承 派生类 基类 方法和属性 基类方法 + 附加方法
类的继承
•
继承的语法
示例 Employee.java
重写(覆盖)与重载
方法的重载:定义有相同名字,但参数不同 的多个方法构成重载 方法的重写:方法的重写必须和被重写的方法 具有相同的名字,参数,返回值类型。 构造方法也可以重载。
类的继承
•
final关键字
final可以修饰的元素: 类:不能被继承 变量(属性和局部变量):不能被重新赋值 – 在声明的同时赋值 – 系统不会对final属性默认的赋初始值
Worker.java
[修饰符] class 子类名 extends 父类名
类的继承
•
继承的语法 ☻ 练习 Officer.java TestOfficer.java
用 java 中类的继承机制,实现 Officer 类,并设计一个测试程序
TestOfficer类,来访问Officer类
Employee
super (参数1,参数2,…);
如果使用super关键字调用父类构造方法,必须写在该子类构造方法的
第一行 如调用的是父类中无参的构造方法,则可以不写super( ) 如果子类中调用了父类无参的构造方法,而父类中没有无参构造方法 则系统编译出错
案例
class Point { //定义"点"类 //x轴坐标和y轴坐标,由于准备用于继承,故修饰为protected protected float mX, mY; public Point(float x, float y) { //构造方法 mX = x; mY = y; } } class Circle extends Point { protected float mRadius; public Circle(float r) { mRadius = r; } } //定义"圆"类继承于"点"类 //半径 //构造方法
class ep4_12_a { static final double pi = 3.1415926; // 声明静态常量 public final void f() { // 声明最终方法 System.out.println("pi=" + pi); } } class ep4_12_b extends ep4_12_a { int num = 100; private void f() { // 出错,不可覆盖父类的最终方法 System.out.println("num=" + num); } } class ep4_12 { public static void main(String args[]) { ep4_12_b One = new ep4_12_b(); One.f(); } }
Worker +dressAllowance()
•
继承的好处
实现类的重用
易维护
-name -birth -salary +getDetail() +getSalary()
Officer -department +vehicleAllowance()
类的继承
•
继承的规则
Java中只支持单继承,也就是说每个类只能有一个父类,不允许
类的继承
•
方法的覆盖(override)
重写(rewrite) 对从父类中继承来的方法进行改造 在子类继承父类时发生
示例
•
TestOffice_1.java
方法覆盖的规则
在子类中的覆盖方法与父类中被覆盖的方法应具有 相同的方法名 相同的参数列表(参数数量、参数类型、参数顺序都要相同) 相同的返回值类型 子类覆盖方法的访问权限要不小于父类中被覆盖方法的访问权限
答案:A C
类的继承
☻ 练习
给定下列代码:
当在第6行加入什么方法时会引起编译错误?
答案:B
方法覆盖注意
–
仅当方法是可访问的实例方法时,才能被覆盖,即私有
方法不能被覆盖。
–
静态方法不能被覆盖,如果静态方法在子类中重新定义, 那么父类方法将被隐藏。
–
一旦父类中的方法被覆盖,则不能从子类外部访问被覆 盖的方法。在子类中可以使用super引用被覆盖的方法。
• ቤተ መጻሕፍቲ ባይዱ果父类还有更上级的父类,就会先调用最高
父类的构造方法,再逐个依次地将所有继承关
系的父类构造方法全部执行;
• 如果父类的构造方法执行失败,那么子类的对
象也将无法实例化。
super关键字调用父类的方法
•
子类的构造方法中,通过super关键字调用父类的构造方法
public class SoftwareTeacher extends Teacher { public SoftwareTeacher (String myName, String myCenter) { super(myName, myCenter); 通过调用父类的构造方法,完 成对属性值的初始化 } }
练习
☻ 练习 Shape.java Rect.java TestShape.java Circle.java Square.java
设计一个形状类:属性:周长和面积;方法:求周长和求面积 形状类的子类:Rect(矩形),Circle(圆形)
Rect 类的子类:Square(正方形)
不同的子类会有不同的构造方法及计算周长和面积的方法 写一个测试类,在main方法中创建三个不同的形状对象,放在
Shape 类型的数组里,分别打印出每个对象的周长和面积
Contents
1 2 3 4
类的继承
接口
Java中的包
类的封装和内部类
接 口(interface)
•
抽象方法
只有方法声明,没有方法实现的方法
[访问权限修饰符] abstract 返回值类型
抽象方法名 (参数列表) ;
class A { abstract int method1(int a, int b) ; }
第三章 面向对象高级特性
本章要点
•
类的继承
继承的规则
子类的构造方法
方法的覆盖 final 关键字
•
接口
接口的规范 引用数据类型的转换 多态
•
•
Java中的包
包和访问权限修饰符
类的封装和内部类
主要内容
1 2 3 4
类的继承
接口
Java中的包
类的封装和内部类
类的继承
方法重写后,通过super关键字调用父类的普通方法
public class SoftwareTeacher extends Teacher { public void giveLesson(){ System.out.println("使用电脑授课"); super.giveLesson(); } 通过调用父类的普通方法,完成部分功能 }
薪酬的方法,还有一个获得交通补助的方法。你怎么做?
Officer
Worker -name -birth -salary +getDetail() +getSalary() +dressAllowance()
-name -birth -salary -department +getDetail() +getSalary() +vehicleAllowance()
• 构造方法、静态方法、私有方法、final方法不
能被声明为抽象的方法。
接 口(interface)
•
抽象类
抽象类是抽象方法和非抽象方法的集合
[访问权限修饰符] abstract class 类名 { …… }
特殊情况 全部是抽象方法 全部为非抽象方法
abtract class A { String name; abstract int method1(int a, int b); void sayHi( ){ System.out.println(“Hello!”); }
有多重继承
一个父类可以有多个子类 子类继承父类所有的属性和方法,但不继承父类的构造方法
示例
TestWorker.java
类的继承
•
子类的构造方法 — 子类不能继承父类的构造方法
使用默认的构造方法
在子类中的创建构造方法
示例 Worker.java 在子类中创建构造方法时,必须调用父类的构造方法 子类可以在自己的构造方法中使用super关键字来调用父类的构造方法
使用 继承
Worker +dressAllowance()
Employee -name -birth -salary +getDetail() +getSalary()
Officer -department +vehicleAllowance()
• 继承是利用现有的类创建新类的过程,现有的类称作基类(