zoukankan      html  css  js  c++  java
  • 内部类、匿名类

    内部类即类或者方法内定义的类,根据位置的不同可分为成员内部类、局部内部类

    成员内部类

    定义于类中

    Class A{
      //这里B就是成员内部类   Class B{   } }

    如何访问成员内部类?

    格式: 外部类名.内部类名 对象名= 外部对象.内部对象

    这里即: A.B b= new A().B()

    实际使用中常将内部类设为私有,通过外部类来间接调用/访问内部类的方法和变量。

    Class A{
      Private Class B{
        public void show(){
          System.out.println("B");
        }
      }
    //间接
    public void visitB(){ B b= new B(); b.show(); } } public class aaa { public static void main(String[]args) { A a=new A(); a.visitB(); } }

    当成员内部类为静态

    注意: 静态成员内部类访问访问外部类成员时,只能访问静态成员(方法和变量)

    关于内部类与外部有同名变量时的访问问题

    class Outer {
        public int num = 10;
        class Inner {
            public int num = 20;
            public void show() {
                int num = 30;
                //三个变量对应的变量名相同
                //访问的是本方法中的num变量,满足就近原则
                System.out.println(num);
                //通过this变量,访问方法外,本类中的变量,this代表Inner类对象
                //这里Inner.this同this            
    System.out.println(this.num); //通过外部类名加this,返回外部类对象,访问对象外部类的num System.out.println(Outer.this.num); } } } public class niming { public static void main(String[]args) { Outer.Inner inner=new Outer().new Inner(); inner.show(); } }

    ------------------------------------------------------------------------------------------------------------------------------------------------

    局部内部类

    定义于方法或作用域中的类

    备注: 局部内部类当然也是处于某个类或接口中,因为方法得处于类或接口中。

    特性: 局部内部类可访问final或static类型的外部类成员

    详情可见: https://blog.csdn.net/u014745069/article/details/80210288

    ------------------------------------------------------------------------------------------------------------------------------------------------

    另外,与定义位置无关,有种特殊的内部类,称为:

    匿名内部类

    定义: 继承了某个类或实现了某接口的匿名类,用 new 类名 或 new 接口名 的格式创建

    备注: 我们创建匿名类的同时也创建了一个匿名类实例,不需要class关键字。

    特性: 

    1.  匿名类不能是abstract

    2. 匿名类隐式final

    3. 匿名类不能是static

    eg: 

    A hello = new A() {  
        public void run() {  
            System.out.println("hello");  
        }  
    };

    个人理解:本质上就是创建A的实例并覆盖、实现其中的方法

    访问权限:

    1. 访问外层Class里面的字段。
    2. 不能访问外层方法中的本地变量。除非变量是final。
    3. 如果内部类的名称和外面能访问的名称相同,则会把名称覆盖掉。
    4. 不能定义静态初始化代码块
    5. 不能在匿名类里面定义接口
    6. 不能在匿名类中定义构造函数

  • 相关阅读:
    Android 权限表
    自己动手写shell命令之write
    libgdx 1.4.1公布
    【JUnit4.10源码分析】5.2 Rule
    TCP协议具体解释(上)
    关于 二维码 与 NFC 之间的出身贫贱说
    Effective C++ Item 42 了解 typename 的双重意义
    C++第12周(春)项目2
    HDU 2256 Problem of Precision(矩阵高速幂)
    【OC语法快览】二、存取方法
  • 原文地址:https://www.cnblogs.com/yanze/p/9680118.html
Copyright © 2011-2022 走看看