内部类的概念:在一个类中再定义一个类,那么这个类就称为内部类
在一个类中使用内部类,可以在内部类中直接存取其所在类的私有成员变量;
内部类分为成员内部类、局部内部类、匿名内部类;下面我们来介绍:
成员内部类:
成员内部类的语法:
public class OuterClass{//外部类
public class InnerClass{//内部类
}}
在内部类中可以随意的使用外部类的成员方法和成员变量,哪怕它被修饰了private;
内部类的实例一定要绑定在外部类的实例上,如果从外部类中初始化一个内部类对象,那么内部类对象就会绑定在外部类对象上,内部类的初始化方法与其他类的初始化相同,使用New关键字。内部类可以访问其他外部类成员,但内部类的成员只有在内部类的范围内是可知的,不能被外部类使用。
public class OuterClass{
/*
修饰符为private的成员变量
*/
privste int i=0;
private void g(){}
//内部类
class InnerClass{
void f(){
//修饰符为private的类成员可以在内部类中随意使用
g();
i++;
}}}
内部类中的变量与外部类中的变量可以交互使用;
内部内向上转型为接口:当将一个修饰符为privste的内部类向上转型为其父类对象,或者直接向上转型为一个接口,在程序中可以完全隐藏内部类的具体实现过程。向外部提供一个接口,在接口中声明一个方法,如果实现该接口的内部类中实现该接口的方法,就可以定义多个内部类以不同的方法实现接口中的同一个方法;
使用this关键字获取内部类与外部类的引用:
实现具体代码如下:
public class C{
private x;
private class inner{
private x=9;
public void Doit(int x){
x++;//调用的是形参x
this.x++;//调用的是内部类的x;
C。this.x++;//调用的是外部类的x;
}}}
局部内部类:
内部类不仅可以在类中进行定义,也可以在类中的局部位置进行定义,如在类的方法或者任意的作用域中,都可以成为是内部类;
局部内部类实现代码如下:
interface Outin{}//定义一个接口
class outin1{
public Outin doit(final String x){//形参为final类型
class innerClass implements Outin{//在doit()方法中定义一个内部类
innerClass(String s){s=x;System.out.print(s);}}
return new Outin("doit");}}
匿名内部类:
实现代码:
public class S{
public S(){
new x(){//方法};}}//声明匿名内部类
静态内部类:将内部类修饰为static,就i是静态内部类了;
内部类的继承:比普通类的继承要复杂;
实现代码如下:
class ClassA{class ClassB}
public class OutputInputClass extends ClassA.ClassB{//继承内部类B
public OutputInputClass(ClassA a){
a.super();}}
继承内部类时,必须要给该类的构造方法一个参数,该类的构造方法是要继承的内部类的外部类的引用,同时用参数调用super()方法,才能完成继承。