杂谈:权限修饰符,匿名内部类....

权限修饰符

JAVA中有四种权限修饰符:public,protected,(default),private。

四种权限修饰符权限大小:public > protected > (default) > private

注意:(default)代表什么也不加,例:class person。

权限修饰符在不同范围的权限

public protected (default) private
同一个类 Yes Yes Yes Yes
同一个包 Yes Yes Yes No
不同包子类 Yes Yes No No
不同包非子类 Yes No No No

内部类

如果一个事物内部包含另一个事物,那么这就是一个类包含另一个类。

如:身体和心脏的关系,汽车和发动机的关系

分类:

  1. 成员内部类
  2. 局部内部类(其中包含匿名内部类)

成员内部类

成员内部类的定义格式:

修饰符 class 外部类名称{
    修饰符 class 内部类名称{
        ....
    }
    .....
}

注意:内用外,可以随意访问;外用内,需要借助内部类对象。

如何使用成员内部类?

  1. 间接方式:在外部类的成员方法中,使用内部类,然后main只是调用外部类的方法。

  2. 直接方式:公式

外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称();

注意:内部类访问重名的外部类成员变量:外部类名称.this.成员变量名称


局部内部类(匿名内部类)

如果一个类定义在一个方法内部,那么这就是一个局部内部类。

“局部”:只有当前所属的方法能使用它,出了这个方法外面就不能用了。

定义格式:

修饰符 class 外部类名称 {
    修饰符 返回值类型 外部类方法名称(参数列表) {
        class 局部内部类名称 {
            ....
        }
    }
    .....
}

定义一个类的时候,权限修饰符规则:

  1. 外部类:public/(default)
  2. 成员内部类:public/protected/(default)/private
  3. 局部内部类:什么也不写

局部内部类:如果希望访问所在方法的局部变量,那么这个局部变量必须是有效final的

备注:从java8开始,只要局部变量事实不变,那么final关键字可以省略。

原因:

  1. new出来的对象在堆内存当中。
  2. 局部变量跟着方法走,在栈内存当中。
  3. 方法运行结束之后,立刻出栈,局部变量就会消失。
  4. 但是new出来的对象会在堆当中持续存在,直到垃圾回收消失。

匿名内部类

匿名内部类也是一种局部内部类。

如果接口的实现类(或者是父类的子类)只需使用唯一的一次, 那么这种情况下就可以省略掉这类的定义,而改为使用匿名内部类

匿名内部类的定义格式:

接口名称 对象名 = new 接口名称() {
    //覆盖重写所有抽象方法
}

注意:匿名内部类,在创建对象的时候,只能使用唯一一次。

如果希望多次创建对象,而且类的内容一样的话,那么就必须使用单独定义的实现类了。


以上就是关于内部类的一些简要描述,如需知道更多请自己查询。

  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!

请我喝杯咖啡吧~

支付宝
微信