java的接口和内部类

接口和内部类

接口

定义接口需要用到关键字interface

接口中可以定义:
属性
接口中的属性,默认都是静态常量,访问权限都是public。
方法
接口中的方法,默认都是抽象方法,访问权限都是public。

注意:
一般接口中不写成员变量,只写方法,相当于制定规则,所以又将接口称为方法列表

接口的作用
让java从单继承间接的实现了多继承,扩充了原来的功能,我们可以认为接口是类的补充.

接口和抽象类的异同

相同点
都可以编译成字节码文件。
都不能创建对象。
都可以声明引用。
都具备Object类中所定义的方法。
都可以写抽象方法。
不同点
接口中所有的属性,都是公开静态常量,缺省使用 public static final 修饰。
接口中所有的方法,都是公开抽象方法,缺省使用 public abstract 修饰。
接口中没有构造方法、构造代码段、静态代码段。

接口的实现

​ 接口,需要让类实现,表示这个类具有了这个接口定义的能力。因为接口中有很多的抽象方法,因此类在实现接口的时候,如果不是抽象类,必须要重写实现接口中所有的抽象方法。

一个类可以实现多个接口
我们使用接口进行行为的约束,规则的制定。接口表示一组能力,那么一个类可以接受多种 能力的约束。类比于合同来说,一个人是可以签订多份合同的。因此,一个类可以实现多个接口。实现多个接口的时候,必须要把每一个接口中的方法都实现了。
注意:如果一个类实现的多个接口中,有相同的方法,实现类只需要实现一次即可。

需要注意的是:
如果两个接口中定义了两个同名、同参数的方法,但是返回值不同。那么类是没有办法同时实现这两个接口的。因为在同时实现的时候,无法最终确定这个方法的返回值类型。就好比一个人签订了两份合同,A合同要求性别男,B合同要求性别女。这是有冲突的条件。因此类无法同时实现。

接口的继承

​ 接口之间也是存在继承关系的,与类的继承相似,子接口可以继承到父接口中所有的成员的。
​ 与类的继承不同,接口之间的继承是多继承。也就是说,一个接口是可以有多个父接口的。子接口可以继承到所有的父接口中的成员。

父类与接口的功能如何分配?

​ 一般父类中放的是主要功能,接口中放的是额外的功能,接口作为父类的补充.

当一个类实现的接口中出现了相同的方法,子类中实现方法的时候会不会混淆?

​ 不会,接口中的方法都是抽象的,要通过子类写具体的实现.我们在调用方法时,最终看的功能,而功能只有子类中的一份.

接口的多态

与类相同,向上转型后的接口的引用,调用接口中的方法的时候,实际调用的是实现类中的重写实现。

接口的新特性

在Java8中,为接口添加了两个新特性:
        static方法:可以在接口中定义静态方法,静态方法不是抽象方法,是有实现部分的。同时,这个静态方法,只能由当前的接口名字调用,接口的引用和实现类都是不能使用的。
        default方法:修饰接口中的方法,default修饰的方法可以添加默认的实现部分。此时,实现类在实现接口的时候,对于这些方法可以重写,也可以不重写。

内部类

内部类的分类

内部类,按照定义的位置和修饰符不同,可以分为:
成员内部类
静态内部类
局部内部类
匿名内部类

成员内部类

概念

定义在一个类的内部的类.内部类的地位与外部类的成员变量,成员方法平等,内部类也可以看做是外部类的成员,成员之间可以相互调用

使用

外部类的一个成员部分,创建内部类对象时,必须依赖外部类对象。

Outer outer = new Outer();

Inner inner = outer.new Inner();

Inner inner1 = new Outer().new Inner();

特点

书写位置:与属性、方法平级别,且没有使用static修饰的类。

访问权限:内部类可以是任意的访问权限。

成员内部类中,不能写静态属性、静态方法。

编译之后生成的字节码文件格式:外部类$内部类.class

实例化对象,需要借助外部类的对象完成。

静态内部类

在类的内部定义,与实例变量、实例方法同级别的,使用static修饰的类。

使用

不依赖外部类对象,可以直接创建或通过类名访问。

Outer.Inner inner = new Outer.Inner();

特点

书写位置:和类中的属性、方法平级,且使用关键字 static 修饰

静态内部类中,可以写属性、方法、构造方法…

静态内部类中,可以写静态属性、方法

编译之后生成的字节码文件,格式:外部类$内部类.class

对象的实例化,不需要借助外部类对象。

局部内部类

概念
定义在外部类的方法中,作用范围和创建对象范围仅限于当前方法。
特点
局部内部类访问外部类当前方法中的局部变量时,因无法保障变量的生命周期与自身相同,变量必须修饰为final。
不能使用访问权限修饰符修饰。
书写位置:写在一个类的方法内部,作用域仅限于当前方法。
局部内部类,编译后生成的字节码文件格式:外部类$序号内部类名.class

局部内部类的作用

通过局部内部类实现了功能的私有化,并对方法内部的代码进行了整理,增强了代码的可读性和可操作性.

局部内部类所在方法中局部变量的使用

​ final:被final修饰的变量会被放在常量区,而常量区的值存在的时间要大于局部变量所在的

​ 方法,相当于从原来的基础上扩大了作用域

​ 当方法中同时存在局部内部类与局部变量时,局部变量的使用范围就会从原来的基础上进行扩大.

**原因:**在当前程序执行时,程序会默认让final去修饰height.所以当局部变量所在的方法结束的时候,变量没有被释放,保存的值还在.

关于变量前面的final的说明:

​ 前提:变量必须与局部内部类同时存在.并且在局部内部类中使用了当前的局部变量

​ 在jdk1.7之前要想保住局部变量的值,要手动添加final

​ 在jdk1.7之后,程序执行时,java的内部机制已经在变量的前面默认添加了final

匿名内部类

匿名内部类(对象):定义在一个类的方法中的匿名子类对象,属于局部内部类

其实这个概念我们可以分成两部分看

先学习匿名子类对象:没有名字的子类对象

再学习匿名内部类对象:一个类的方法中的匿名子类对象

特点

​ 一切特征与局部内部类相同。

​ 必须继承一个父类或者实现一个接口。

​ 定义类、实现类、创建对象的语法合并,只能创建一个该类的对象。

匿名内部类作用

​ 当只用到当前子类的一个实例对象的时候,定义好马上使用,使用完立刻释放

​ 当不好起名字的时候

​ 可以更好的定义运行时的回调(知道即可)

创建匿名子类对象

创建方式

​ 第一种方式:使用已有的子类创建匿名子类对象

​ 第二种方式:直接使用Animal创建匿名子类对象

示例代码

​ 使用场景:已经创建好的子类可以多次使用,适用于相同的功能被多次调用

第二种方式:直接使用Animal创建匿名子类对象

​ 构成: new + 父类的名字/接口的名字 + () + {写当前子类的成员} + ;

​ 使用场景:只能使用一次,使用完会被当做垃圾回收,适用于每次都使用不同的功能

内部类作用

间接实现了多继承

方便定义

只有外部类可以访问创建的内部类的属性和方法,包括私有方法

同一个包中其他的类不可见,有了很好的封装性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值