什么是内部类
顾名思义,内部类就是在类内部定义的类,也就是说在类的内部进行了其他类结构的嵌套操作
内部类的优点:
1.内部类可以和外部类很方便的进行访问对方私有域,和private的方法、属性的操作。
2.内部类时另一种封装,体现了保护性,内部类对于其他的外部类来说时隐藏的。
3.内部类实现弥补java的单继承局限。
缺点:
就像贵的东西除了贵没有缺点一样。内部类的缺点就是复杂。
内部类和外部类的关系
- 非静态的内部类时依赖于外部类对象实例对象的,没有外部类实例无法创建内部类。
静态内部类无需依赖外部类对象实例,通过外部类类名即可创建。 - 内部类是独立于外部类的个体,与外部类不存在is-a关系。
- 内部类可以直接访问(外部类.this.成员(外部类.this可以省略))外部类成员,而外部类需要通过new 内部类,也就是内部类引用间接访问内部类成员。
class Outer{
private int a;
public class Inner{
public void func(){
Outer.this.a =1;
a =1;
System.out.println(a);
}
}
void func(){
new Inner().func();
}
}
public class Test{
public static void main(String[] args){
Outer outer = new Outer();
outer.func();
Outer.Inner inner = new Outer().new Inner(); //外部创建非静态内部类对象
inner.func();
}
}
内部类的创建方法
在内部类定义所在的外部类中定义内部类对象,就和一般定义外部类一样new就好了。
在其他外部类中定义另外的一个外部类的内部类对象。
静态: 外部类.内部类 内部类引用 = new 外部类.内部类();
非静态:外部类.内部类 内部类引用 = new 外部类().内部类();
区别就在于静态直接通过类名定义,外非静态必须先创建外部类对象才可以创建内部类对象
内部类的分类
- 成员内部类 –类比普通方法
成员内部类内部不能存在任何static变量或者方法,因为内部类以为外部类对象,而静态是不依赖对对象的。这一点矛盾导致内部类不可以有自己的静态成员,但是可以访问外部类中的静态成员。 - 静态内部类
静态内部类是不依赖外部类对象,所以静态内部类是可以有自己的静态成员的。但是因为静态内部类不依赖于外部类对象,而外部类中的普通成员是依赖与外部类对象,所有内部类不可以访问,但是内部类因为可以创建自己的内部类对象,所以可以有自己的普通成员。
注意注意:静态内部类就不类比静态成员方法类,因为方法无论是否静态都不能有自己的静态变量。 - 方法内部类
方法内部类是局部内部类,这个类在方法内部不允许有自己权限修饰符。
方法内部类对本方法外全部完全隐藏,除了创建这个类的方法外其他任何地方都不能访问
这个方法中的内部类如果想要使用这个方法传过来的形参,形参必须定义为final。JDK8 隐式添加了final修饰符给形参。
class Outer{
void fun(final int a){
class Inner{
private int b;
public int func(){
b = a;
return b;
}
}
System.out.println(new Inner().func());
}
}
public class Test{
public static void main(String[] args){
Outer outer = new Outer();
outer.fun(2);
}
}
- 匿名内部类
匿名内部类就是没有名字的方法内部类,特点和方法内部类基本一样。但是匿名内部类因为没有名字,也就没有构造方法,匿名内部类必须继承一个抽象类或者实现一个接口。
interface Inner {
void func();
}
class Outer {
void fun(final int a) {
new Inner() {
private int b;
public void func() {
b = a;
System.out.println(b);
}
}.func();
}
}
public class Test {
public static void main(String[] args) {
Outer outer = new Outer();
outer.fun(2);
}
}