java中塑形_Java学习5——接口和多态

1 接口

接口相当于一个完全抽象的,没有任何实现的类

所有的成员函数都是抽象函数

所有的成员变量都是public static final而且一定要赋予初值

接口中的静态函数必须有函数体

接口在声明时也可以声明是泛型接口,其格式是在接口名称后加上

使用关键词interface声明接口

[接口修饰符] interface 接口名称[] [extends 超类名]{

... //方法的原型或静态变量

}

实现接口使用关键字implements

实现接口的语法如下:

public class 类名称 implements 接口名称{

//实现接口的方法

//本类的数据和方法

}

类可以实现很多接口

接口不能继承类,但是接口可以继承接口,派生出新的接口,而且一个接口可以继承多个接口

接口不能实现接口

2 塑型/造型

Java的对象变量是多态的,它们能保存不止一种类型的对象

它们可以保存的是声明类型的对象,或声明类型的子类的对象

当把子类的对象赋给父类的变量的时候,就发生了向上造型

2.1 类型转换

类型转换也称为塑型(type-casting),对象只能被塑性为:

任何一个超类类型

对象所属的类实现的一个接口

自己原来所属的类

塑性主要应用在如下场合:

赋值转换

方法调用转换

算数表达式转换

字符串转换

当一个类对象被塑形为其超类后,它提供的方法就会减少

2.2 造型

用括号围起类型放在值的前面

对象本身并没有发生任何变化,所以不是“类型转化”

运行时有机制来检查这样得转化是否合理, ClassCastException

2.3 向上造型

把一个类型的对象赋给另外一个类型的变量

子类的对象可以赋值给父类的变量

注意:java中不存在对象对对象的赋值

父类的对象不能赋值给子类的对象

2.4 函数调用的绑定

当通过对象调用函数的时候,调用哪个函数这件事情叫做绑定

静态绑定:根据变量的声明类型来决定

在成员函数中调用其他成员函数也是通过this这个对象来调用的

3 多态

3.1 多态的定义

多态指不同类型的对象可以响应相同的消息

通过塑型可以将一个对象当做它的基类对象看待,相同基类派生出的多种类型可被当做同一种类型对待,可对这些不同的类型进行相同的处理,例如toString方法

3.2 绑定

将一个方法调用和一个方法主体连接到一起成为绑定

4 内部类

定义在别的类内部、函数内部的类

内部类能直接访问外部的全部资源,包括任何私有的成员

外部是函数时,只能访问那个函数里final的变量,因为方法中定义的变量是局部的,当方法的声明周期结束时,方法中变量的生存期也结束了,但方法中定义的内部类的实例可能还在被引用。

4.1 常规内部类

OuterClass、InnerClass分别是外部类和内部类,out是OuterClass的引用,则在OuterClass外部实例化InnerClass的代码片段为:

OuterClass out = new OuterClass();

OuterClass.InnerClass in = out.new InnerClass();

OuterClass.InnerClass in = new OuterClass().new InnerClass();

4.2 在方法中的内部类

对方法中定义的内部类实例化,必须在定义的的方法中,而且必须在内部类定义后方可对其实例化。

4.3 匿名内部类

匿名内部类时没有名字的内部类,一般可分为两种:常规定义的内部类;作为方法的参数定义的匿名内部类。常规定义的匿名内部类的声明和使用采用如下格式:

Classname classname = new Classname(){

//类体

}; //注意,必须跟分号

其中,Classname是类或接口名,注意这是一个表达式,它返回一个对象,可以用在需要引用该对象的任何地方。

匿名内部类的方便之处:

该句法定义了一个类,但不需要类的类型;

匿名类实现了一个接口或继承另一个类,而不需要使用implements或extends关键字

4.4 静态内部类

使用了修饰符static的内部类,称为静态内部类。静态内部类与包含类的实例没有实际的联系,因此,不能访问包含类中的非静态成员。实例化静态内部类时,与常规内部类实例化不同。

实例化InnerClass代码片段如下:

OuterClass.InnerClass in = new OuterClass.InnerClass();

一个类OuterClass中有另一个类InnerClass(外部类和内部类), 如果在main函数中使用new 的方式创建内部类的对象,会报错:No enclosing instance of type OuterClass is accessible.

1、原因:

内部类是动态的(无static关键字修饰),而main方法是静态的,普通的内部类对象隐含地保存了一个引用,指向创建它的外围类对象,所以要在static方法(类加载时已经初始化)调用内部类的必须先创建外部类。

2、解决办法:

创建内部类对象应该:

方法1:外部类对象.内部类对象 (保证外部类对象先于内部类对象出现)

InnerClass in = new OuterClass().InnerClass();

方法2:

如果将内部类修改为静态类,可以在main中直接创建内部类实例。

static class InnerClass{

...

}

当在包含类内部实例化内部类时,可以直接对内部类实例化。如果在包含类的外部实例化内部类,则需要使用包含类的一个引用来实例化。

4.5 匿名类

在new对象的时候就给出类的定义形成了匿名类

匿名类可以继承某类,也可以实现某接口

Swing的消息机制广泛使用匿名类

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值