第三篇:内部类之匿名内部类(内部类合集,第三篇,原理+细节+实现)-CSDN博客
上篇文章:面向对象高级部分---内部类,什么是内部类,内部类的划分,为什么要用内部类?-CSDN博客,我们已经阐述了什么是内部类以及内部类的划分。
接下来,我们仔细阐述内部类中的----局部内部类。
请各位一定要把握一个核心-----内部类也是类,局部内部类是指内部类处在局部变量的位置,大家对这个一定要有一个位置的感觉,再结合局部变量的特点和类的特点去学习就不会有问题。
什么是局部内部类?
处于外部类的局部位置(局部变量的位置,也就是方法体中,或者代码块中),并且有类名(这是和匿名内部类区分的关键)
class outer{//外部类
public void mathed1(){//方法
class inner{//局部内部类
}
}
}
class other{//其他类
}
局部内部类是不能添加访问修饰符的(怎么理解呢?它虽然是一个类,具备类的特性,但所处的位置是在外部类的局部变量位置,而局部变量是没有访问修饰符的,因此,局部内部类是不能添加访问修饰符的!), 但局部内部类可以用final修饰(局部变量是可以用final修饰的,所以局部内部类也可以用,同时表达的意思是该内部类不可以再被继承),局部内部类的作用域仅仅只有方法体或者代码块中,和局部变量的作用域是一样的。
总结下来,一定要把局部内部类这几个字拆开看,局部代表身处局部变量的位置,因此受到局部变量的规则约束,但它同时也是一个类,因此具备类的特性(也是可以继承的)
如何使用局部内部类?
局部内部类可以直接访问外部类的成员和方法(包含私有的)
外部类(outer类)访问局部内部类通过new的方式创建对象再访问内部类的成员和方法
外部其他类(other类)不能访问局部内部类---作用域不同,局部内部类和局部变量的作用域一样。
如果局部内部类的成员或方法和外部类的成员方法重名,默认采用就近原则,如果想访问外部类的成员,可以采用 外部类名.this.成员 去访问(外部类名.this 指代的就是当前对象)。请看下面的例子:
public class LocalInnerClass {//
public static void main(String[] args) {
Outer02 outer02 = new Outer02();
outer02.m1();
}
}
class Outer02 {//外部类
private int n1 = 100;
public void m1() {//方法
final class Inner02 {//局部内部类(本质仍然是一个类)
private int n1 = 800;
public void f1() {
//7. 如果外部类和局部内部类的成员重名时,默认遵循就近原则,如果想访问外部类的成员,
// 使用 外部类名.this.成员)去访问
// Outer02.this 本质就是外部类的对象, 即哪个对象调用了 m1, Outer02.this 就是哪个对象
System.out.println("n1=" + n1 + " 外部类的 n1=" + Outer02.this.n1);
System.out.println("Outer02.this hashcode=" + Outer02.this);
}
}
//6. 外部类在方法中,可以创建 Inner02 对象,然后调用方法即可
Inner02 inner02 = new Inner02();
inner02.f1();
}
}
局部内部类到这里所有的细节就已经阐述完了,大家看完后一定要对局部内部类有一个位置的感觉,梳理出一个框架,利用我说的本质去记忆,下一篇是匿名内部类,是重点中的重点,我会尽快更新,大家看爽了记得点个赞和关注,感谢大家!