zoukankan      html  css  js  c++  java
  • 内部类详解

    所谓内部类就是在类的内部进行其他类结构的嵌套操作。如下代码就是一个内部类最简单的定义。

    public class Outter{
    
        private String msg = "DEW";
        
        class Inner{
            //如果给该类加上private修饰符修饰的话,那么Inner类只能在Outter类中使用
            public void print(){
                System.out.println(msg);
            }
        }
        
        public void test(){
            Inner in = new Inner();
            in.print();
        }
    
    }
    定义内部类后造成类结构复杂,最大优点在于内部类可以直接访问外部类私有域

    为什么要有内部类呢?

    1.定义内部类的原因(优点)
    a.内部类可以访问外部类所有数据,包含被private封装的数据
    b.内部类可以对外部类之外的类进行隐藏,使用内部类也是封装的一种(人和肾)
    c.使用内部类可以实现多继承概念
    2.内部类与外部类关系
    a.对于非静态的内部类来说,内部类的创建需要依赖外部类的对象,在没有外部类实例之前无法创建内部类对象
    b.内部类是一个相对独立的个体,与外部类不是is-a关系,仅仅是包在外部类内部而已
    c.内部类可以直接访问外部类的元素(包含私有域),外部类可以间接访问内部类的所有元素(包含私有域)
    即:内外部类可以访问彼此的私有属性(内部类直接访问,外部类通过对象间接访问)
    3.内部类的分类:
    3.1成员内部类(不加static修饰符定义的) —— 类比普通方法
    静态内部类与普通外部类没有什么区别,仅仅是定义在一个类的内部
    a.成员内部类依赖外部类对象,先创建外部类对象后再创建成员内部类对象
    b.成员内部类不能拥有静态属性和方法,但可以访问外部类的静态域
    声明并创建成员内部类语法:
    I.在外部类内部创建成员内部类对象就和创建普通类一模一样
    II.在外部类外部创建成员内部类对象:(前提是内部类没有被private封装)
    外部类.内部类 对象名 = 外部类对象.new 内部类() ;
    Outter.Inner in = new Outter().new Inner()
    3.2.静态内部类(定义在类中,使用static修饰符) —— 类比静态方法
    a.静态内部类的创建不需要依赖外部类对象,可以直接创建
    b.在外部类外部创建静态内部类语法:
    外部类.内部类 内部类引用 = new 外部类.内部类()
    Outter.Inner in = new Outter.Inner()
    c.静态内部类可以拥有普通属性,但是不能访问外部类的普通属性
    3.3.方法内部类——方法中的局部变量
    定义:定义在外部类方法中的类
    a.方法内部类不允许使用访问权限修饰符
    b.方法内部类对外部完全隐藏,除了创建类的方法可以访问外,其余均不能访问
    c.方法内部类要想使用方法的形参,该形参必须使用final声明(JDK8之后变为隐式的final声明)
    这块可以在方法内部类中对该形参重新赋值可以看出。
    public class InnerClass {
        public static Object get(int key){
            class Person{
                public Person(){
                    System.out.println(key);
                }
            }
            return new Person();
        }
        public static void main(String[] args) {
            System.out.println(get(123));
        }
    }
    3.4匿名内部类

  • 相关阅读:
    python-----贴图 和 报错:OSError: image file is truncated (8 bytes not processed)的处理
    springboot集成RabbitMQ
    MySQL数据库设计规范
    腾讯云COS对象存储
    腾讯云OCR图片文字识别
    java基础之 java注释
    centos7下自动备份mysql数据库
    nginx配置ssl证书
    java基础之 控制语句
    js -- 操作sqlite数据库
  • 原文地址:https://www.cnblogs.com/du001011/p/14274504.html
Copyright © 2011-2022 走看看