欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java之我们为什么使用内部类

程序员文章站 2022-05-25 23:47:15
...

为什么要使用内部类?

在我们学习内部类的过程中,我们尝试问这样一个问题,为什么要使用内部类呢?想要回答这个问题,我们今天来向大家解答这个疑惑。
在一般情况下,内部类继承自某个类或者实现某个接口,内部类的代码操作创建它的外围类的对象。
显然,原因不能这么简单,如果只是这样的原因的话,我们可以直接使用外围类来进行实现,但这样在满足需求的情况下,可以这样做,但这样会有点不足就是:外围类实现这个接口不是总能够享用接口带来的方便,有时还要用到接口的实现,而内部类有这样的一个让人不得不去使用的原因:每个内部类都能够独立的继承自一个(接口)的实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类并没有影响。
更多的是内部类对多重继承的实现,使多重继承得到了保障,或者说更加便利。
接下来我们需要考虑这样一个问题:必须在一个类当中以某种方式实现两个接口。
如果你想的解决方案准确的话,应该有两种。
(1)使用单一类
(2)使用内部类
这都可以,我们看实现:

interface A{}
interface B{}
class X implements A,B{
}
class Y implements A{
	B makeB() {
		//Anonymous inner class(匿名内部类)
		return new B(){};
	}
}
public class MultiInterfaces {
	static void takesA(A a) {}
	static void takesB(B b) {}
	public static void main(String[] args) {
		X x = new X();
		Y y = new Y();
		takesA(x);
		takesA(y);
		takesB(x);
		takesB(y.makeB());		
	}
}

但是这毕竟只是对接口的实现,更多的内部类的优势在于如果我们拥有的是抽象的类或者具体的类,而不是接口,那么我们只能去使用内部类了,我们看这段代码就可以知道:

class D{}
abstract class E{}
class Z extends D{
	E makeE() {
		return new E() {};
	}
}
public class MultiImplementation {
	static void takesD(D d) {}
	static void takesE(E e) {}
	public static void main(String[] args) {
		Z z = new Z();
		takesD(z);
		takesE(z.makeE());
	}
}

当我们没有出现多重继承的问题时,我们编码的方式有很多种,但是

如果使用内部类有什么优势呢?

那么为了解决小伙伴们的时间,笔者花费时间为大家做出总结:
(1)内部类可以有多个实例,每个实例都有自己的状态信息,并且与其外围类对象的信息相互独立。
(2)在单个外围类当中,可以让多个内部类以不同的方式实现同一接口。
(3)创建内部类对象的时刻并不依赖于外围类对象的创建。
(4)内部类没有让人感到迷惑的“is-a”关系;它就是一个独立的实体。