zoukankan      html  css  js  c++  java
  • Java基础——内部类

    内部类

    我们学习类与对象后,知道了类的定义和使用
    也知道抽象类以及包装器类的用法
    类中除了定义成员属性和成员方法外
    还能添加内部类

    概述

    内部类(内置类)(嵌套类):定义在另一个类中的类。

    特点

    1. 内部类是编译时的语法,编译后生成两个独立的类。
    2. 内部类可以访问外部类的任何成员。
    3. 外部类不能直接访问内部类的成员。
    4. 内部类可以为静态,privateprotected修饰,外部类只能用publicdefault缺省的包访问。
    5. 用内部类定义在外部类不可访问的属性,实现必外部类的private更小的访问权限。

    类别

    • 成员内部类
    • 局部内部类
    • 匿名内部类
    • 静态内部类

    成员内部类

    作为外部类的成员存在,与外部类的属性、方法并列。

    class OutClass{
          //成员属性
          private int i;
          //成员方法
          void print(){
                System.out.println("外部类");
          }
    
          //内部类
          class Inner{
          }
    }
    

    创建对象

    • 在外部类的内部。
      • Inner i = new Inner();
    • 在外部类的外部。
      1. 建立一个外部类对象
      2. 生成一个内部类对象

    访问

    • 在内部类中访问内部类变量。
      • 内部类.this.属性;
    • 访问外部类成员
      • 外部类名.this.属性
    • 在外部类的外部访问内部类
      • 内部类对象.对象名

    局部内部类

    在方法中定义的内部类为局部内部类。
    局部内部类不能加修饰符privatepublicprotected

    class OutClass{
          //外包方法
          public void print(){
                System.out.println("外部类方法");
          
                //局部内部类
                class Inner{
                      //局部内部类方法
                      public void method(){
    
                      }
                }
                //创建局部内部类对象
                Inner in = new Inner();
                //调用局部内部类方法
                in.method();
          }
    }
    

    特点

    1. 局部内部类可以访问外包方法之外的外部类的所以成员
    2. 局部内部类可以该访问外包方法的参数
    3. 局部内部类只能访问局部中被final修饰的局部变量
    4. 局部内部类不能声明为接口

    使用

    使用局部内部类时,需要

    1. 生成外部类对象
    2. 通过外部类对象调用外包方法;在方法中才能调用局部内部类

    匿名内部类

    匿名内部类是局部内部类的使用扩展
    只创建类的一个对象,不用对内部类命名。

    interface anonymous{
          void print();
    }
    
    class{
          public void print(){
                System.out.println("外部类方法");
                //匿名内部类
                anonymous an = new anonymous(){
                      //局部内部类方法
                      public void method(){
    
                      }
                };
                an.method();
          }
    }
    

    特点

    1. 匿名类没有类名,必须继承一个类或实现一个接口。不能有显式的extendsimplements
    2. 匿名类不能有构造方法,没有匿名。可通过 new 父类名();创建对象
    3. 匿名类的创建和定义同时进行
    4. 匿名类只能一次性的创建对象
    5. 匿名类可以在方法体中,可以在参数列表中
    6. 匿名内部类不能是抽象类。
    7. 匿名内部类必须实现它的抽象父类或者接口里的所有抽象方法
    8. 匿名内部类一定是在new的后面,其隐含实现一个接口或一个类,没有类名

    静态内部类

    静态内部类定义在类中,在方法之外。static修饰

    class OutClass{
          public void print(){
                System.out.println("外部类方法");
          }
    
    
          //静态内部类
          protected static class Inner{
                
          }
    }
    

    使用

    静态内部类的对象可以直接生成

    public class Demo{
          public static void main(String args[]){
                OutClass.Inner inner = new OutClass.Inner();
          }
    }
    

    特点

    1. 静态内部类直接访问外部类的静态成员,不能直接访问外部类的非静态程序
    2. 静态内部类可定义静态成员,其他内部类不行
    3. 内部类有静态成员,其内部类也必须为静态。

    博客相关java项目:查看Github项目
    对应github项目:Inner
    导入项目的方法: Java基础——Java如何导入本地项目

  • 相关阅读:
    Spring 系列目录
    Netty 源码 ChannelHandler(四)编解码技术
    Netty 源码 ChannelHandler(三)概述
    Netty 源码 Channel(二)核心类
    Netty 源码 Channel(二)主要类
    NOIP 2017 PJ
    初学 Size Balanced Tree(bzoj3224 tyvj1728 普通平衡树)
    一文读懂后缀自动机 Suffix_Automata
    完美字符子串 单调队列预处理+DP线段树优化
    棋盘覆盖 状压DP+矩阵快速幂
  • 原文地址:https://www.cnblogs.com/occlive/p/13374764.html
Copyright © 2011-2022 走看看