Inner — 内部 Exterior — 外部 part — 局部
注意:不管是成员内部类 局部内部类 匿名性局部内部类 都可以在定义类时继承任何一个接口 普通类 抽象类,并且规则不变.
内部类分为二种
一/ 成员内部类
格式: 修饰符 class 类名 {
修饰符 class 成员内部类名 {
//类体
}
}
例如:public class InnerClass {
public class Inner {
int a = 12;
}
}
规则:1/内部类随意用外部类,外部类则不能直接访问内部类.
2/如若要用到该内部类的话,有二种方式,一个为’间接方式’,一个为’直接方式’.
{间接方式]: 直接方式的话,则需要在外部类中建立一个方法,再在方法中创建一个指向给内部类的对象.接着通过Main主方法来new这个外部类的方法对象,
通过这个外部类的方法对象,间接访问内部类.
{直接方式}: 直接在main方法类中以创建对象的形式直接引用
格式:外部类名称.内部类名称 自定义对象名 = new 外部类名称().new 内部类名称();
然后以 对象名.方法名(); / 对象名.成员变量名 的格式调用
列如:InnerClass.Inner a = new InnerClass().new Inner();
a.InnerMethod();
3/在变量名不重复的情况下,内部类可以直接使用外部类的成员变量.
4/但是,假如外部类的成员变量同内部类方法内的变量,或者是内部类的成员变量重名,则以’外部类名.this.外部类成员变量名;'的形式访问.
二/ 局部内部类
意味:定义在方法内部的类,称之为局部内部类
格式:修饰符 class 类名{
修饰符 返回值类型 方法名(){
class 类名{
//类体
}
}
}
例如:public class InneClass {
public void part(){ //用于容纳局部内部类的方法
class partClass{ //新建的局部内部类.该类建立在方法之内.
}
}
}
规则:1/ 只有含有局部内部类的方法才能够调用局部内部类,因此我们不能像访问成员内部类一样访问直接访问它.
2/ 要访问时需要在局部内部类所属的方法内创建一个指向该类的对象,并写出通过对象需要实现的代码(比如通过这个对象访问该类的成员变量,那么就写在这),
然后在main方法类中通过外部类对象来间接访问(格式:外部类对象名.含有局部内部类的方法名()😉
3/ 如果要访问局部内部类所在方法中(容纳局部内部类的方法)的成员变量, 那么对于这个成员变量来说,仅可以赋值一次.后续代码中如果再次赋值则报错.效果相当于final
为保险起见,推荐在该成员变量前添加final的权限修饰符;
正确形式1 :
public void MethodOfPartClass(){
int partMethodVariable = 10001;//√√√√√√
class partClass{
System.out.println(partMethodVariable);
}
}
正确形式2 :
public void MethodOfPartClass(){
final int partMethodVariable = 10001;//√√√√√√
class partClass{
System.out.println(partMethodVariable);
}
}
错误形式 ×:
public void MethodOfPartClass(){
int partMethodVariable = 10001;
partMethodVariable = 102;//×××××
class partClass{
System.out.println(partMethodVariable);
}
}
三/ 局部内部类之[匿名内部类] (非常重要)
意义:在对于某个接口或某个类,只需实现(调用)一次的情况下,那么就可以考虑直接在Main主方法中使用’匿名内部类’.
'匿名内部类’在这个时候的作用就是为了避免’仅仅调用一次.便需要特意新建实现类/子类’的情况,能够给开发者节省很多时间,也能对项目包起到优化作用.
1/ 以全名对象创建匿名内部类
格式: 接口/类名称 自定义对象名 = new 接口/类名称(){
//覆盖重写接口/类的所有抽象方法(假如自身也是抽象类则自然也不需要),如同实现类那样.
};
例如: Interface ObjOfAnonymouseClass = new Interface(){
@Override
public void InterfaceMethodAbs(){
//方法体
}
};
2/ 以匿名对象创建创建匿名内部类
格式: new 接口/类名称 {
//覆盖重写接口/类的所有抽象方法(假如自身也是抽象类则自然也不需要),如同实现类那样.
}.要调用的方法名或成员变量;
列如: new ObjOfAnonymouseClass() {
@Override
public void InterfaceMethodAbs(){
//方法体
}
}.InterfaceMethodAbs();
规则:1/ 多考虑使用它的实际意义,用途推荐用于仅使用一次接口或类的时候用,否则就失去了匿名内部类的意义.
2/ 假如以创建匿名对象的形式指向匿名内部类,那么需要在大括号的后面"]“加上以”.方法名()/成员变量名"的形式调用
3/ 匿名对象介于其特性,在创建的大括号也仅仅只能调用一个方法或成员变量.
比如可以是"new AnonymouseClass(){}.methodA;" 或者"new AnonymouseClass(){}.methodB;" 但不可以是"new AnonymouseClass(){}.methodA.methodB;"
4/ 如果想要多次通过对象使用该匿名内部类,则匿名对象失去意义,需要通过创建全名对象类使用匿名内部类.
三/ 定义类权限的规则
定义’外部类’ ‘成员内部类’ '局部内部类’三者时,可以修饰的权限符各有不同.
外部类: public / (default)
成员内部类:public / protected / (default) / private
局部内部类:NO!全部不支持!(效果同default也不同)