------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
一、内部类定义
将一个类定义在另一个类的里面,对里面那个类就称为内部类(内置类,嵌套类)。内部类的出现再次打破了java单继承的局限性。
二、访问特点
1、内部类可以直接访问外部类中的成员,包括私有成员。//外部类名.this
2、而外部类要访问内部类中的成员必须要建立内部类的对象。
class Outer
{
private static int num = 31;
class Inner// 内部类。
{
void show()
{
System.out.println("show run..."+num);
}
/*static void function()//如果内部类中定义了静态成员,该内部类也必须是静态的。
{
System.out.println("function run ...."+num);
}
*/
}
public void method()
{
Inner in = new Inner();
in.show();
}
}
class InnerClassDemo
{
public static void main(String[] args)
{
// Outer out = new Outer();
// out.method();
//直接访问外部类中的内部类中的成员。
// Outer.Inner in = new Outer().new Inner();
// in.show();
//如果内部类是静态的。 相当于一个外部类
// Outer.Inner in = new Outer.Inner();
// in.show();
//如果内部类是静态的,成员是静态的。
// Outer.Inner.function();
}
}
//内部类直接访问外部类
class Outer
{
int num = 3;
class Inner
{
int num = 4;
void show()
{
int num = 5;
System.out.println(Outer.this.num);
}
}
void method()
{
new Inner().show();
}
}
class InnerClassDemo2
{
public static void main(String[] args)
{
new Outer().method();
}
}
三、内部类分类
1、成员内部类:
成员内部类,在一个外部类中有成员变量,和成员方法,那么成员内部类就是把整个一个类当成了外部类的成员,可用的修饰符有:final、abstract、public、private、protected和static等。一旦用static修饰内部类,它就变成静态内部类了,相当于外部类。
2、静态内部类:
静态内部类就是给成员内部类加上static这个修饰符
3、局部内部类
局部内部类就是定义在方法中的类
注:方法内部类只能在定义该内部类的方法内实例化,不可以在此方法外对其实例化;方法内部类对象不能使用该内部类所在方法的非final局部变量;于修饰方法内部类的只有final和abstract;在静态方法内的内部类只能访问外部类的静态成员。
class Outer
{
int num = 3;
Object method()
{
final int x = 9;
class Inner
{
public String toString()
{
return "show ..."+x;
}
}
Object in = new Inner();
return in;//0x0045
// in.show();
}
}
class InnerClassDemo3
{
public static void main(String[] args)
{
Outer out = new Outer();
Object obj = out.method();
System.out.println(obj);
}
}
4、匿名内部类
前提:内部类可以继承或实现一个外部类或者接口。
格式为:new 外部类名或者接口名(){覆盖类或者接口中的代码,(也可以自定义内容)}
简单理解:就是建立一个带内容的外部类或者接口的子类匿名对象
abstract class Demo
{
abstract void show();
}
class Outer
{
int num = 4;
/*
class Inner extends Demo
{
void show()
{
System.out.println("show ..."+num);
}
}
*/
public void method()
{
//new Inner().show();
new Demo()//匿名内部类。
{
void show()
{
System.out.println("show ........"+num);
}
}.show();
}
}
class InnerClassDemo4
{
public static void main(String[] args)
{
new Outer().method();
}
}
四、内部类共性
内部类仍然是一个独立的类,在编译之后会内部类会被编译成独立的.class文件,但是前面冠以外部类的类命和$符号;内部类不能用普通的方式访问。内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,无论是否是private的。