一、有名内部类
1、定义方法
如图、在Example类中定义了一个Test类,此时Test称为有名内部类(因为该内部类有其名字),Example为其外部类
2、作用
内部类可以定义在类中的任何位置:
一、当定义在成员变量的位置上:
此时该内部类可以使用权限修饰符:public~private
二、当定义在局部变量的位置上:
此时该类不可以使用修饰符修饰;
三、当类定义在含有局部变量的方法中:
在JDK.8以下的版本要在形参中添加final修饰
三、调用方法
在定义的非静态有名内部类在静态方法中使用时;必须得创建对象进行调用:
public class Example {
class Eat{//不可以直接在main方法中使用 必须创建对象
void sleep() {
}
}
public static void main(String[] args) {
Eat eat= new Example().new Eat();
}
可以看出想要必须创建Example对象才可以创建Eat对象
二、匿名内部类
1、定义方法
Example example =new Example() {
public void eat() {
System.out.println("正在吃东西");
}
};
此处定义的new Example();括号后面的部分相当于创建了一个子类(上转型对象),其中可以对父类方法进行重写而进行使用:
2、作用
一、定义在普通类
二、定义在抽象类
三、定义在接口类
3、使用方法
一、在定义抽象类的内部类时必须全部实现其抽象方法,否则不可创建对象;
二、可以在匿名内部类中添加新的属性和方法,但是这些属性和方法不能被上转型对象所调用,只能被非上转型对象方式创建的匿名内部类对象所调用
public class Test {
public void eat() {
System.out.println("吃");
}
public static void main(String[] args) {
Test test= new Test() {
@Override
public void eat() {
System.out.println("喝");
}
int age=0;
}.age=11;
System.out.println(test.age);
}
此时的test的新定义的属性是不可以被上转型使用的、要是想要调用,就需要在创建的对象后面使用.新属性
三、创建内部类时在Workplace
1、内部类创建新文件
在创建内部类的时候,会在自己的eclipse的工作区中自定生成带有$(dollar)文件,匿名类使用的是1,2.3代替其类名: