一,什么是内部类?
将类定义在类中,该类就是类部类.
二,访问权限.
内部类可以直接访问外部类中的成员。
外部类想要访问内部类,需要建立内部类对象。
三,什么时候使用内部类。
有A类和B类,当A类想要直接访问B类中的成员,而B类又需要建立A类的对象来访问A类中的成员。这时,就将A类定义成B类的内部类。
例子:孙悟空和牛魔王老婆
什么时候定义内部类呢?
当分析一个事物时,该事物的内部还有具体的事物,这个具体的事物在使用该事物中的其他成员。
这时就将这个具体的事物用内部类来描述。
比如人体是一个类,人体有心脏,心脏的功能在直接访问人体的其他内容。这时就将心脏定义在人体类中,作为内部类存在。
而且内部类通常都不会直接对外提供,都会封装到外部类中,外部类一般会通过对外提供方法的形式对其进行访问
记住只有内部类定义在成员位置上,才可以有这些成员修饰符。
class Body
{
private class Heart
{
}
public Heart getHeart()
{
if()
return new Heart();
}
}
class Main
{
'''''''''''''
}
四, 内部类使用:在外部使用,必须标示出是哪个类的内部类. 格式:外部类名.内部类名 变量=new 外部类对象.内部类对象
例:Outer.Inner in = new Outer().Inner();
但是一般不会这么用,因为内部类都会被外部类隐藏,通常都是外部类提供方法获取内部类的对象。
这样可以对获取对象可控。通常内部类都会被private私有化。
五,静态的情况:
当内部类中如果有静态成员时,该内部类也必须是静态的。
而静态内部类只能访问外部类中的静态成员。
在执行static内部列方法时,两种情况。
1,内部类静态,但是方法没静态。
该方法需要被对象调用执行。
Outer.Inner in = new Outer.Inner();//产生了一个静态内部类对象。
in.show();
2,内部类静态,而且方法也是静态的。
静态内部类随着类文件的加载就已经存在了,静态方法随着内部类的加载也存在了。
这时是不需要对象的。
Outer.Inner.show();
六,内部类访问外部类成员细节
记住只有内部类定义在成员位置上,才可以有这些成员修饰符。!!!!!
非静态的内部类之所以可以直接访问外部类中的成员,
那是因为内部类中都持有一个外部类对象引用:外部类名.this
静态的内部类之所以可以直接访问外部类中的静态成员,其实持有的是外部类名。
记住只有内部类定义在成员位置上,才可以有这些成员修饰符。
例子:
class Outer
{
int num = 3;
static int num2 = 9;
class Inner
{
//int num = 4;
void show()
{
//int num = 5;
System.out.println(Outer.this.num);
}
}
static class Inner2
{
void function()
{
System.out.println(Outer.num2);
}
}
public static void method2()
{
new Inner2().function();
}
public void method()
{
Inner in = new Inner();
in.show();
}
}
七,内部类定义在局部位置上
记住只有内部类定义在成员位置上,才可以有这些成员修饰符。!!!
局部内部类不能被修饰符修饰
内部类定义局部位置上,只能访问该局部中的被final修饰的常量
例子:
class Outer
{
int num = 4;
class MyIn
{
}
public void method(final int y)
{
final int x = 3;
class Inner
{
void show()
{
System.out.println("show run -"+Outer.this.num);
System.out.println("x="+x);
System.out.println("y="+y);
}
}
new Inner().show();
}
}
class InnerClassDemo4
{
public static void main(String[] args)
{
new Outer().method(5);
}
}
八,匿名内部类
格式:
匿名内部类的格式:
new 父类名或者接口(){里面定义该父类或者接口的子类成员。}
匿名内部类其实就是一个子类匿名对象。这是一个带有内容的对象,这个对象有点胖。
例子:
bstract class AbsDemo
{
abstract void show();
}
class Outer
{
private int num = 4;
/*
class Inner extends AbsDemo
{
void show()
{
System.out.println("num="+num);
}
}
*/
public void method()
{
//new Inner().show();
new AbsDemo()//创建了一个匿名内部类。
{
void show()
{
System.out.println("num==="+num);
}
}.show();
}
}
class NiMingInnerDemo
{
public static void main(String[] args)
{
new Outer().method();
}
}