学堂在线—Java程序设计—课程笔记(第4章 接口与多态)

4 接口与多态

4.1 接口

  1. 接口:纯抽象类,只能有抽象方法;
    接口中可以规定方法的原型,不规定方法主体;
    可以包含基本数据类型的数据成员,都默认为static和final;
  2. 接口作用:
    继承多个设计;
    建立类和类之间的“协议”(接口可以按照类的不同功能分组,让没有继承/组合关系的类实现统一对外接口);
    接口可以隐藏实现的细节;
  3. 声明格式:[接口修饰符] interface接口名称 [extends父接口名]
    接口数据成员一定要有初值且不能再更改(可省略final);
    接口中方法可省略public 和 abstract;
  4. 实现接口:implements,必须实现接口中所有方法,来自接口的方法必须public;
    可以同时实现多个接口;
  5. 接口可以多继承,实现接口时必须实现超接口;

4.2 类型转换、方法的查找

  1. 类型转换规则:
    基本类型之间转换:将值从一种类型转换成另一种类型;
    引用变量类型转换:将引用转换为另一类型的引用,并不改变对象本身类型;
    引用变量转型:转换为超类(向上转型)、所属类实现的接口(向上转型)、引用指向的对象的类型(唯一可以向下转型);
    引用被转换为其超类引用后,只能访问超类中声明的方法;
  2. 隐式类型转换(自动类型转换):
    基本数据类型存储容量低自动向存储容量高转换;
    引用变量被转成更一般的类(超类),被塑形为对象所属类实现接口;
  3. 显示类型转换(强制转换):
    基本数据类型(类型名)内容,可能丢失数据;
    引用变量向下转型,只能转为引用指向的对象的类型;
  4. 类型转换主要应用场合:赋值转换,方法调用转换,算数表达式转换,字符串转换;
  5. 实例方法的查找:从对象创建时的类开始,沿类层次向上查找;
    类方法的查找:在引用变量声明时所属类中查找;

4.3 多态的概念、应用举例

  1. 多态:超类对象和从相同超类派生出的多个子类的对象,可被当作同一种类型对象对待;
    实现同一接口不同类型的对象,可被当作同一种类型的对象对待;
    可向这些不同类型的对象发送同样的消息,由于多态性,这些不同类对象响应同一消息时的行为可以有所差别;
  2. 多态的目的:使代码简单且容易理解,程序可扩展性更好;
  3. 绑定:将一个方法调用表达式与方法体代码结合起来;
    早绑定:程序运行前绑定;
    晚绑定(动态绑定/运行期绑定):基于对象类别在程序运行时绑定;
  4. 应用举例:二次分发;

4.4 构造方法和多态性

  1. 构造子类对象时构造方法的调用顺序:
    首先调用超类的构造方法,最后执行当前子类构造方法;
    未写明时会直接调用超类空参数的构造方法;
  2. 实现构造方法的注意事项:
    用尽可能少的动作把对象状态设置好;
    尽量避免调用任何方法(构造方法中调用动态方法可能存在出现潜在问题,尽量避免);
    构造方法内唯一能够安全调用的是超类中final方法(及private方法)。

部分习题

1.以下是接口I的定义:
interface I{
void setValue(int val);
int getValue();
}

以下哪段代码能够通过编译:
A. class A extends I{int value;public void setValue(int val){value=val;}public int getValue(){ return value;}}
B. class B implements I{int value; void setValue(int val){value=val;} public int getValue(){ return value;}}
C. interface C extends I {void add();} interface C extends I {void add();
D. interface D implements I{void add();}

答案:选择C;

选项A:The type I cannot be the superclass of A; a superclass must be a class;
选项B:Cannot reduce the visibility of the inherited method from I;(未加public)
选项D:implements未实现全部方法;

2.已知

import java.io.*;
class Person{
   
   
	public static void print(){
   
   System.out.print("Person");}
}
class Employee extends Person{
   
   
	public void print(){
   
   
	System.out.print("Employee");}
}
class Manager extends Employee{
   
   
	public void print(){
   
   
	System.out.print("Manager");}
}
public class Test{
   
   
	public static void main(String[] args){
   
   
	Manager man = new Manager();
	Employee emp1 = new 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值