一、内部类的概念:
1.将一个类定义在另一个类的里面,对里面那个类就称为内部类,或者叫做内置类,嵌套类。
2.访问特点:内部类可以直接访问外部类中的成员,包括成员变量和成员方法,也包括私有成员;而外部类要访问内部类中的成员必须要建立内部类的的对象:代码体现如下:
class InnerclassDemo
{
public static void main(String[] args)
{
Outer ou=new Outer();
ou.method();
}
}
class Outer
{
private int age=25;
class Inner
{
int age=19;
void show()
{
System.out.println("age="+Outer.this.age);//直接访问内部类中成员
//如果本类中有局部变量,就访问本类,如果没有就访问父类中
//成员变量,因为有一条默认语句Outer.this.age
}
}
void method()
{
System.out.println("Outer method");3
Inner in=new Inner();//建立内部类对象,访问内部类方法
in.show();
Outer.Inner in=new Outer().new Inner();
in.show();//直接访问内部类的方法
}
}
二、内部类的位置
1、成员变量位置上,那么可以被private static成员修饰符修饰,具体功能属性等可以参考成员变量。而且被static修饰后的内部类只能访问外部类中的静态变量,就是你是静态的,你只能访问静态的,因为静态的是随着类的加载而被加载的,而非静态的是随着对象的建立而被封装的,所以它优先于静态而存在。
static:访问受到限制:
private:将内部类封装在了外部类中,不能为外部其他类之间访问
如果没有私有化,外部类可以直接访问到内部类,格式如下:
外部类名、内部类名变量名=外部类对象、内部类对象;
Outer.Inner in=new Outer().new Inner();
外部类直接访问静态内部类中的非静态成员:
new Outer.Inner.function();注意创建的是内部类的对象
外部类直接访问静态内部类中的静态变量:
Outer.Inner.function();可以直接用类名访问静态成员;
注意:该内部类中的成员是静态的,那么类也应该是静态的。
如果外部类静态成员访问该内部类成员时,内部类必须是静态的,否则无法访问;
2.在局部位置上,可以直接访问外部类中的成员,同时可以访问所有局部中的局部变量,但必须是被final修饰的,具体代码如下:
class InnerDemo
{
public static void main(String[] args)
{
Outer ou=new Outer();
ou.show();
}
}
class Outer
{
private int age;
public void show()
{
class Inner
{
final int num=9;
void method(){
System.out.println("num="+num);
}
}
new Inner().method();
}
}
//程序执行过程:首先main主函数、外部类Outer()构造方法,创建一个对象,将地址给引用ou,然后该对象调用Outer中的方法show();然后程序执行show(),内部类创建了一个对象,然后调用里面的method()方法,然后method()方法用调用被final修饰的局部变量。
也可以向show(final int a)传递一个final类型的参数,一样打印,因为都是局部变量:
3.匿名内部类,其实就是一种简写形式,它的前提是内部类必须继承一个其他外部父类或者接口,它是一个带内容的对象。代码体现如下:
class InnerclassDemo1
{
public static void main(String[] args)
{
Outer ou=new Outer();
ou.method();
}
}
abstract class Abs
{
abstract void show();
abstract void abs();
}
class Outer
{
private int age;
public void method()
{
Abs b=new Abs()
{
int num=9;
void show()
{
System.out.println("show1");
}
void abs()
{
System.out.println("abs 1");
}
};//这是一个带内容的匿名对象,使用父类的名称创建。
b.show();//自己在创建对象的同时又重写了父类中的内容,然后自己再调用
b.abs();
}
}