内部类
什么是内部类?
内部类是类中的成员,是一个在类中定义的类,称为内部类
例如:如果在类 Outer 的内部再定义一个类 Inner,此时类 Inner 就称为内部类 (或称为嵌套类),而类 Outer 则称为外部类(或称为宿主类)。
内部类的分类
成员内部类
成员内部类——就是位于外部类成员位置的类 特点:可以使用外部类中所有的成员变量和成员方法(包括private的),并且可以用任意权限修饰符进行修饰
public class Outer {
int num=10;
static int num1=10;
//成员内部类,可以用权限修饰符修饰
private class Inner{
public void print(){
System.out.println(num);//成员内部类中可以调用外部类的成员
}
}
//利用get方法获取成员的内部类
public Inner getInner(){
return new Inner();
}
public static void main(String[] args) {
Outer outer=new Outer();
Outer.Inner inner=outer.getInner();//无法直接访问Inner类,故使用内部类类型的对象引用去指向内部类对象
inner.print();
}
}
静态内部类
这种被 static 所修饰的内部类,按位置分属于成员内部类,但也可以称作静态内部类,也常叫做嵌套内部类.不能使用外部类的非static成员变量和成员方法
public class Outer {
static int num1=10;
//静态内部类
static class Inner2{
public void print(){
System.out.println(num1);//静态内部类中只允许访问静态成员
}
}
public static void main(String[] args) {
new Outer.Inner2().print();
}
}
局部内部类
局部内部类——就是定义在一个方法或者一个作用域里面的类 特点:主要是作用域发生了变化,只能在自身所在方法和属性中被使用
class Outer {
private int age = 20;
public void method() {
final int age2 = 30;
class Inner {
public void show() {
System.out.println(age);
//从内部类中访问方法内变量age2,需要将变量声明为最终类型。
System.out.println(age2);
}
}
Inner i = new Inner();
匿名内部类
即没有定义名称的内部类,是内部类的简化写法
在Arrays类中的sort方法以及ArrayList类中sort方法,还有添加监听器,都可以使用匿名内部类实现
JButton jb=new JButton("登录");
//匿名内部类,成员内部类的简化形式,不用去直接去创建内部类,如果只是临时的需要内部类对象可以使用这种方式
jb.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
System.out.println("鼠标点击");
}
});
内部类的特点
内部类是类中的一个成员可以访问类中的成员无论是私有还是公共的
静态内部类只能访问类中静态成员
内部类也是一个类文件,在编译的时候也会产生一个.java文件,但是文件名是由外部类类名+$+内部类类名构成的
内部类的意义
内部类的意义
1.封装型
内部类无法在其他类中直接被调用,只能在外部类中自己内部调用,我们可以对内部类的访问权限做出限制来对外界隐藏一些操作与方法
2.实现多继承
java中的继承机制是单继承,这样做既有好处也有坏处,好处是可以避免多继承中的钻石继承结构问题,坏处是继承是单一的有些特殊情况难以实现,而内部类可以在类的内部去继承其他类,达到多继承的目的
多继承问题的实现