内部类
- 定义在类里面的类
分析事物时,发现该事物的描述还有事物,且这个事物还在访问被描述事物的内容
内部类编译生成的字节码文件名是 外部类名$内部类名
内部类也可以定义在局部,但是只能访问局部中被final修饰的局部变量
class Outer
{
private int outerNum = 1;
class Inner
{
int num = outerNum;//内部类可以直接访问外部类成员
void innerMethod()//外部类想要访问内部类成员必须先创建内部类对象
{
System.out.println("Inner class"+num);
}
}
void outerMethod()
{
System.out.println("outer class");
}
}
class InnerClass
{
public static void main(String[] args)
{
//直接访问内部内的成员
Outer.Inner c = new Outer().new Inner();//语法格式,必须要内部类所属
c.innerMethod();
//如果内部内是静态的,则相当于外部类,不用创建外部类对象也可以访问
//OuterInner c = new Outer.Inner();
//如果内部类里面有静态方法,那么内部类必须是静态的
//则可以直接访问
//Outer.Inner.innerMethod();
}
}
匿名内部类
必须有继承或是实现一个外部类或者接口
格式:new 父类或者接口名()
{
子类内容
}.调用方法;
1.调用方法可不写,按需求加上
2.;不可以掉,表示一个语句结束
3.new 并不是创建了一个父类或者接口,而是创建了匿名内部类,在{}内具体实现了子类
abstract class Fruit
{
abstract void eat();
}
class FruitShop
{
String fruit = "apple";
//如果没有匿名类,要使用内部类的方法
/*
class Inner extends Fruit
{
void eat()
{
System.out.println(fruit+"水果怎么吃");
}
}
void method()
{
new Inner().eat();
}
*/
//如果使用匿名内部类就方便多了
void method()
{
new Fruit(){//
void eat()
{
System.out.println(fruit+"水果怎么吃");
}
//还可以定义其他方法
}.eat();
}
}
class AnonyInnerClass
{
public static void main(String[] args)
{
new FruitShop().method();
}
}