概念
如果一个事物的内部包含另外一个事物,那么这就是一个类内部 包含另一个类。
例如:身体很心脏的关系,又如,汽车和发动机的关系。
分类:
1、成员内部类
2、局部内部类
1、成员内部类
—在外部类中直接定义内部类,格式为类的正常格式
public class Body { // 外部类
public class Heart {
public void MethodInner () { // 内部类
System.out.println(“内部类”);
}
}
}
—使用方法
(1)间接调用,通过外部类的方法进行调用内部类
public void Method () {
System.out.println("外部类");
new Heart().MethodInner();
}
(2)直接调用
外部类名称.内部类名称 对象名称 = new 外部类名称().new 内部类名称();
Body.Heart heart = new Body().new Heart();
内部类与外部类成员变量名重名问题
public class Outer {
int num = 30;
public class inner {
int num = 20;
public void Method () {
int num =10;
System.out.println(num); // 就近原则,使用内部变量
System.out.println(this.num); // 内部类的成员变量
System.out.println(Outer.this.num); // 外部类的成员变量
}
}
}
2、局部内部类
如果一个类是定义在一个方法内部的,那么这就是一个局部内部类。
局部内部类,只能当前所属的方法才能使用,出了这个方法,外面就不能使用了。
定义格式为一般类没有修饰符的格式
public class localOuter {
public void Method () {
class localInner {
int num = 10;
public void MethodInner () {
System.out.println(num);
}
}
localInner inner = new localInner();
inner.MethodInner();
}
}
局部内部类,如果希望访问所在方法的局部变量,那么这个局部变量必须是**【有效final】**
类的权限修饰符
public > protected > (default) > private
定义一个类的时候,权限修饰符规则:
1、外部类:public / (default)
2、成员内部类: public / protected / (default) /private
3、局部内部类:什么都不能写
匿名内部类
–如果接口实现类(或者是父类的子类)只需要使用一次。
那么这种情况下就可以省略该类的定义,而改为使用【匿名内部类】。
匿名内部类的格式:
接口名称 对象名 = new 接口名称 (){
// 覆盖重写所有的抽象方法
};
MyInterface obj = new MyInterface() {
@Override
public void Method() {
System.out.println("匿名内部类");
}
};
obj.Method();
匿名内部类的注意事项:
1、匿名内部类,在创建对象的时候,只能使用唯一一次。
如果希望多次创建对象,而且内容一样的话,那么必须使用单独定义的实现类了。
2、匿名对象,在调用方法的时候,只能调用唯一一次。
如果希望同一个对象,调用多次方法,那么必须给对象起个名字。
3、匿名内部类是省略了【实现类/实现子类】,但是匿名对象时省略了【对象名称】
强调:匿名内部类和匿名对象不是一回事。