内部类详解
所谓内部类就是在类的内部进行其他类结构的嵌套操作。如下代码就是一个内部类最简单的定义。
public class Outter{
private String msg = "DEW";
class Inner{
//如果给该类加上private修饰符修饰的话,那么Inner类只能在Outter类中使用
public void print(){
System.out.println(msg);
}
}
public void test(){
Inner in = new Inner();
in.print();
}
}
定义内部类后造成类结构复杂,最大优点在于内部类可以直接访问外部类私有域
为什么要有内部类呢?
1.定义内部类的原因(优点)
a.内部类可以访问外部类所有数据,包含被private封装的数据
b.内部类可以对外部类之外的类进行隐藏,使用内部类也是封装的一种(人和肾)
c.使用内部类可以实现多继承概念
2.内部类与外部类关系
a.对于非静态的内部类来说,内部类的创建需要依赖外部类的对象,在没有外部类实例之前无法创建内部类对象
b.内部类是一个相对独立的个体,与外部类不是is-a关系,仅仅是包在外部类内部而已
c.内部类可以直接访问外部类的元素(包含私有域),外部类可以间接访问内部类的所有元素(包含私有域)
即:内外部类可以访问彼此的私有属性(内部类直接访问,外部类通过对象间接访问)
3.内部类的分类:
3.1成员内部类(不加static修饰符定义的) —— 类比普通方法
静态内部类与普通外部类没有什么区别,仅仅是定义在一个类的内部
a.成员内部类依赖外部类对象,先创建外部类对象后再创建成员内部类对象
b.成员内部类不能拥有静态属性和方法,但可以访问外部类的静态域
声明并创建成员内部类语法:
I.在外部类内部创建成员内部类对象就和创建普通类一模一样
II.在外部类外部创建成员内部类对象:(前提是内部类没有被private封装)
外部类.内部类 对象名 = 外部类对象.new 内部类() ;
Outter.Inner in = new Outter().new Inner()
3.2.静态内部类(定义在类中,使用static修饰符) —— 类比静态方法
a.静态内部类的创建不需要依赖外部类对象,可以直接创建
b.在外部类外部创建静态内部类语法:
外部类.内部类 内部类引用 = new 外部类.内部类()
Outter.Inner in = new Outter.Inner()
c.静态内部类可以拥有普通属性,但是不能访问外部类的普通属性
3.3.方法内部类——方法中的局部变量
定义:定义在外部类方法中的类
a.方法内部类不允许使用访问权限修饰符
b.方法内部类对外部完全隐藏,除了创建类的方法可以访问外,其余均不能访问
c.方法内部类要想使用方法的形参,该形参必须使用final声明(JDK8之后变为隐式的final声明)
这块可以在方法内部类中对该形参重新赋值可以看出。
public class InnerClass {
public static Object get(int key){
class Person{
public Person(){
System.out.println(key);
}
}
return new Person();
}
public static void main(String[] args) {
System.out.println(get(123));
}
}
3.4匿名内部类