Day10 Java内部类中 成员内部类 局部内部类 局部匿名内部类 三种内部类的定义规则和访问规则

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也不同)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值